2015-10-07 7 views
1
ВСЕГДА

Я последовал за эту замечательную статью о ASP.NET MVC 5 Интернационализация (refered на asp.net сайте): http://afana.me/post/aspnet-mvc-internationalization.aspxASP.NET MVC 5 Интернационализация - культура по умолчанию

После реализации, у меня есть только одна проблема, которую я не может решить. В MVC5, используя культуру в URL-адресах (не используя куки-файлы), культура всегда по умолчанию, никогда не получая предпочитаемые пользователями языки, отправленные браузером.

Более подробно: Проблемы заключается в том, что defauls для культуры в 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 
    //... 
} 

ответ

0

я обнаружил решение, нужно добавить еще один MapRoute (MVC по умолчанию для корневого сайта доступа), и Coment значения по умолчанию для культуры маршрута, заказ маршрута важен, все работает хорошо сейчас:

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 } 
      ); 
     } 
Смежные вопросы