浏览器请求 header "Accept-Language" 不发送国家

browser request header "Accept-Language" does not send country

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

  1. 浏览器语言已设置为"Hindi"
  2. 操作系统国家/地区已设置为 "India"
  3. 我向服务器发送请求,希望 "Accept-Language" header 为 hi-IN,但无论我 [=50= 上的国家/地区设置如何,该值仍然是 hi ] ...实际值Accept-Language:hi;en-US,en;q=0.8,q=0.6
  4. 我的 webapp 使用请求中的传入值 header 并通过从资源文件加载适当的语言翻译来相应地执行 i18n 或 l10n
  5. 我有一个测试用例,我在其中手动发送 new Locale("hi", "IN") 以指示语言和国家/地区。此测试用例按我的预期以正确的语言打印值,但由于来自请求的值仅为 hi,我无法看到所需的结果。

不确定为什么浏览器(Chrome 和 Firefox)不支持他们选择的所有条目的 language_country 格式。我有什么想念的吗?

编辑:我根据@pawel-dyda的回答做了一些更正。引用他的部分回复

Your language tag should be hi-IN, which I believe should explain the odd behaviour.

问题的关键(我在这里提出这个问题的原因)是我无法让我的浏览器将值 hi-IN 发送到 Accept-Language header.

我认为你遗漏了一些东西。

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

关于第 3 点和第 5 点...好吧,您给出了 Accept-Language 列表的示例。请仔细看一下:它包含 en-US,即英语(美国)。你的语言标签应该是 hi-IN,我相信这应该可以解释奇怪的行为。

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

  1. 您可以实施用户配置文件并让用户选择 his/her 首选 UI 语言和格式设置(最好将它们分开)。
  2. 您可以"guess"最有可能的国家。对于印地语,很明显猜测的结果是什么。例如在德国 ("default")、奥地利和瑞士使用德语的情况下会稍微复杂一些。显然还有更多的情况,如果你想在"guessing"中寻求帮助,CLDR是最好的信息来源。
  3. 最好的方法是在用户配置文件中实际实施区域设置,但使用基于从 CLDR 获取的数据的智能猜测;基本上你结合点 1 和 2.

并且不要忘记回退!那是语言环境回退(遍历 Accept-Language header 中的列表,直到找到您的应用程序支持的内容)和资源回退(如果您有 messages_fr.properties,但没有 messages_fr_ca.properties,但请求是 fr-CA,return 先前文件的法语翻译是有意义的。

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