浏览器使用什么信息来创建 Accept-Language 字符串?

What information do browsers use to create the Accept-Language string?

我正在尝试获取尽可能多的有关访问网站的用户的区域信息。使用例如将 IP 映射到国家/地区ipinfo.io 是一种方法,但我也在探索 Accept-Language header。在 PHP 中使用 HTTP_ACCEPT_LANGUAGE 获取此信息。请问有人知道这个是怎么计算的吗?我知道这取决于浏览器,并且实现方式因浏览器而异,但是是否有一些可用的文档或关于此的有趣文章?

我正在使用 Linux,我的操作系统语言是英语,我的键盘布局是瑞典语。对于 Chrome 我看到这个字符串:

en-US,en;q=0.8,nl;q=0.6,sv;q=0.4

这表明我对英语和瑞典语感兴趣,这是有道理的,但那里也有荷兰语,这可能是从哪里来的?

对于 Firefox,我只看到:

en-US,en;q=0.5

有人对此做过更多研究吗?关于如何获取有关网站访问者的区域信息的任何其他提示或意见?

谢谢!

这可能取决于浏览器和平台。在 unix 类型的操作系统上,您可以使用 locale 命令找到系统语言环境:

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

您也可以使用相同的命令或通过 OSX 系统偏好设置应用程序进行设置。浏览器可能会默认为系统区域设置,但其中大多数还会为用户提供一种在浏览器中更改其首选项的方法。请参阅 http://www.w3.org/International/questions/qa-lang-priorities.en.php 了解详细信息。

这是一些看起来与设置实际 accept-language header 有关的 chrome 代码:https://code.google.com/p/chromium/codesearch#chromium/src/ui/base/l10n/l10n_util.cc&q=AcceptLanguage&sq=package:chromium&type=cs&l=856

这是一份与 accept-language header 相关的 firefox 错误报告,其中包含许多有趣的讨论以及指向与设置 header 相关的差异的链接:https://bugzilla.mozilla.org/show_bug.cgi?id=1054739

这是一篇 mozilla 开发人员文章,其中提供了有关 accept-language header 和一些相关内容的一些详细信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation

最终,accept-language 由用户控制(并且有很多浏览器扩展可以快速修改它),因此虽然检测用户的语言偏好很有用,但它不一定能告诉您任何信息关于他们的位置。您可以将它与其他信息结合起来,例如用户的时区(可从 javascript 获得),但如果您真的想要位置信息,那么 http://ipinfo.io 之类的信息是最好的选择。