在浏览器中确定用户区域设置的最佳方法

时间:2009-03-23 15:43:31

标签: javascript flash browser localization

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

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

问题:

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

  2. 是否有任何现有的简单类/功能可以帮助我(没有复杂的本地化捆绑包)?特别是以智能的方式将所有可能的语言分解为较小的数字(我所拥有的翻译)。

  3. 我可以相信这样的解决方案吗?

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

10 个答案:

答案 0 :(得分:163)

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

不幸的是,此标头无法在JavaScript中读取;所有你得到的是navigator.language,它告诉你安装了什么本地化版本的Web浏览器。这不一定与用户的首选语言相同。在IE上,您获得systemLanguage(操作系统安装语言),browserLanguage(与language相同)和userLanguage(用户配置的操作系统区域),这些都同样无益。< / p>

如果我必须在这些属性之间做出选择,我会首先嗅探userLanguage,然后回到language并且仅在此之后(如果那些与任何可用语言不匹配)查看{{ {1}},最后是browserLanguage

如果您可以在网络上的其他位置放置一个服务器端脚本,只需读取Accept-Language标头并将其作为JavaScript文件返回,并带有字符串中的标头值,例如:

systemLanguage

然后你可以包含一个&lt; script src&gt;指向HTML中的外部服务,并使用JavaScript来解析语言标头。但是,我不知道有任何现有的库代码,因为接受语言解析几乎总是在服务器端完成。

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

答案 1 :(得分:63)

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

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

答案 2 :(得分:39)

This article建议浏览器导航器对象的以下属性:

  • navigator.language(Netscape - 浏览器本地化)
  • navigator.browserLanguage(IE-Specific - 浏览器本地化语言)
  • navigator.systemLanguage(特定于IE - Windows操作系统 - 本地化语言)
  • navigator.userLanguage

将这些转换为javascript函数,在大多数情况下,您应该能够猜出正确的语言。一定要优雅地降级,所以有一个div包含你的语言选择链接,这样如果没有javascript或方法不起作用,用户仍然可以决定。如果确实有效,只需隐藏div。

在客户端执行此操作的唯一问题是,您要将所有语言提供给客户端,或者您必须等到脚本运行并在请求之前检测到语言正确的版本。也许提供最流行的语言版本作为默认设置会激怒最少的人。

编辑:我是第二个Ivan的cookie建议,但请确保用户以后可以随时更改语言;不是每个人都喜欢他们的浏览器默认的语言。

答案 3 :(得分:12)

结合浏览器用于存储用户语言的多种方式,您将获得以下功能:

const getNavigatorLanguage = () => {
  if (navigator.languages && navigator.languages.length) {
    return navigator.languages[0];
  } else {
    return navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en';
  }
}

我们首先检查navigator.languages数组的第一个元素。
然后我们得到navigator.userLanguagenavigator.language
如果失败,我们将得到navigator.browserLanguage
最后,如果其他所有操作都失败,则将其设置为'en'


这是一线性感的东西:

const getNavigatorLanguage = () => (navigator.languages && navigator.languages.length) ? navigator.languages[0] : navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en';

答案 4 :(得分:10)

我使用了所有答案并创建了单行解决方案:

const getLanguage = () => navigator.userLanguage || (navigator.languages && navigator.languages.length && navigator.languages[0]) || navigator.language || navigator.browserLanguage || navigator.systemLanguage || 'en';

console.log(getLanguage());

答案 5 :(得分:3)

我对此进行了一些研究。到目前为止,我已在下表中总结了我的发现

enter image description here

因此,建议的解决方案是编写一个服务器端脚本来解析Accept-Language标题&amp;将其传递给客户端以设置网站的语言。奇怪的是,为什么需要服务器来检测客户端的语言偏好,但现在的情况如何呢?还有其他各种黑客可以检测语言但是阅读Accept-Language根据我的理解,标题是推荐的解决方案。

答案 6 :(得分:3)

用户的首选语言和系统/浏览器语言环境之间存在差异。

用户可以在浏览器中配置首选语言,这些语言将用于navigator.language(s),并在从服务器请求资源时用于根据语言优先级列表来请求内容。

但是,浏览器的语言环境将决定如何呈现数字,日期,时间和货币。此设置可能是排名最高的语言,但不能保证。在Mac和Linux上,语言环境由系统决定,与用户语言首选项无关。在Windows上,可以选择Chrome首选列表中的语言。

通过使用Intl(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl),开发人员可以覆盖/设置用于渲染这些内容的语言环境,但是有些元素不能被覆盖,例如<input type="date">格式。

要正确提取这种语言,我发现的唯一方法是:

(new Intl.NumberFormat()).resolvedOptions().locale

({Intl.NumberFormat().resolvedOptions().locale似乎也可以)

这将为默认语言环境创建一个新的NumberFormat实例,然后读回那些已解析选项的语言环境。

答案 7 :(得分:1)

您还可以尝试从文档中获取语言,这可能是您的首选,然后回退到其他方式,因为人们通常希望他们的JS语言与文档语言相匹配。

HTML5:

document.querySelector('html').getAttribute('lang')

旧版

document.querySelector('meta[http-equiv=content-language]').getAttribute('content')

没有真正的来源一定是100%可靠的,因为人们可以简单地使用错误的语言。

有些语言检测库可以让您根据内容确定语言。

答案 8 :(得分:0)

您可以使用http或https。

https://ip2c.org/XXX.XXX.XXX.XXX 要么 https://ip2c.org/?ip=XXX.XXX.XXX.XXX |

  • 从0.0.0.0到255.255.255.255的标准IPv4

https://ip2c.org/s 要么 https://ip2c.org/self 要么 https://ip2c.org/?self |

  • 处理呼叫者的IP
  • 比?dec =选项快,但仅限于一个目的-提供有关您自己的信息

参考: https://about.ip2c.org/#inputs

答案 9 :(得分:-1)

您说您的网站有Flash,然后,作为另一种选择,您可以使用flash.system.Capabilities.language获取操作系统的语言 - 请参阅How to determine OS language within browser 猜测操作系统区域设置。< / p>