多语言网站的路由表

本文关键字:路由 网站 语言 | 更新日期: 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.CurrentCultureCultureInfo.CurrentUICulture。然后URL被进一步传递并到达MVC。

话虽如此,也许使用大多数开箱即用的解决方案会让你感觉更好,而且只有在无法实现自己的解决方案的情况下。

有关此主题的更多信息,请点击此处:http://www.jerriepelser.com/blog/how-aspnet5-determines-culture-info-for-localization