ASP.NET MVC 5 Интернационализация - култура винаги по подразбиране

Проследих тази страхотна статия за интернационализацията на ASP.NET MVC 5 (посочена от сайта на asp.net): http://afana.me/post/aspnet-mvc-internationalization.aspx

След внедряването имам само един проблем, който не мога да разреша. В MVC5, използвайки културата в URL адреси (НЕ използвайки бисквитки), културата винаги е по подразбиране, никога не получава предпочитаните от потребителите езици, изпратени от браузъра.

По-подробно: Проблемът е по подразбиране за култура в MapRoute, която започва с твърдо кодираната по подразбиране култура за сайт. След това в BeginExecuteCore RouteData.Values["culture"] винаги се запълва с културата по подразбиране, като никога не се получава култура от Request.UserLanguages. RouteData.Values["culture"] се попълва дори ако културата не присъства в URL адреса, например при първи root достъп на сайта.

Как правилно да промените това поведение?

Може би създаване на 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
     //...
}

person utilsit    schedule 07.10.2015    source източник


Отговори (1)


Открих решението, трябва да добавя друг mapRoute (mvc по подразбиране за root достъп на сайта) и да коментирам стойността по подразбиране за маршрут на културата, редът на маршрута е важен, сега всичко работи добре:

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 }
            );
        }
person utilsit    schedule 07.10.2015