Reputation: 11
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
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