如何使用JavaScript获取浏览器的当前语言偏好设置?

42

有人知道如何使用JavaScript从Firefox和Google Chrome获取浏览器的语言环境吗?注意:这是一个asp.net 3.5 Web应用程序。

要求尝试根据浏览器语言环境设置应用程序的显示语言环境。我已经找到了其他浏览器的一些信息,但它们似乎不起作用。

我能够使用以下代码片段在IE中获取它:

var browserCulture = this.clientInformation.browserLanguage;

非常感谢您的任何信息!


3
“文化”是指浏览器中当前设置的地区偏好吗?(我以前从未听说过将其称为“文化”,但我很无知。) - Pointy
是的,那正是我的意思。我习惯于使用ASP本地化,这就是它的名称。因此,我对它被称为“文化”有限的了解。难怪我在网上找这些信息时遇到了这么大的困难! - The Sheek Geek
这是一个相关的问题:https://dev59.com/j3NA5IYBdhLWcg3wPLL- - Damien
4个回答

75
以下属性存在于navigator对象上(在IE上也可以称为clientInformation,但没有使用该名称的原因):
  • language(非IE浏览器安装语言)
  • browserLanguage(IE浏览器安装语言)
  • userLanguage(IE用户级别的全局语言设置)
  • systemLanguage(IE操作系统安装语言)
但是!你不应该使用这些属性中的任何一个! 在许多情况下,它们都会显示错误的语言。
它们中没有一个反映用户实际上可以在浏览器的“首选语言”UI中配置的语言设置,并且对于用户来说难以更改。如果没有额外的简单手动切换语言的方法,使用这些值将会导致极大的挫败感。
你应该检测的正确位置,以决定默认使用哪种语言,是HTTP请求中传递到服务器的Accept-Language头。这是一个偏爱的语言排序列表,你可以从中选择,并且它是ASP.NET用于猜测自动客户端Culture的地方,如果你使用它的话。
不幸的是,JavaScript中没有这个属性!
通常做法是在服务器端解析Accept-Language头并选择一个适当的语言来使用。在ASP.NET中,你可以从HttpRequest.UserLanguages获取一个预排序的列表,并选择第一个喜欢的语言。
然后,将该语言名称放入<script>元素中,以将语言信息传递给客户端。

4
请参见 https://developer.mozilla.org/zh-CN/docs/Web/API/Window/navigator.language ,所有浏览器都已经使用 Accept-Language 的值作为其语言属性。您不需要再担心这个问题了。 - timdream
5
请注意,“所有浏览器”这个短语似乎有些误导,因为你链接的文档中指出window.navigator.language在IE中不受支持,需要使用专有的IE选项。 - StackExchange What The Heck
2
我认为该文档对Chrome的描述也是错误的——我总是获取浏览器语言而不是第一个设置语言。我只在Firefox浏览器中看到第一个设置语言,远非“所有浏览器”。即使如此,这也是次优的,因为你只能得到第一种语言:如果用户说“优先使用英语,如果没有则使用法语”,但你只有法语和德语,那么第二个偏好就无法被识别。 - bobince
1
我创建了这个名为acceptedlanguages.js的库,它提供了一个简单的函数调用,并且非常轻量级:https://github.com/leighmcculloch/acceptedlanguages.js - Leigh McCulloch
2017年注:在Chrome和Firefox中使用navigator.languages获取用户首选语言列表(由用户在浏览器中定义;请注意,navigator.languages [0]可能与navigator.language完全不同)。然后是适用于IE11+和其他浏览器的navigator.language。然后是与旧版IE兼容的navigator.userLanguage。在IE11中,navigator.language === navigator.userLanguage。在Windows的控制面板>区域和语言中,用户可以更改userLanguage的值。 - jakub.g
@jakub.g,在IE11中,您无法可靠地确定最受欢迎和支持的语言,必须使用服务器发送“Accept-Language”标头(已处理或未处理)。 此外,请不要仅在可用时使用navigator.languages[0](例如“cn-CN”),因为这可能是您没有翻译的语言,这种情况下您将退回到默认(例如“en-GB”)语言。但是,navigator.language[1](例如“fr-FR”)仍然可能受到您网站的支持,但是您的网站将使用默认文化显示。请遍历数组以找到最佳结果。 - The Victor

12

试试这个:

var l_lang;
  if (navigator.userLanguage) // Explorer
    l_lang = navigator.userLanguage;
  else if (navigator.language) // FF
    l_lang = navigator.language;
  else
    l_lang = "en";

来源: http://forums.digitalpoint.com/showthread.php?t=631706

这篇帖子是关于IT技术的。以下是翻译内容:


1
请注意,这篇文章有点旧了,但是对于现在(比如我自己)遇到这个问题的人来说,navigator.language适用于IE 11,所以这段代码应该可以正常工作。 - TygerKrash

7

navigator.languages是一个数组,按顺序包含所有已选择的语言。只适用于Chrome和Firefox浏览器。

这与navigator.language不同,也就是说,navigator.language不一定与navigator.languages[0]匹配。

只是为了明确。


-1
要在IE中获取本地环境,您需要编写服务器端代码。我尝试使用servlet,并获取了IE的接受语言。它显示用户选择的语言。在客户端中调用servlet并获取本地环境。
String name=request.getHeader("accept-language");
        AcceptClass ac=new AcceptClass();
        ac.setAccLang(name);
        Gson gs=new Gson();
          String json = gs.toJson(ac);
          response.setContentType("application/json");
          response.getWriter().write(json);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接