如何在浏览器中确定用户的区域设置?

2022-08-30 00:10:09

我有一个网站(Flash)本地化为十几种语言,我想根据用户的浏览器设置自动定义默认值,以尽量减少访问内容的步骤。

仅供参考,由于代理限制,我无法使用服务器脚本,所以我想JavaScript或ActionScript适合解决问题。

问题:

  1. “猜测”用户区域设置的最佳方法是什么?

  2. 是否有任何现有的简单类/函数可以帮助我(没有复杂的本地化包)?特别是以一种聪明的方式将所有可能的语言减少到一个较小的数字(我有的翻译)。

  3. 到哪一点,我可以信任这样的解决方案?

  4. 还有其他解决方法或建议吗?


答案 1

正确的方法是查看发送到服务器的 HTTP 接受语言标头。这包含用户已配置其浏览器首选语言的有序加权列表。

不幸的是,这个头文件不能在JavaScript内部阅读;你得到的只是navigator.language,它告诉你安装了哪个本地化版本的Web浏览器。这不一定与用户的首选语言相同。在IE上,你会得到(操作系统安装的语言),(与)和(用户配置的操作系统区域相同),它们同样没有帮助。systemLanguagebrowserLanguagelanguageuserLanguage

如果我必须在这些属性之间进行选择,我会先嗅一嗅,然后才回退到(如果这些属性与任何可用语言不匹配)查看并最终。userLanguagelanguagebrowserLanguagesystemLanguage

如果您可以将服务器端脚本放在网络上的其他地方,该脚本只需读取Accept-Language标头并将其作为字符串中的标头值作为JavaScript文件吐出,例如:

var acceptLanguage= 'en-gb,en;q=0.7,de;q=0.3';

然后,您可以在HTML中包含指向该外部服务的<脚本src>并使用JavaScript解析语言标头。但是,我不知道有任何现有的库代码可以执行此操作,因为接受语言解析几乎总是在服务器端完成。

无论你最终做什么,你肯定需要一个用户覆盖,因为它总是会对某些人猜错。通常,最简单的方法是将语言设置放在URL中(例如 http://www.example.com/en/site 与 http://www.example.com/de/site),并让用户单击两者之间的链接。有时,您确实希望两种语言版本都使用单个URL,在这种情况下,您必须将设置存储在cookie中,但这可能会使不支持cookie和搜索引擎的用户代理感到困惑。


答案 2

在Chrome和Firefox 32 +上,Navigator.languages包含一系列按用户偏好排序的区域设置,并且比更准确,但是,要使其向后兼容(经过测试的Chrome / IE / Firefox / Safari),然后使用以下命令:navigator.language

function getLang() {
  if (navigator.languages != undefined) 
    return navigator.languages[0]; 
  return navigator.language;
}