浏览器默认区域设置 - Intl.DateTimeFormat 与 navigator.language

问题描述 投票:0回答:3
在对网站进行编码并格式化日期时,我想使用用户在浏览器中设置的区域设置。

例如,如果用户将 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 似乎(对我来说)表明它们应该返回相同的值:

  • NavigatorLanguage.language
    返回代表用户首选语言的字符串

  • Intl.DateTimeFormat 语言环境参数
    要使用浏览器的默认区域设置,请省略此参数或传递 undefined。

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

javascript browser localization locale
3个回答
14
投票
我使用的是 macOS,发现 Chrome 的

navigator.languages

 反映了浏览器语言设置,而 
Intl.DateTimeFormat().resolvedOptions().locale
 反映了操作系统语言设置。不知道其他操作系统是否也是这样。


10
投票
我也看到了这个并做了一些测试。

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

    按优先顺序排列的语言列表。这似乎会驱动
  1. navigator.languages
  2. 一种用于“显示 Google Chrome UI”的语言。这似乎会驱动
  3. 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 UI”的选项)。

节点

在 Node 中,我发现

Intl.DateTimeFormat().resolvedOptions().locale

 的值是由操作系统的语言设置驱动的。注意我只在 Windows 上测试过这一点,但我认为其他地方也是如此。

时区旁注

我看到,对于

Intl.DateTimeFormat().resolvedOptions().timeZone

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


0
投票
我已经很久没有访问过这个问题了,但是它又把我的注意力拉了回来,我又看了一遍。这些 API 的文档已得到改进,我现在想我知道发生了什么。

如前所述,

window.navigator.language

确实是
“代表用户首选语言的字符串”,您可以在浏览器设置中配置该字符串。您还可以使用 window.navigator.languages
 获取它们定义的所有语言的有序列表。

我之前假设

new Intl.DateTimeFormat().resolvedOptions().locale

会在内部考虑用户配置的首选项,但我认为这个假设是错误的。  
Intl
函数似乎只使用您明确传递给它们的区域设置,如果您不传递任何区域设置,它会使用
“浏览器的默认区域设置”而不是浏览器用户的默认区域设置,而不是底层操作系统的区域设置。

所以,如果你真的运行这个:

new Intl.DateTimeFormat(window.navigator.languages).resolvedOptions().locale
然后您将获得 DateTimeFormat 正在使用的区域设置,该区域设置源自用户按偏好顺序指定的语言。

所以,我学到的教训是,在使用

Intl

 函数时,您应该自己指定区域设置。


一些可能有用的附加链接:

© www.soinside.com 2019 - 2024. All rights reserved.