多语言网站的路由表
本文关键字:路由 网站 语言 | 更新日期: 2023-09-27 18:00:47
我正在尝试制作一个多语言的ASP.NET MVC网站。以下是我需要URL看起来像的方式
www.mysite.com/home
->必须为英文,并调用主控制器的索引操作
www.mysite.com/test
->必须为英语,并调用测试控制器的索引操作
www.mysite.com/es/home
->必须是西班牙语,并调用主控制器的索引操作
www.mysite.com/es/test
->必须是西班牙语,并调用测试控制器的索引操作
这是我的溃败表的样子。我不喜欢的是,同一件事我需要两个条目。
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条记录。
您可能需要使用QueryStringRequestCultureProvider
。在public void Configure(IApplicationBuilder app, ...)
中调用
app.UseRequestLocalization(...);
传递RequestLocalizationOptions.
的实例在此选项实例中,找到现有的QueryStringRequestCultureProvider
实例,并将其QueryStringKey/UIQueryStringKey
属性设置为所需的值。默认值为"区域性"answers"ui区域性"。
如果您不更改值,您的URL将如下所示:
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