如何更改浏览器接受语言

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但这些似乎不起作用.

Rac*_* R. 5

我可能是错的,但是您在代码中没有更改语言环境设置。这由浏览器的用户配置确定。如果您使用的是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)

请注意:

  • 即使您的用户选择了,例如在界面中说“ es-Ar”,并为该用户相应地设置了UICulture,如果该用户的浏览器配置了为该用户发布的美国日期,则将使用英语惯例进行解析,所以浮点数会。

IE:如果美国用户的浏览器设置为en_US,则选择使用您应用的西班牙语界面,那么该用户向服务器发布信息的日期如下:

1/5/2015将在服务器中解析为1月5日,而不是5月1日。

像1,900这样的数字在服务器中将被解析为1900,而不是1.900。

我经过惨痛的教训才学到这个。我有一个问题在这里这是从来没有回答。

请让我知道,如果你有任何问题。


Juk*_*ela 5

所述Accept-Language报头是请求报头,所以它是由浏览器(或其他客户端软件)发送。在您的服务器上,您可以什么都不做就忽略它。也就是说,它本身没有效果;一切都取决于您的服务器端代码是否识别它并采取一些行动。因此,您不能也不需要更改浏览器发送的标头。

用户可以Accept-Language使用浏览器的首选项设置更改浏览器发送的标头。例如,在 Chrome 中,转到“设置”,单击“显示高级设置...”,向下滚动到“语言”,单击“语言和输入设置...”,然后添加语言并拖动以进行排序.

这不是人们经常做的事情,大多数人都不知道此类设置的存在。所以浏览器发送的通常是一些出厂默认值。它们可能很奇怪,例如Accept-Language: fr-CA,根据协议,“如果您,亲爱的服务器,有我请求的资源的不同语言版本,请给我加拿大法语;如果你没有它,我不在乎你给出哪个版本”。这意味着如果资源以通用法语(法语法语)或英语存在,则这些资源不会优先于斯瓦希里语或 Volapük 版本。所以一个更明智的标题通常是Accept-Language: fr-CA, fr, en,这实际上是你应该如何处理的Accept-Language: fr-CA

  • “所以你不能也不需要更改浏览器发送的标头” - 是的,你可以。 (2认同)