我正在尝试创建一个多语言的ASP.NET MVC站点。 以下是我需要网址的方式
www.mysite.com/home
- >必须是英语并调用家庭控制器的索引操作
www.mysite.com/test
- >必须是英文并调用测试控制器的索引操作
www.mysite.com/es/home
- >必须是西班牙语并调用家庭控制器的索引操作
www.mysite.com/es/test
- >必须是西班牙语并调用测试控制器的索引操作
这是我的溃败表的样子。 我不喜欢的是,我需要为同一件事提供2个条目。
routes.MapRoute(
name: "controller",
url: "{controller}",
defaults: new { lang = "en", controller = "Home", action = "Index" }
);
routes.MapRoute(
name: "multilang-controller",
url: "{lang}/{controller}",
defaults: new { lang = "en", controller = "Home", action = "Index" },
constraints: new { lang = "en|es|de|fr" }
);
我在考虑只有这样的东西
routes.MapRoute(
name: "controller",
url: "{lang}\{controller}",
defaults: new { lang = "en", controller = "Home", action = "Index" },
constraints: new { lang = "en|es|de|fr" }
);
但这不起作用,因为当我致电www.mysite.com/test
时,它会将test
映射到lang
,因为它违反了约束,所以会抛出404。
必须有更优雅的方法来做到这一点,而不是每个案例都有2条记录。
答案 0 :(得分:0)
您可能需要使用QueryStringRequestCultureProvider
。在public void Configure(IApplicationBuilder app, ...)
致电
app.UseRequestLocalization(...);
传递RequestLocalizationOptions.
的实例在此选项实例中找到现有的QueryStringRequestCultureProvider
实例,并将其QueryStringKey/UIQueryStringKey
属性设置为您需要的值。默认值为“文化”和“ui-culture”。
如果您不更改值,您的网址将如下所示:
http://localhost:5000/?culture=fr-FR&ui-culture=fr-BE
但是,如果您需要URL段而不是查询字符串参数,则必须实施您自己的OWIN中间件来处理该场景。
“引擎盖下”会发生什么:提供者检查请求URL的查询部分,如果它包含参数,则设置相应的文化。这有点过于简单了。实际上,被覆盖的DetermineProviderCultureResult()
确定所请求的文化并将ProviderCultureResult
返回到RequestLocalizationMiddleware。在其Invoke()方法中,它接收ProviderCultureResult
并设置CultureInfo.CurrentCulture
和CultureInfo.CurrentUICulture
。然后URL进一步传递并到达MVC。
有了这个说,也许你会感觉更好,使用大多数开箱即用的解决方案,并且只有在没有可用的实现你自己的东西时。
有关此主题的更多信息: http://www.jerriepelser.com/blog/how-aspnet5-determines-culture-info-for-localization