如何更改浏览器接受语言

时间:2013-08-30 00:12:59

标签: javascript jquery asp.net-mvc-4 localization

例如,如果用户将其浏览器设置为fr-CA,但我的网站可以选择以其他可用语言(如英语)查看该页面。如何覆盖accept-language标头,以便我可以使用指定的语言重新加载?

我试图简单地更改Accept-Language标头,然后重新加载页面,但我不确定如何执行此操作。有什么想法吗?

更新: 好的,所以我让人们向我解释本地化是什么,所以我一定不能正确地问这个问题。

我的网站目前在web.config中将全球化设置为自动,因此它会自动将线程文化设置为应用程序启动时协商的任何语言。默认情况下,用户的浏览器将根据浏览器的语言设置发送接受语言标题,就像下面指出的那样,普通用户不知道那些是什么,这些是什么,或者如何改变他们。在任何情况下,让我们调用此默认行为,浏览器将首先处理语言标头。但是,作为FEATURE,我想允许用户从页面更改此接受语言标题。例如,在应用程序中,语言设置通常由cookie或用户首选项(通过配置文件设置)确定,但在登陆/登录页面上(特别是如果这是您第一次登录某台计算机),我有不知道你是谁,所以我只有你的浏览器设置。但是,让我们假设您正在商务旅行并从美国计算机访问此网站,该页面以英语加载,您无法阅读它而您不知道如何更改浏览器语言。从下拉菜单或图标或其他东西中选择语言是不是很好?我想是的。

因此,为了做到这一点,我需要能够更改该accept-language标头并重新加载页面。这是我不知道如何继续的地方。

我已尝试navigator.language = <selected language>xhr.setRequestHeader,但这些似乎无法发挥作用。

2 个答案:

答案 0 :(得分:4)

我可能错了,但区域设置不是您在代码中更改的内容。 这取决于浏览器的用户配置。 如果您正在使用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;
    }
}

请注意:

  • 即使您的用户选择了,请在您的界面中说“es-Ar”,然后相应地为该用户设置您的UICulture,如果用户的浏览器配置了为该用户发布的en-US日期将使用英国惯例,所以浮点数会。

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

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

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

我很难学到这一点。 我有一个问题here从未得到回答。

如果您有任何疑问,请与我们联系。

答案 1 :(得分:3)

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

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

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