ASP.NET MVC 5 国际化 - 文化总是默认的
ASP.NET MVC 5 Internationalization - culture allways default
我关注了这篇关于 ASP.NET MVC 5 国际化的精彩文章(由 asp.net 网站引用):
http://afana.me/post/aspnet-mvc-internationalization.aspx
实施后,我只有一个问题无法解决。
在 MVC5 中,使用 urls 中的文化(不使用 cookie),文化始终是默认的,永远不会获得浏览器发送的用户首选语言。
更详细:
问题是 MapRoute 中文化的默认值,它从站点的默认硬编码文化开始。然后在 BeginExecuteCore 中,RouteData.Values["culture"] 始终填充默认文化,从不从 Request.UserLanguages 获取文化。
RouteData.Values["culture"] 会被填充,即使 url 中不存在文化,例如在第一个站点根访问时。
如何正确改变这种行为?
也许创建 2 条路线,其中一条没有文化?
关联代码:
routes.MapRoute(
name: "Default",
url: "{culture}/{controller}/{action}/{id}",
defaults: new {culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional }
);
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
string cultureName = RouteData.Values["culture"] as string;
// Attempt to read the culture cookie from Request
if (cultureName == null)
cultureName = Request.UserLanguages != null && Request.UserLanguages.Length > 0 ? Request.UserLanguages[0] : null; // obtain it from HTTP header AcceptLanguages
//...
}
我发现了解决方案,需要添加另一个 mapRoute(站点根访问的 mvc 默认值),并注释 culture 路由的默认值,路由顺序很重要,现在一切正常:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//Route order is important! First need to put culture route.
//support for diferent languages/cultures
routes.MapRoute(
name: "CultureEnabled",
url: "{culture}/{controller}/{action}/{id}",
defaults: new { /*culture = CultureHelper.GetDefaultCulture(),*/ controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
我关注了这篇关于 ASP.NET MVC 5 国际化的精彩文章(由 asp.net 网站引用): http://afana.me/post/aspnet-mvc-internationalization.aspx
实施后,我只有一个问题无法解决。 在 MVC5 中,使用 urls 中的文化(不使用 cookie),文化始终是默认的,永远不会获得浏览器发送的用户首选语言。
更详细: 问题是 MapRoute 中文化的默认值,它从站点的默认硬编码文化开始。然后在 BeginExecuteCore 中,RouteData.Values["culture"] 始终填充默认文化,从不从 Request.UserLanguages 获取文化。 RouteData.Values["culture"] 会被填充,即使 url 中不存在文化,例如在第一个站点根访问时。
如何正确改变这种行为?
也许创建 2 条路线,其中一条没有文化?
关联代码:
routes.MapRoute(
name: "Default",
url: "{culture}/{controller}/{action}/{id}",
defaults: new {culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional }
);
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
string cultureName = RouteData.Values["culture"] as string;
// Attempt to read the culture cookie from Request
if (cultureName == null)
cultureName = Request.UserLanguages != null && Request.UserLanguages.Length > 0 ? Request.UserLanguages[0] : null; // obtain it from HTTP header AcceptLanguages
//...
}
我发现了解决方案,需要添加另一个 mapRoute(站点根访问的 mvc 默认值),并注释 culture 路由的默认值,路由顺序很重要,现在一切正常:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//Route order is important! First need to put culture route.
//support for diferent languages/cultures
routes.MapRoute(
name: "CultureEnabled",
url: "{culture}/{controller}/{action}/{id}",
defaults: new { /*culture = CultureHelper.GetDefaultCulture(),*/ controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}