我一直在尝试使用JavaScript检测浏览器语言首选项。
如果我在IE的“工具>Internet选项>常规>语言”中设置浏览器语言,如何使用JavaScript读取此值?
火狐也有同样的问题。我无法检测工具>选项>内容>语言使用导航器.language的设置。
使用导航器。userLanguage,它检测设置通过
打开>ControlPanel>RegionalandLanguageOptions>Regional Options选项卡。
我已经用navigator测试过了。browserLanguage和navigator。systemLanguage但都不返回第一个设置的值(Tools>InternetOptions>General>Languages)
我找到了一个详细讨论这个问题的链接,但这个问题仍然没有答案:(
我一直在使用Hamid的答案一段时间,但在语言数组像["en", "en- gb ", "en- us ", "fr- fr", "fr", "en- za "]的情况下,它将返回"en",当"en- gb "将是一个更好的匹配。
我的更新(下面)将返回第一个长格式的代码,例如。"en-GB",否则将返回第一个短代码,例如。"en",否则返回null。
function getFirstBrowserLanguage() {
var nav = window.navigator,
browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],
i,
language,
len,
shortLanguage = null;
// support for HTML 5.1 "navigator.languages"
if (Array.isArray(nav.languages)) {
for (i = 0; i < nav.languages.length; i++) {
language = nav.languages[i];
len = language.length;
if (!shortLanguage && len) {
shortLanguage = language;
}
if (language && len>2) {
return language;
}
}
}
// support for other well known properties in browsers
for (i = 0; i < browserLanguagePropertyKeys.length; i++) {
language = nav[browserLanguagePropertyKeys[i]];
//skip this loop iteration if property is null/undefined. IE11 fix.
if (language == null) { continue; }
len = language.length;
if (!shortLanguage && len) {
shortLanguage = language;
}
if (language && len > 2) {
return language;
}
}
return shortLanguage;
}
console.log(getFirstBrowserLanguage());
更新:当某些属性未定义时,IE11出现错误。增加了跳过这些属性的检查。
2014年更新。
现在有一种方法可以使用导航器在Firefox和Chrome中获得Accept-Languages。语言(适用于Chrome >= 32和Firefox >= 32)
另外,导航器。这些年来Firefox的语言反映了最受欢迎的内容语言,而不是UI语言。但是由于这个概念还没有得到其他浏览器的支持,所以它并不是很有用。
所以,尽可能获得最受欢迎的内容语言,并使用UI语言作为后备:
navigator.languages
? navigator.languages[0]
: (navigator.language || navigator.userLanguage)
I can't find a single reference that state that it's possible without involving the serverside.
MSDN上:
navigator.browserLanguage
navigator.systemLanguage
navigator.userLanguage
从browserLanguage:
In Microsoft Internet Explorer 4.0 and
earlier, the browserLanguage property
reflects the language of the installed
browser's user interface. For example,
if you install a Japanese version of
Windows Internet Explorer on an
English operating system,
browserLanguage would be ja.
In Internet Explorer 5 and later,
however, the browserLanguage property
reflects the language of the operating
system regardless of the installed
language version of Internet Explorer.
However, if Microsoft Windows 2000
MultiLanguage version is installed,
the browserLanguage property indicates
the language set in the operating
system's current menus and dialogs, as
found in the Regional Options of the
Control Panel. For example, if you
install a Japanese version of Internet
Explorer 5 on an English (United
Kingdom) operating system,
browserLanguage would be en-gb. If you
install Windows 2000 MultiLanguage
version and set the language of the
menus and dialogs to French,
browserLanguage would be fr, even
though you have a Japanese version of
Internet Explorer.
Note This property does not indicate
the language or languages set by the
user in Language Preferences, located
in the Internet Options dialog box.
此外,它看起来像是browserLanguage被弃用了,因为IE8没有列出它
如果您不想依赖外部服务器,并且您有自己的服务器,您可以使用一个简单的PHP脚本来实现与@DanSingerman answer相同的行为。
languageDetector.php:
<?php
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
echo json_encode($lang);
?>
只需从jQuery脚本中更改这几行:
url: "languageDetector.php",
dataType: 'json',
success: function(language) {
nowDoSomethingWithIt(language);
}
I came across this piece of code to detect browser's language in Angular Translate module, which you can find the source here. I slightly modified the code by replacing angular.isArray with Array.isArray to make it independent of Angular library.
var getFirstBrowserLanguage = function () {
var nav = window.navigator,
browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],
i,
language;
// support for HTML 5.1 "navigator.languages"
if (Array.isArray(nav.languages)) {
for (i = 0; i < nav.languages.length; i++) {
language = nav.languages[i];
if (language && language.length) {
return language;
}
}
}
// support for other well known properties in browsers
for (i = 0; i < browserLanguagePropertyKeys.length; i++) {
language = nav[browserLanguagePropertyKeys[i]];
if (language && language.length) {
return language;
}
}
return null;
};
console.log(getFirstBrowserLanguage());