【问题标题】:Locale: Browser or OS Setting?区域设置:浏览器或操作系统设置?
【发布时间】:2011-08-02 12:12:15
【问题描述】:

当“语言环境”设置为例如日本人?这是否意味着浏览器已准备好识别日文字符?或者,它与操作系统设置更相关?

与 i18n(国际化和本地化)相关,我们如何检测访问我们网站的用户是否拥有例如使用 JavaScript 的日本语言环境?下面的简单检查就足够了吗?

var userLocale = navigator.language || navigator.userLanguage;
if (userLocale.toLowerCase() == 'ja-jp') { ... }

日语语言环境浏览器能否返回其他内容而不是 ja-jp

先谢谢了。

【问题讨论】:

  • 顺便说一句。如果 Siku-Siku.com 是您的域名,如果您想在波兰开展业务,我建议您选择其他域名。这在波兰语中听起来太有趣了。
  • 谢谢,帕维尔!在一种语言中的好意思在另一种语言中可能真的很有趣;很高兴这不是刻薄或不礼貌的事情。 :)

标签: javascript localization internationalization


【解决方案1】:

首先我们需要定义什么是语言环境。在您使用的上下文中,它是ISO639 Language Identifier,可选地后跟ISO3166 Country Identifier。这用于确定最终用户的偏好(例如本地化内容的语言或日期和时间格式以及数字格式)。

现在,可以在多个位置设置区域设置。操作系统通常有多种设置,例如键盘布局、格式首选项、语言首选项、代码页(用于非 Unicode 程序)等。
除此之外,网络浏览器通常允许您选择自己的偏好(Safari 是一个例外)。这些首选项通过 HTTP Accept-Language 标头与每个请求一起发送到 Web 服务器。这是您应该在服务器端以某种方式阅读的内容(不幸的是,这意味着 PHP、C#、Java 等中的一些服务器端代码)并且可能传递给您的客户端脚本。
我必须在这里声明,像 navigator.language 这样的东西不是可行的方法,原因有两个:

  1. 这不是跨浏览器兼容的,即其他 Web 浏览器需要不同的代码。也就是说,如果他们首先允许阅读这些信息。

  2. 此设置通常是指网络浏览器的语言(网络浏览器的用户界面被翻译成的语言),与实际用户的偏好无关。

所以回答你的问题:不,这个检查是不够的。

【讨论】:

  • HTTP Accept-Language 跨浏览器是否兼容?
  • Accept-Language 是超文本传输​​协议 (HTTP) 标头之一,因此它必须是跨浏览器兼容的。
【解决方案2】:

这主要是一个操作系统/浏览器设置,控制例如操作系统的语言、日期/时间格式、小数点/逗号等 - 换句话说,设置在世界不同地区有所不同。这与字体/字符支持没有直接关系。

据我所知,ja-jp 是唯一标准化的日语语言环境/语言组合;但正如 @Siku-siku.com 在 cmets 中建议的那样“(基于使用日文版 IE/WinXP 进行的实际测试)还要检查 ja,因为这是 IE 语言设置中的可用选项之一。”

【讨论】:

  • 那么,要检测语言环境,是否建议检查浏览器中设置的语言首选项(例如Tools > Internet Options > General > Languages)或操作系统设置(例如Start > Control Panel > Regional and Language Options > Regional Options)?
  • 您无法从浏览器内的 JavaScript 访问其中任何一个,因此最好的选择是您发布的代码。
  • 上面的 sn-p 实际上拉入了使用后一种方法(控制面板)设置的值,这里也有讨论:*.com/questions/1043339/…
  • 正如您在链接到的问题中所讨论的那样,此数据到达的地方相当依赖于浏览器(并且不相关)。
  • 一个建议(基于使用日文版 IE/WinXP 进行的实际测试)是同时检查 ja,因为这是 IE 语言设置中的可用选项之一。