javascript - 浏览器语言检测 : inconsistency between user agent and window. navigator.language

标签 javascript locale

我这样检测浏览器语言:

 var language = window.navigator.userLanguage || window.navigator.language

然后我使用 AJAX 调用将这个值发送到我的网络服务器。
当我检查结果时,我看到了一件奇怪的事情。例如,浏览器的用户代理说当前语言环境是 tr-tr,但是当我检查 window.navigator.language 时,我得到的结果是 en.

所有这些浏览器都说他们的语言是en:

Mozilla/5.0 (Linux; U; Android 2.2.2; tr-tr; GM FOX Build/HuaweiU8350) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1, 
Mozilla/5.0 (Linux; U; Android 2.2.2; tr-tr; LG-P503 Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2
Mozilla/5.0 (Linux; U; Android 2.3.4; tr-tr; GT-S5670 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.6; tr-tr; GT-S5360 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 
Mozilla/5.0 (Linux; U; Android 2.3.6; tr-tr; GT-S5830i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S7233E/S723EJVKB1; U; Bada/1.0; tr-tr) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WQVGA SMM-MMS/1.2.0 OPN-B
Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8500/S8500JVJE6; U; Bada/1.0; tr-tr) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WVGA SMM-MMS/1.2.0 OPN-B
Mozilla/5.0 (X11; U; Linux x86_64; tr-tr) AppleWebKit/537.36 (KHTML, like Gecko)  Chrome/30.0.1599.114 Safari/537.36 Puffin/3.7.0.177AP
Mozilla/5.0 (Series40; NokiaC2-02/07.63; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/5.0.0.0.31
Mozilla/5.0 (Series40; Nokia311/07.36; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.3.0.0.54
Mozilla/5.0 (Series40; NokiaC3-00/08.70; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.3.0.0.49
Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; ASU2JS; rv:11.0) like Gecko

我是否应该考虑更多的浏览器语言检测?

我的问题是检测浏览器语言。关于用户代理,当前语言是“tr”,但 window.navigator.language 给出“en”。这是一个已知问题吗?我不应该相信 window.navigator.language 值吗?我应该为语言解析用户代理吗?

编辑:
我还检查了这些请求的 Accept-language header 。这些值与请求的用户代理字符串一致。
因此,window.navigator.language 表示“en”,Accept-language header 为“tr-TR, en-US”,用户代理字符串为“tr-tr”词。

最佳答案

就浏览器而言,有两种相关语言:浏览器用户界面的语言和用户查看网页时喜欢使用的语言。这些语言通常相同,但并非必须相同。例如,挪威用户经常使用具有英语用户界面的浏览器,但更喜欢使用挪威语查看网页。

用户代理通常反射(reflect)浏览器用户界面的语言。通常,这种语言是固定的,只能通过大量努力才能更改 - 比如重新安装浏览器(Chrome 实际上允许配置浏览器语言,但即使在那里你也必须深入研究浏览器首选项)。

另一方面,首选内容语言可以在所有浏览器中轻松配置。用户可以选择任意数量的语言及其优先级。该列表将在 Accept-Language header 中发送并允许服务器相应地调整内容(例如,默认将用户重定向到特定语言的页面版本)。

到目前为止,一切都非常简单 - 您通常需要考虑 Accept-Language 来做出您的决定,而不是用户代理。唯一复杂的是知道 window.navigator.language 属性反射(reflect)了哪一个。最初,window.navigator.language 旨在为您提供浏览器用户界面的语言(意味着它将与用户代理相匹配)。然而,网站使用它来决定向用户呈现哪种语言版本 - 因此一些浏览器转而根据 Accept-Language header 生成它的值(通常通过获取第一个条目列表)。 Firefox 5 及更高版本肯定是这种情况,Safari 7 使用相同的逻辑(不知道它是什么时候引入的)。

旁注:

关于javascript - 浏览器语言检测 : inconsistency between user agent and window. navigator.language,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415391/

相关文章:

python - 如何找出哪些字符被定义为给定语言环境的字母数字

javascript - React hook,发生Invalid hook call错误

javascript - 查询 MongoDB 中以纯文本形式存储且格式为 YYYY-MM-DD 的日期

javascript - 通过数组内调用的函数将多个元素添加到数组中?

ruby-on-rails - Rails/Devise - 在语言环境文件中添加 ruby​​ 代码?

java - 无法在服务中接收用户区域设置

java - JDK 未本地化 JComponent

windows - 在 R 中获取允许的语言环境名称的可靠方法是什么?

javascript - 在网站上显示最新的 Facebook 帖子

javascript - 检查元素是否具有给定数组中的任何属性