我正在研究一个新的Asp.Net核心mvc应用程序.我定义了一个带有自定义约束的路由,它从网址设置当前的应用文化.我正在尝试通过创建如下所示的自定义来管理我的应用的本地化IRequestCultureProvider:
public class MyCustomRequestCultureProvider : IRequestCultureProvider
{
public Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
var language= httpContext.GetRouteValue("language");
var result = new ProviderCultureResult(language, language);
return Task.FromResult(result);
}
}
Run Code Online (Sandbox Code Playgroud)
我的MyCustomRequestCultureProvider每个请求都被击中,这没关系.我的问题是在MVC管道中,DetermineProviderCultureResult来自我的提供程序的方法在路由进程之前被命中,所以httpContext.GetRouteValue("language")总是返回null.
在以前版本的MVC中,我有可能通过这样做来通过路由过程手动处理我的URL
var wrapper = new HttpContextWrapper(HttpContext.Current);
var routeData = RouteTable.Routes.GetRouteData(wrapper);
var language = routeData.GetValue("language")
Run Code Online (Sandbox Code Playgroud)
我现在找不到在新的framewrok中做同样事情的方法.此外,我想使用路由数据找出我的langugae,用一些字符串函数分析我的url字符串,以找到语言不是一个选项.
我尝试向我的 asp.net-core 项目添加多语言功能,但 RequestLocalization 中的 .net 3.1 和 5.0 之间存在一些变化,我无法得到我想要的。我为每种语言添加了资源文件,并在我的剃刀页面中使用了资源,它可以工作,但有一个不需要的默认路由错误,我希望我的路由能够对默认文化友好地工作。
这就是我要的,
对于默认文化(土耳其语):
site.com/foo
site.com/foo/bar
site.com/foo/bar/5
Run Code Online (Sandbox Code Playgroud)
对于非默认区域性(英语):
site.com/en/foo
site.com/en/foo/bar
site.com/en/foo/bar/5
Run Code Online (Sandbox Code Playgroud)
我的另一个问题是;我的项目呈现 site.com/foo/foo/bar 这个网址就像 site.com/tr/foo/bar 一样,这是不行的,我想它应该重定向到 404 页面。
我的启动示例代码如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
services.AddLocalization(opts => opts.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo("tr-TR"),
new CultureInfo("en")
};
options.DefaultRequestCulture = new RequestCulture("tr");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
services.AddControllersWithViews();
services.AddRazorPages();
services.AddRouting(options => options.LowercaseUrls = true);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ …Run Code Online (Sandbox Code Playgroud) c# .net-core asp.net-core asp.net-core-localization asp.net-core-5.0
我想创建一个合适的requestCultureProviders来处理来自AspNetCore WebApp中路由的文化,并使用以下路由模板:http // url.domain/{culture}/{controller}/{action}
示例:
我发布了我的第一个脏/草案解决方案.