我检测到这样的浏览器语言:
var language = window.navigator.userLanguage || window.navigator.language
Run Code Online (Sandbox Code Playgroud)
然后我通过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
Run Code Online (Sandbox Code Playgroud)
我应该考虑更多的浏览器语言检测吗?
我的问题是检测浏览器语言.关于用户代理,当前语言是"tr",但window.navigator.language给出"en".这是一个已知的问题吗?我不应该相信window.navigator.language价值吗?我应该解析用户代理的语言吗?
编辑:
我还检查了这些请求的Accept-language标头.这些值与请求的用户代理字符串一致.
所以,window.navigator.language说"en",Accept-language标题是"tr-TR,en-US",用户代理字符串有"tr-tr"字样.
Wla*_*ant 23
就浏览器而言,有两种相关的语言:浏览器用户界面的语言和用户更喜欢查看网页的语言.这些语言通常是相同的,但并非必须如此.例如,挪威用户通常会使用带有英语用户界面的浏览器,但更喜欢使用挪威语查看网页.
用户代理通常反映浏览器用户界面的语言.通常情况下,这种语言是固定的,只能通过大量工作进行更改 - 比如重新安装浏览器(Chrome实际上允许配置浏览器语言,但即使你必须深入挖掘浏览器首选项).
另一方面,首选的内容语言可以在所有浏览器中轻松配置.用户可以选择任意数量的语言及其优先级.该列表将在Accept-Language标题中发送,并允许服务器相应地调整内容(例如,默认情况下将用户重定向到特定于语言的页面版本).
到目前为止,它非常简单 - 您通常希望考虑Accept-Language您的决定而不是用户代理.唯一的复杂因素是知道window.navigator.language房产反映了哪一个.最初,window.navigator.language旨在为您提供浏览器用户界面的语言(意味着它将与用户代理匹配).但是,网站使用它来决定向用户呈现的语言版本 - 因此一些浏览器根据Accept-Language标题(通常通过获取列表中的第一个条目)来生成其值.对于Firefox 5及更高版本来说,情况确实如此,Safari 7使用相同的逻辑(不知道它何时被引入).
侧面说明:
window.navigator.languages属性可返回用户选择的完整内容首选项列表.window.navigator.userLanguage属性.根据您所说的以及您不愿意使用此答案,看来您应该使用Accept-language标头或解析 userAgent 字符串(尽管例如 Firefox 不再将语言放入该字符串中)。因为您实际上可以访问 HTTP 标头,所以我建议使用它们。
我对您发现的不一致的怀疑是,浏览器可以使用区域设置进行编译,然后由想要不同区域设置的用户运行(考虑只下载默认 en-US 版本的人或定期切换语言的人)。
您必须测试各种配置并查看哪种配置适合您。考虑使用各种不同的Firefox 区域设置和Chrome 配置进行测试。您还可以通过轮询用户来进行测试(使用 cookie)。随着时间的推移,也许您将不需要 cookie,因为由于这些测试,默认情况下您会“正确”地得到它,但这里或那里总会有例外,所以允许最终用户覆盖您的 cookie 仍然是件好事。 (智能)默认。
| 归档时间: |
|
| 查看次数: |
15761 次 |
| 最近记录: |