例如,如果用户将 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 似乎(对我来说)表明它们应该返回相同的值:
返回代表用户首选语言的字符串
要使用浏览器的默认区域设置,请省略此参数或传递 undefined。
navigator.languages
反映了浏览器语言设置,而
Intl.DateTimeFormat().resolvedOptions().locale
反映了操作系统语言设置。不知道其他操作系统是否也是这样。
铬
navigator.languages
。
Intl.DateTimeFormat().resolvedOptions().locale
。
navigator.languages : en-US, en-GB, en
navigator.language : en-US
Intl.DateTimeFormat().resolvedOptions().locale : en-GB
请注意,在装有 Chrome 85 的 Mac 上似乎没有这两个单独的设置,而只是设置语言顺序的功能(不是用于设置语言以“显示 Google Chrome UI”的选项)。节点
Intl.DateTimeFormat().resolvedOptions().locale
的值是由操作系统的语言设置驱动的。注意我只在 Windows 上测试过这一点,但我认为其他地方也是如此。时区旁注
Intl.DateTimeFormat().resolvedOptions().timeZone
,Chrome 和 Node 都使用操作系统设置时区(也仅在 Windows 上进行了测试)。 Chrome 的设置中似乎没有自己的时区设置,所以我猜只是使用操作系统配置。
如前所述,
window.navigator.language
确实是“代表用户首选语言的字符串”,您可以在浏览器设置中配置该字符串。您还可以使用
window.navigator.languages
获取它们定义的所有语言的有序列表。我之前假设
new Intl.DateTimeFormat().resolvedOptions().locale
会在内部考虑用户配置的首选项,但我认为这个假设是错误的。
Intl
函数似乎只使用您明确传递给它们的区域设置,如果您不传递任何区域设置,它会使用“浏览器的默认区域设置”而不是浏览器用户的默认区域设置,而不是底层操作系统的区域设置。 所以,如果你真的运行这个:
new Intl.DateTimeFormat(window.navigator.languages).resolvedOptions().locale
然后您将获得 DateTimeFormat 正在使用的区域设置,该区域设置源自用户按偏好顺序指定的语言。所以,我学到的教训是,在使用
Intl
函数时,您应该自己指定区域设置。
Intl
函数时指定区域设置的简单示例
Intl
函数如何使用指定区域设置的详细信息