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

Jon*_*Job 9 javascript browser locale localization

在编码网站和格式化日期时,我想使用用户在浏览器中设置的区域设置。

例如,如果用户chrome://settings/languages将 Chrome 中的设置自定义为非默认值,这就是我想要使用的值。

但是,当我在这样一个浏览器的控制台中运行下面的代码时,我得到了两个不同的值。

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

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

这两个项目的 MDN 似乎(对我来说)表明它们应该返回相同的值:

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

kim*_*ula 10

我使用的是 macOS,发现 Chromenavigator.languages反映了浏览器语言设置,同时Intl.DateTimeFormat().resolvedOptions().locale反映了操作系统语言设置。不知道其他操作系统是否也出现这种情况。


Hug*_*ugo 8

我也看到了这一点并做了一些测试。

铬合金

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

  1. 按优先顺序排列的语言列表。这看来是开车了navigator.languages
  2. 用于“显示 Google Chrome UI”的语言。这看来是开车了Intl.DateTimeFormat().resolvedOptions().locale

例如当我有这个集合时: 谷歌浏览器语言设置

我明白了:

navigator.languages                            : en-US, en-GB, en
navigator.language                             : en-US
Intl.DateTimeFormat().resolvedOptions().locale : en-GB
Run Code Online (Sandbox Code Playgroud)

请注意,在装有 Chrome 85 的 Mac 上似乎没有这两个单独的设置,而只是设置语言顺序的功能(不是将语言设置为“显示 Google Chrome UI”的选项)。

节点

在 Node 中,我发现 的值Intl.DateTimeFormat().resolvedOptions().locale是由操作系统的语言设置驱动的。注意我只在 Windows 上测试过这一点,但我认为其他地方也是如此。

关于时区的旁注

我发现Intl.DateTimeFormat().resolvedOptions().timeZoneChrome 和 Node 都使用操作系统的时区设置(也仅在 Windows 上进行了测试)。Chrome 的设置中似乎没有自己的时区设置,所以我猜只是使用操作系统配置。