例如,如果用户将其浏览器设置为fr-CA,但我的网站可以选择以其他可用语言(例如英语)查看页面。如何覆盖accept-language标头,以便可以使用指定的语言重新加载?
我试图简单地更改Accept-Language标头,然后重新加载页面,但是我不确定如何执行此操作。有什么想法吗?
更新:好的,所以我要让人们向我解释什么是本地化,所以我一定不能正确地问这个问题。
我的网站目前在web.config中将全球化设置为auto,因此它将自动将线程区域性设置为应用启动时协商的语言。默认情况下,用户的浏览器将根据浏览器的语言设置发送接受语言标头,就像下面指出的那样,普通用户不知道它们是什么,在哪里或如何更改。无论如何,我们将此默认行为称为浏览器将首先处理语言标头。但是,作为一项功能,我希望允许用户从页面中更改此接受语言标头。例如,在应用程序中,语言设置通常由Cookie或用户首选项(通过配置文件设置)确定,但在着陆/登录页面上(特别是如果这是您首次登录某台计算机),我不知道您是谁,因此只有您的浏览器设置可用。但是,假设您是出差旅行并且正在使用美国计算机访问该网站,该页面以英语加载,您无法阅读,并且不知道如何更改浏览器语言。从下拉菜单或图标等中选择语言会不会很好?我想会的。
因此,为了做到这一点,我需要能够更改该accept-language标头并重新加载页面。这是我不确定如何进行的地方。
我已经尝试过了navigator.language = <selected language>
,xhr.setRequestHeader
但是这些似乎没有用。
我可能是错的,但是语言环境设置不是您在代码中更改的内容。这取决于浏览器的用户配置。如果您使用的是HttpClient,则肯定会将所需的Accept-Language标头的值发送到服务器,但是不要期望从代码中更改此值,并使它在浏览器中发出的所有请求中有效。
通常的做法是根据用户的语言偏好设置自定义Cookie。默认情况下,您应该使用Accept-Language标头上的值填充此Cookie。在ASP.NET MVC中有一个设置,因此Thread.CurrentThread.CurrentCulture和Thread.CurrentThread.CurrentUICulture都根据用户的浏览器配置进行设置:
<system.web>
<globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto" />
</system.web>
然后,您可以创建一个ActionFilter来检查自定义语言cookie,并相应地设置Thread.CurrentThread.CurrentUICulture。
Thread.CurrentThread.CurrentUICulture用于确定代码应使用哪些资源。而Thread.CurrentThread.CurrentCulture用于所有数字和日期处理。
该动作过滤器如下所示:
public class LanguageActionFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var langCookie = GetOrSetLanguageCookie(filterContext.HttpContext);
var culture = new CultureInfo(langCookie.Value);
Thread.CurrentThread.CurrentUICulture = culture;
}
private HttpCookie GetOrSetLanguageCookie(HttpContextBase context)
{
var cookie = context.Request.Cookies[Constants.LanguageCookieName];
if (cookie == null)
{
//set the cookie for first time
cookie = new HttpCookie(Constants.LanguageCookieName, Thread.CurrentThread.CurrentUICulture.Name)
{
Expires = DateTime.Now.AddYears(1),
Path = "/"
};
context.Response.Cookies.Add(cookie);
}
return cookie;
}
}
请注意:
IE:如果美国用户的浏览器设置为en_US,则选择使用您应用的西班牙语界面,则该用户向服务器发布信息的日期如下:
1/5/2015将在服务器中解析为1月5日,而不是5月1日。
像1,900这样的数字在服务器中将被解析为1900,而不是1.900。
我经过惨痛的教训才学到这个。我有一个问题在这里这是从来没有回答。
请让我知道,如果你有任何问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句