Intl

基线 广泛可用

此功能已得到完善,可在许多设备和浏览器版本上使用。自 2017 年 9 月.

Intl 命名空间对象包含多个构造函数以及国际化构造函数和其它语言敏感函数的通用功能。总的来说,它们构成了 ECMAScript 国际化 API,它提供了语言敏感的字符串比较、数字格式化、日期和时间格式化等等。

描述

与大多数全局对象不同,Intl 不是构造函数。你不能将其与 new 运算符 一起使用,也不能将 Intl 对象作为函数调用。Intl 的所有属性和方法都是静态的(就像 Math 对象一样)。

国际化构造函数以及其它构造函数的几个语言敏感方法(列在 另请参阅 中)使用一个用于标识语言环境并确定它们实际使用的语言环境的通用模式:它们都接受 localesoptions 参数,并使用 options.localeMatcher 属性中指定的算法,将请求的语言环境与它们支持的语言环境进行协商。

locales 参数

locales 参数用于确定在给定操作中使用的语言环境。JavaScript 实现会检查 locales,然后计算出它理解的、最接近于满足表达的偏好的语言环境。locales 可以是

  • undefined(或省略):将使用实现的默认语言环境。
  • 一个语言环境:一个语言环境标识符或一个 Intl.Locale 对象,它封装了一个语言环境标识符。
  • 语言环境列表:任何其它值,它将被转换为对象,然后作为语言环境数组处理。

在后两种情况下,实际使用的语言环境是通过 语言环境协商 确定的最佳支持语言环境。如果语言环境标识符不是字符串或对象,则会抛出 TypeError。如果语言环境标识符是语法上无效的字符串,则会抛出 RangeError。如果语言环境标识符格式正确,但实现无法识别,则会将其忽略,并考虑列表中的下一个语言环境,最终回退到系统的语言环境。但是,你不应依赖于某个特定的语言环境名称被忽略,因为实现可能会在将来为任何语言环境添加数据。例如,new Intl.DateTimeFormat("default") 仅使用实现的默认语言环境,因为 "default" 在语法上是有效的,但未被识别为任何语言环境。

语言环境标识符是一个字符串,它包含

  1. 一个包含 2-3 个或 5-8 个字母的语言子标签
  2. 一个包含 4 个字母的脚本子标签 可选
  3. 一个包含 2 个字母或 3 个数字的区域子标签 可选
  4. 一个或多个变体子标签(所有这些子标签都必须是唯一的),每个子标签都包含 5-8 个字母数字或一个数字后跟 3 个字母数字 可选
  5. 一个或多个 BCP 47 扩展序列 可选
  6. 一个私有使用扩展序列 可选

每个子标签和序列都用连字符隔开。语言环境标识符不区分大小写 ASCII。但是,通常使用标题大小写(第一个字母大写,后面的字母小写)表示脚本子标签,使用大写表示区域子标签,使用小写表示其他所有内容。例如

  • "hi":印地语(语言)
  • "de-AT":德语(语言)在奥地利(区域)的使用情况
  • "zh-Hans-CN":汉语(语言)用简体字(脚本)书写,在中国(区域)使用
  • "en-emodeng":英语(语言)在“早期现代英语”方言(变体)中的使用情况

标识语言、脚本、区域(包括国家/地区)和(很少使用)变体的子标签在 IANA 语言子标签注册表 中注册。该注册表会定期更新,实现可能并不总是最新,因此不要过分依赖于子标签得到普遍支持。

BCP 47 扩展序列由一个数字或字母(除了 "x")和一个或多个由连字符隔开的 2-8 个字母或数字子标签组成。每个数字或字母只允许一个序列:"de-a-foo-a-foo" 是无效的。BCP 47 扩展子标签在 Unicode CLDR 项目 中定义。目前,只有两个扩展具有定义的语义

  • "u"(Unicode)扩展可用于请求对 Intl API 对象的额外定制。示例
    • "de-DE-u-co-phonebk":使用德语排序规则的电话簿变体,它将带变音符的元音解释为相应的字符对:ä → ae,ö → oe,ü → ue。
    • "th-TH-u-nu-thai":在数字格式化中使用泰语数字(๐,๑,๒,๓,๔,๕,๖,๗,๘,๙)。
    • "ja-JP-u-ca-japanese":在日期和时间格式化中使用日本历法,因此 2013 年表示为平成时代第 25 年,或平成 25。
    • "en-GB-u-ca-islamic":使用英国英语和伊斯兰(伊斯兰)历法,其中公历日期 2017 年 10 月 14 日是伊斯兰历日期 1439 年穆哈兰姆 24 日。
  • "t"(转换)扩展表示转换后的内容:例如,从另一个语言环境翻译的文本。目前,没有 Intl 功能考虑 "t" 扩展。但是,此扩展有时包含一个嵌套的语言环境(没有扩展):例如,"de-t-en" 中的转换扩展包含英语的语言环境标识符。如果存在嵌套语言环境,它必须是一个有效的语言环境标识符。例如,因为 "en-emodeng-emodeng" 是无效的(因为它包含重复的 emodeng 变体子标签),所以 "de-t-en-emodeng-emodeng" 也是无效的。

最后,可以使用字母 "x" 的私有使用扩展序列可能会出现,后跟一个或多个由连字符隔开的 1-8 个字母或数字子标签。这允许应用程序为其自己的私有使用编码信息,这些信息将被所有 Intl 操作忽略。

options 参数

options 参数必须是一个对象,其属性在构造函数和函数之间有所不同。如果未提供 options 参数或 options 参数为 undefined,则所有属性都使用默认值。

所有语言敏感构造函数和函数都支持一个属性:localeMatcher 属性,其值必须是字符串 "lookup""best fit",它选择下面描述的两种语言环境匹配算法之一。

语言环境识别和协商

locales 参数指定的语言环境列表,在从中删除 Unicode 扩展后,被解释为应用程序的优先请求。运行时会将其与可用的语言环境进行比较,并选择最佳可用的语言环境。存在两种匹配算法:"lookup" 匹配器遵循 BCP 47 中指定的查找算法;"best fit" 匹配器允许运行时提供一个至少与查找算法结果一样适合请求的语言环境,甚至可能更适合请求。如果应用程序没有提供 locales 参数,或者运行时没有匹配请求的语言环境,则使用运行时的默认语言环境。可以使用 options 参数的属性选择匹配器(见下文)。

如果选择的语言环境标识符具有 Unicode 扩展序列,则该扩展现在用于自定义构造的对象或函数的行为。每个构造函数或函数仅支持 Unicode 扩展为其定义的键的子集,并且支持的值通常取决于语言环境标识符。例如,"co" 键(排序规则)仅受 Intl.Collator 支持,并且其 "phonebk" 值仅在德语中受支持。

静态属性

Intl.Collator

用于排序规则的构造函数,排序规则是用于启用语言敏感的字符串比较的对象。

Intl.DateTimeFormat

用于对象的构造函数,这些对象用于启用语言敏感的日期和时间格式化。

Intl.DisplayNames

用于对象的构造函数,这些对象用于启用语言、区域和脚本显示名称的一致翻译。

Intl.DurationFormat

用于对象的构造函数,这些对象用于启用语言敏感的持续时间格式化。

Intl.ListFormat

用于对象的构造函数,这些对象用于启用语言敏感的列表格式化。

Intl.Locale

用于对象的构造函数,这些对象表示 Unicode 语言环境标识符。

Intl.NumberFormat

用于对象的构造函数,这些对象用于启用语言敏感的数字格式化。

Intl.PluralRules

用于对象的构造函数,这些对象用于启用复数敏感的格式化以及语言特定的复数规则。

Intl.RelativeTimeFormat

用于创建可实现语言敏感的相对时间格式化对象的构造函数。

Intl.Segmenter

用于创建可实现区域设置敏感文本分段对象的构造函数。

Intl[Symbol.toStringTag]

[Symbol.toStringTag] 属性的初始值为字符串 "Intl"。此属性用于 Object.prototype.toString()

静态方法

Intl.getCanonicalLocales()

返回规范的区域设置名称。

Intl.supportedValuesOf()

返回一个排序后的数组,其中包含实现支持的唯一日历、排序规则、货币、数字系统或单位值。

示例

格式化日期和数字

您可以使用 Intl 将日期和数字格式化为特定语言和地区的常规形式。

js
const count = 26254.39;
const date = new Date("2012-05-24");

function log(locale) {
  console.log(
    `${new Intl.DateTimeFormat(locale).format(date)} ${new Intl.NumberFormat(
      locale,
    ).format(count)}`,
  );
}

log("en-US"); // 5/24/2012 26,254.39

log("de-DE"); // 24.5.2012 26.254,39

使用浏览器的首选语言

您可以使用 navigator.language 提供的用户首选语言,而不是向 Intl 方法传递硬编码的区域设置名称。

js
const date = new Date("2012-05-24");

const formattedDate = new Intl.DateTimeFormat(navigator.language).format(date);

或者,navigator.languages 属性提供用户首选语言的排序列表。此列表可以直接传递给 Intl 构造函数,以实现基于偏好的区域设置回退选择。区域设置协商 过程用于选择最合适的可用区域设置。

js
const count = 26254.39;

const formattedCount = new Intl.NumberFormat(navigator.languages).format(count);

规范

规范
ECMAScript 国际化 API 规范
# intl-object

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅