我有一个本地化为十几种语言的网站(Flash),我想根据用户的浏览器设置自动定义默认值,以便最大限度地减少访问内容的步骤。
仅供参考,由于代理限制,我无法使用服务器脚本,因此我猜JavaScript或ActionScript适合解决问题。
问题:
“猜测”用户的区域设置的最佳方法是什么?
是否有任何现有的简单类/功能可以帮助我(没有复杂的本地化捆绑包)?特别是以智能的方式将所有可能的语言分解为较小的数字(我所拥有的翻译)。
我可以相信这样的解决方案吗?
还有其他解决方法或建议吗?
答案 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建议浏览器导航器对象的以下属性:
将这些转换为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.userLanguage
或navigator.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)
我对此进行了一些研究。到目前为止,我已在下表中总结了我的发现
因此,建议的解决方案是编写一个服务器端脚本来解析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 |
https://ip2c.org/s 要么 https://ip2c.org/self 要么 https://ip2c.org/?self |
答案 9 :(得分:-1)
您说您的网站有Flash,然后,作为另一种选择,您可以使用flash.system.Capabilities.language
获取操作系统的语言 - 请参阅How to determine OS language within browser 猜测操作系统区域设置。< / p>