我这样检测浏览器语言:
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 使用相同的逻辑(不知道它是什么时候引入的)。
旁注:
- 从 Firefox 32 和 Chrome 32 开始,有一个新的
window.navigator.languages
property它会返回用户选择的内容偏好的完整列表。 - Internet Explorer 有一个非标准的
window.navigator.userLanguage
property .
关于javascript - 浏览器语言检测 : inconsistency between user agent and window. navigator.language,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415391/