浏览器默认语言环境 - Intl.DateTimeFormat与navigator.language

18

当编写网站并格式化日期时,我希望使用用户在其浏览器中设置的语言环境。

例如,如果用户在Chrome的chrome://settings/languages设置中自定义了语言环境,则我想使用该值。

然而,当我在这样的浏览器控制台中运行以下代码时,我会得到两个不同的值。

 [window.navigator.language, new Intl.DateTimeFormat().resolvedOptions().locale]
// Array [ "en-AU", "en-US" ]

navigator.language给出了预期的值,但new Intl.DateTimeFormat().resolvedOptions().locale没有。

我认为MDN对这两个项目的解释都表明它们应该返回相同的值:

这两个调用是否应该返回用户在其浏览器设置中配置的区域设置?

2个回答

10

我正在使用 macOS,并发现 Chrome 的 navigator.languages 反映了浏览器语言设置,而 Intl.DateTimeFormat().resolvedOptions().locale 反映了操作系统语言设置。不知道其他操作系统是否也是这样。


我的 MacBook 的语言设置是 en-US,但我的地区设置为 de 并且时间格式也是德国的,但是当调用 Intl.DateTimeFormat().resolvedOptions().locale 时,它返回的是 en-US 而不是应该返回的 en-DE - Martin Braun

8

我也看到了这个,并进行了一些测试。

Chrome

在 Windows 版 Chrome 85 中,提供了两种不同的设置语言方式:

  1. 按偏好顺序排列的语言列表。这似乎驱动 navigator.languages
  2. 用于“显示 Google Chrome 用户界面”的语言。这似乎驱动 Intl.DateTimeFormat().resolvedOptions().locale

例如,当我将其设置为如下内容时: Google Chrome language settings

我会得到这个结果:

navigator.languages                            : en-US, en-GB, en
navigator.language                             : en-US
Intl.DateTimeFormat().resolvedOptions().locale : en-GB

请注意,在使用Chrome 85版本的Mac上似乎没有这两个单独的设置,而只能设置语言顺序(不能设置语言以“显示Google Chrome用户界面”的选项)。
Node中,我发现Intl.DateTimeFormat().resolvedOptions().locale的值由我的操作系统语言设置驱动。请注意,我只在Windows上测试过,但我认为其他地方也是如此。
关于时区的附注:我发现对于Intl.DateTimeFormat().resolvedOptions().timeZone,Chrome和Node都使用操作系统的时区设置(同样只在Windows上测试)。Chrome似乎没有自己的时区设置,因此我想它只是使用操作系统的配置。

感谢您关注此事,但不幸的是,这种方法对我来说似乎无效(在Windows上)。我的Chrome语言列表中的第一种语言也被列为“此语言用于显示Google Chrome用户界面”,但是由Intl.DateTimeFormat().resolvedOptions().locale返回的是我的第二种语言。 - Jono Job
嗯,有趣。在这种情况下,我不确定,我只尝试了一些本地测试,不确定它在底层是如何工作的。 - Hugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接