我们网站的某些区域需要进行身份验证才能访问。
我们的网站可以选择从任何页面中选择用户的首选语言。
由于某种原因,即使重定向到登录页面,即使选择了一种语言,该语言也会被设置为登录页面上的默认语言。
例如,如果用户在索引页面上(允许匿名)并且选择法语作为他们的语言,然后选择进入数据库门户(需要登录),则会将他们带到默认语言登录页面(英语) 。登录后语言正确。
应该发生的是:应该将用户重定向到以其选择的语言显示的登录页面。
如果在登录页面上选择语言时,登录页面将更改语言。
这是登录名的配置:
<authentication mode="Forms">
<forms loginUrl="/Home/Login" />
</authentication>
路由配置:
routes.MapRoute(
name: "Localised",
url: "{language}/{controller}/{action}/{id}",
constraints: new {language = @"(\w{2})|(\w{2}-\w{2})" },
defaults: new {language = "en-GB", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "login",
url: "Home/Login",
defaults: new
{
language = CultureInfo.CurrentCulture.TwoLetterISOLanguageName,
controller = "Home",
action = "Login"
}
);
我正在使用this method进行本地化。
由于某种原因,即使语言是先前设置的,当前的区域性还是默认区域性。
如何配置路由以使用先前选择的区域性?
答案 0 :(得分:0)
我当前的解决方案是在LocalizedControllerActivator.Create
方法中设置会话变量,以存储会话的区域性,然后在登录请求的处理程序中设置“当前区域性”:
public IController Create(RequestContext requestContext, Type controllerType)
{
string lang = requestContext.RouteData.Values["language"] as string ?? _DefaultLanguage;
if (lang != _DefaultLanguage)
{
try
{
Thread.CurrentThread.CurrentCulture =
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
// Store the culture in the session here
requestContext.HttpContext.Session["culture"] = Thread.CurrentThread.CurrentCulture;
}
catch (Exception)
{
throw new NotSupportedException(string.Format("ERROR: Invalid language code '{0}'.", lang));
}
}
return DependencyResolver.Current.GetService(controllerType) as IController;
}
public ActionResult Login(UserLogin user = null, string ReturnUrl = "/")
{
Thread.CurrentThread.CurrentCulture =
Thread.CurrentThread.CurrentUICulture = Session["culture"] as CultureInfo;
//do the rest of the login stuff below
// ...
return View();
}