Sin*_*tic 8 javascript jquery localization asp.net-mvc-4
例如,如果用户将其浏览器设置为fr-CA,但我的网站可以选择以其他可用语言(如英语)查看该页面.如何覆盖accept-language标头以便我可以使用指定的语言重新加载?
我试图简单地更改Accept-Language标头,然后重新加载页面,但我不知道如何做到这一点.有什么想法吗?
更新:好的,所以我让人们向我解释本地化是什么,所以我一定不能正确地问这个问题.
我的网站目前在web.config中将全球化设置为auto,因此它会自动将线程文化设置为应用程序启动时协商的任何语言.默认情况下,用户的浏览器将根据浏览器的语言设置发送接受语言标题,就像下面指出的那样,普通用户不知道那些是什么,这些是什么,或者如何更改它们.在任何情况下,让我们调用此默认行为,浏览器将首先处理语言标头.但是,作为FEATURE,我想允许用户从页面更改此接受语言标题.例如,在应用程序中,语言设置通常由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>
Run Code Online (Sandbox Code Playgroud)
然后,您可以创建一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意:
IE:如果美国用户的浏览器设置为en_US,则选择使用您应用的西班牙语界面,那么该用户向服务器发布信息的日期如下:
1/5/2015将在服务器中解析为1月5日,而不是5月1日。
像1,900这样的数字在服务器中将被解析为1900,而不是1.900。
我经过惨痛的教训才学到这个。我有一个问题在这里这是从来没有回答。
请让我知道,如果你有任何问题。
所述Accept-Language
报头是请求报头,所以它是由浏览器(或其他客户端软件)发送。在您的服务器上,您可以什么都不做就忽略它。也就是说,它本身没有效果;一切都取决于您的服务器端代码是否识别它并采取一些行动。因此,您不能也不需要更改浏览器发送的标头。
用户可以Accept-Language
使用浏览器的首选项设置更改浏览器发送的标头。例如,在 Chrome 中,转到“设置”,单击“显示高级设置...”,向下滚动到“语言”,单击“语言和输入设置...”,然后添加语言并拖动以进行排序.
这不是人们经常做的事情,大多数人都不知道此类设置的存在。所以浏览器发送的通常是一些出厂默认值。它们可能很奇怪,例如Accept-Language: fr-CA
,根据协议,“如果您,亲爱的服务器,有我请求的资源的不同语言版本,请给我加拿大法语;如果你没有它,我不在乎你给出哪个版本”。这意味着如果资源以通用法语(法语法语)或英语存在,则这些资源不会优先于斯瓦希里语或 Volapük 版本。所以一个更明智的标题通常是Accept-Language: fr-CA, fr, en
,这实际上是你应该如何处理的Accept-Language: fr-CA
。