浏览器语言检测:用户代理与window.navigator.language之间的不一致

时间:2014-05-01 19:47:14

标签: 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标头。这些值与请求的用户代理字符串一致 因此,window.navigator.language说" en",Accept-language标题是" tr-TR,en-US",用户代理字符串有" tr-tr& #34;字。

2 个答案:

答案 0 :(得分:20)

就浏览器而言,有两种相关语言:浏览器的语言和用户界面以及用户更喜欢查看网页的语言。这些语言通常是相同的,但它们并不相同不得不。例如,挪威用户经常使用带有英语用户界面的浏览器,但更喜欢用挪威语查看网页。

用户代理通常反映浏览器用户界面的语言。通常情况下,这种语言是固定的,只能通过大量工作进行更改 - 例如重新安装浏览器(Chrome实际上允许配置浏览器语言,但即使你必须深入挖掘浏览器首选项)。

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

到目前为止,它非常简单 - 您通常要考虑Accept-Language来做出决定而不是用户代理。唯一的复杂因素是知道window.navigator.language属性反映哪一个。最初,window.navigator.language旨在为您提供浏览器用户界面的语言(意味着它将与用户代理匹配)。但是,网站使用它来决定向用户呈现的语言版本 - 因此一些浏览器会根据Accept-Language标题(通常通过列表中的第一个条目)生成其值。对于Firefox 5及更高版本来说,情况确实如此,Safari 7使用相同的逻辑(不知道它何时被引入)。

侧面说明:

答案 1 :(得分:2)

根据您所说的内容以及您不愿意使用this answer,看起来您应该使用Accept-language标头或者解析userAgent字符串(例如,Firefox不会放置语言进入那个字符串了。因为您实际上可以访问HTTP标头,所以我建议您使用它们。

我怀疑你发现的不一致之处在于浏览器可以编译使用语言环境然后运行由想要不同语言环境的用户(考虑下载的人)默认的en-US版本或定期切换语言的人。)

您必须测试各种配置并查看适合您的配置。考虑使用各种不同的Firefox locale buildsChrome configurations进行测试。您还可以通过轮询您的用户进行测试(使用cookie)。随着时间的推移,也许你不需要cookie,因为默认情况下你会因为这些测试得到“正确”,但是这里或那里总会有一个例外,所以允许最终用户覆盖你的(智能)默认。