Yury Podlevskikh
Yury Podlevskikh

Reputation: 11

How add HttpContext.Current.Request.UserLanguage to the RouteValueDictionary() as default culture

How can I add default culture to the RouteValueDictionary(): r.Defaults.Add("culture", "sv") in this code:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

        foreach(var r in from Route r in routes where !(r.RouteHandler is SingleCultureRouteHandler) select r)
        {
            r.RouteHandler = new MultiCultureRouteHandler();

            r.Url = "{culture}/" + r.Url;

            // Adding default culture
            if(r.Defaults == null)
            {
                r.Defaults = new RouteValueDictionary();
            }
            r.Defaults.Add("culture", "sv");

            // Adding constraint for culture param
            if(r.Constraints == null)
            {
                r.Constraints = new RouteValueDictionary();
            }
            r.Constraints.Add("culture", new UserRouteConstraint("en", "sv"));
        }

This way: r.Defaults.Add("culture", HttpContext.Current.Request.UserLanguages[0].Substring(0, 2)) get this error message: "Request is not available in this context".

Thanks in advance!

Upvotes: 0

Views: 1977

Answers (1)

Yury Podlevskikh
Yury Podlevskikh

Reputation: 11

Great solution is ActionFilterAttribute:

routes.MapRoute(
            name: "culture",
            url: "{culture}/{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            constraints: new { culture = new UserRouteConstraint() }
            );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

and

public class LocalizationAttribute : System.Web.Mvc.ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var culture = filterContext.RouteData.Values["culture"] as string;
        var userLanguage = HttpContext.Current.Request.UserLanguages;

        CultureInfo cultureInfo = new CultureInfo(culture ?? (userLanguage != null ? userLanguage[0].Substring(0, 2) : "sv"));

        Thread.CurrentThread.CurrentUICulture = cultureInfo;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
        base.OnActionExecuting(filterContext);
    }
}

Upvotes: 1

Related Questions