我有一个网站(Flash)本地化成十几种语言,我想根据用户的浏览器设置自动定义一个默认值,以尽量减少访问内容的步骤。
仅供参考,由于代理限制,我不能使用服务器脚本,所以我猜JavaScript或ActionScript将适合解决这个问题。
问题:
“猜测”用户语言环境的最佳方法是什么? 是否有任何现有的简单类/函数可以帮助我(没有复杂的本地化包)?特别是以一种聪明的方式将所有可能的语言减少到更小的数量(我有的翻译)。 在什么情况下我可以相信这样的解决方案? 还有其他的解决方法或建议吗?
我有一个网站(Flash)本地化成十几种语言,我想根据用户的浏览器设置自动定义一个默认值,以尽量减少访问内容的步骤。
仅供参考,由于代理限制,我不能使用服务器脚本,所以我猜JavaScript或ActionScript将适合解决这个问题。
问题:
“猜测”用户语言环境的最佳方法是什么? 是否有任何现有的简单类/函数可以帮助我(没有复杂的本地化包)?特别是以一种聪明的方式将所有可能的语言减少到更小的数量(我有的翻译)。 在什么情况下我可以相信这样的解决方案? 还有其他的解决方法或建议吗?
当前回答
正确的方法是查看发送到服务器的HTTP Accept-Language报头。这包含用户配置浏览器首选的有序、加权的语言列表。
不幸的是,这个头文件不能在JavaScript中读取;你得到的只是导航器。语言,它会告诉您安装的web浏览器的本地化版本。这与用户的首选语言不一定是一回事。在IE上,你得到的是systemLanguage(操作系统安装的语言),browserLanguage(与language相同)和userLanguage(用户配置的操作系统区域),这些都同样没有帮助。
如果我必须在这些属性中做出选择,我将首先嗅出userLanguage,然后返回language,然后(如果它们不匹配任何可用的语言)再查看browserLanguage,最后查看systemLanguage。
如果你可以把一个服务器端脚本放在网络上的其他地方,它只是读取Accept-Language报头,并将其作为JavaScript文件返回,报头值在字符串中,例如:
var acceptLanguage= 'en-gb,en;q=0.7,de;q=0.3';
然后你可以在HTML中包含一个指向外部服务的<script src>,并使用JavaScript来解析语言头。不过,我不知道有任何现有的库代码可以做到这一点,因为Accept-Language解析几乎总是在服务器端完成。
无论你最终做什么,你肯定需要一个用户覆盖,因为它总是会猜错一些人。通常把语言设置放在URL中是最简单的。http://www.example.com/en/site vs http://www.example.com/de/site),并让用户单击两者之间的链接。有时,您确实希望两种语言版本都有一个URL,在这种情况下,您必须将设置存储在cookie中,但这可能会使不支持cookie和搜索引擎的用户代理感到困惑。
其他回答
本文建议使用浏览器导航器对象的以下属性:
导航器。语言(Netscape -浏览器本地化) 导航器。browserLanguage(特定于ie的浏览器本地化语言) 导航器。systemLanguage(特定于ie - Windows操作系统-本地化语言) navigator.userLanguage
将这些转换成javascript函数,在大多数情况下,您应该能够猜出正确的语言。确保优雅地降级,所以有一个包含语言选择链接的div,这样如果没有javascript或方法不起作用,用户仍然可以决定。如果它起作用了,就隐藏div。
在客户端执行此操作的唯一问题是,您要么将所有语言提供给客户端,要么必须等到脚本运行并检测到该语言后才能请求正确的版本。也许将最流行的语言版本作为默认设置会激怒最少的人。
编辑:我赞同Ivan的cookie建议,但要确保用户以后可以随时更改语言;不是每个人都喜欢浏览器默认的语言。
我对此做了一些研究,并在下表中总结了我的发现
所以推荐的解决方案是写一个服务器端脚本来解析Accept-Language报头,并将其传递给客户端来设置网站的语言。奇怪的是,为什么需要服务器来检测客户端的语言偏好,但这就是目前的情况。还有其他各种各样的黑客可以检测语言,但根据我的理解,阅读Accept-Language报头是推荐的解决方案。
正确的方法是查看发送到服务器的HTTP Accept-Language报头。这包含用户配置浏览器首选的有序、加权的语言列表。
不幸的是,这个头文件不能在JavaScript中读取;你得到的只是导航器。语言,它会告诉您安装的web浏览器的本地化版本。这与用户的首选语言不一定是一回事。在IE上,你得到的是systemLanguage(操作系统安装的语言),browserLanguage(与language相同)和userLanguage(用户配置的操作系统区域),这些都同样没有帮助。
如果我必须在这些属性中做出选择,我将首先嗅出userLanguage,然后返回language,然后(如果它们不匹配任何可用的语言)再查看browserLanguage,最后查看systemLanguage。
如果你可以把一个服务器端脚本放在网络上的其他地方,它只是读取Accept-Language报头,并将其作为JavaScript文件返回,报头值在字符串中,例如:
var acceptLanguage= 'en-gb,en;q=0.7,de;q=0.3';
然后你可以在HTML中包含一个指向外部服务的<script src>,并使用JavaScript来解析语言头。不过,我不知道有任何现有的库代码可以做到这一点,因为Accept-Language解析几乎总是在服务器端完成。
无论你最终做什么,你肯定需要一个用户覆盖,因为它总是会猜错一些人。通常把语言设置放在URL中是最简单的。http://www.example.com/en/site vs http://www.example.com/de/site),并让用户单击两者之间的链接。有时,您确实希望两种语言版本都有一个URL,在这种情况下,您必须将设置存储在cookie中,但这可能会使不支持cookie和搜索引擎的用户代理感到困惑。
你说你的网站有Flash,那么,作为另一种选择,你可以通过Flash .system. capabilities获得操作系统的语言。语言-参见如何确定浏览器内的操作系统语言,以猜测操作系统的区域设置。
将其从JavaScript移植来检测浏览器语言偏好
https://stackoverflow.com/a/42649975/1548557
我刚想到这个。它结合了较新的JS解构语法和一些标准操作来检索语言和区域设置。
var [lang, locale] = (
(
(
navigator.userLanguage || navigator.language
).replace(
'-', '_'
)
).toLowerCase()
).split('_');
希望它能帮助到别人
**更新:**我还建议测试这个,并结合其他答案,例如https://stackoverflow.com/a/52112155/1548557,这似乎是一个更健壮的方式来获得语言。我们也有零并集??所以||可能不是最好的方法。我想象这就像
var [lang, locale] = (
(
getBrowserLanguage()
.replace('-', '_')
).toLowerCase()
).split('_');
请注意,我没有强制lang或locale的默认值,而您可以这样做。世界是如此以英语为中心,我选择英语,但我不觉得这对我编码的任何人都有好处。我也没有调用getBrowserLanguage getNavigatorLanguage,这是故意的。也许你用的是导航器,但将来可能会用到其他东西。这确实是一种偏好。无论如何,我希望这仍然有用。