浏览器请求标头“Accept-Language”不发送国家/地区

时间:2015-11-06 09:58:59

标签: google-chrome firefox internationalization http-headers locale

我正在我的webapp中实现i18n,目前正处于测试阶段。我在服务器端使用java.util.Locale将语言环境传递给使用该信息的相关API(日期时间等)。这是我的设置:

  1. 浏览器语言已设为“印地语”
  2. 操作系统国家/地区已设置为“India”
  3. 我向服务器发送一个请求,希望“Accept-Language”标头为hi-IN,但无论我的操作系统上的国家/地区设置如何,该值仍为hi ...实际值{{1} }
  4. 我的webapp使用请求标头中的传入值,并通过从资源文件加载适当的语言翻译来相应地执行i18n或l10n
  5. 我有一个测试用例,我手动发送Accept-Language:hi;en-US,en;q=0.8,q=0.6来表示语言和国家/地区。此测试用例按照我的预期以正确的语言打印值,但由于请求中的值仅为new Locale("hi", "IN"),因此无法看到所需的结果。
  6. 不确定为什么浏览器(Chrome和Firefox)不支持所选条目中hi格式的所有条目。有什么我想念的吗?

    编辑:我根据@ pawel-dyda的回答做了一些修改。引用他的一部分答案

      

    你的语言标签应该是hi-IN,我认为应该解释这种奇怪的行为。

    问题的关键(我在这里提出这个问题的原因)是我无法让我的浏览器在language_country标题中将值hi-IN发送到服务器。

1 个答案:

答案 0 :(得分:1)

我认为你缺少一些东西。

关于第二点,设置操作系统国家/地区通常不会影响Web浏览器在其Accept-Language列表上发送的内容。通常,因为我可以给你一个反例:Mac OS X上的Safari 它对移动网络浏览器有一定影响,但我自己还没有进行任何测试。

关于第3点和第5点......嗯,你举了一个Accept-Language列表的例子。请仔细查看:它包含en-US,即英语(美国)。您的语言标记应为hi-IN,我认为应该解释这种奇怪的行为。

我不确定你在第4点的含义。不知道实现细节,我只能猜测你是在尝试加载资源文件(并且根据语言环境格式判断它是Java属性...... )以及格式化等内容的默认值 对于属性文件通常(并不总是!)语言就足够了。但格式化存在问题 好吧,大多数时候你只会接受语言,你别无选择,只能接受这个事实。有两种方法可以缓解此问题:

  1. 您可以实现用户个人资料,并让用户选择他/她首选的用户界面语言和格式设置(最好将这些设置分开)。
  2. 你可以猜测"最有可能的国家。在印地语的情况下,猜测的结果是非常明显的。例如,在德国("默认"),奥地利和瑞士使用德语时,情况稍微复杂一些。显然还有更多的案例,如果你想在"猜测"中找到帮助,CLDR是最好的信息来源。
  3. 最好的方法是在用户配置文件中实际实现区域设置,但是使用基于从CLDR获取的数据的智能猜测;基本上你把点1和1组合在一起2。
  4. 不要忘记后退!这是区域设置回退(通过Accept-Language标题中的列表,直到找到您的应用程序支持的内容)和资源回退(如果您有messages_fr.properties,但没有messages_fr_ca.properties,但请求来了如fr-CA,从前一个文件返回法语翻译是有意义的。

    顺便说一句:您可以打开Firefox about:config网站。它有一个名为intl.accept_languages的设置。我打赌,如果你改变它的内容,你就能发送你想要的东西。但是,正如我所说它没用,因为用户不会改变他们的设置......