Intl
Baseline 广泛可用 *
Intl 命名空间对象包含几个构造函数以及国际化构造函数和其他语言敏感函数共有的功能。总而言之,它们构成了 ECMAScript 国际化 API,该 API 提供了语言敏感的字符串比较、数字格式化、日期和时间格式化等功能。
描述
与大多数全局对象不同,Intl 不是构造函数。您不能使用 new 操作符 来使用它,也不能将 Intl 对象作为函数调用。Intl 的所有属性和方法都是静态的(就像 Math 对象一样)。
国际化构造函数以及其他构造函数(在 另请参阅 下列出)的几个语言敏感方法使用一种通用模式来识别 locale 并确定实际使用的 locale:它们都接受 locales 和 options 参数,并使用 options.localeMatcher 属性中指定的算法来协商请求的 locale(s) 与其支持的 locale(s)。
locales 参数
locales 参数用于确定给定操作中使用的 locale。JavaScript 实现会检查 locales,然后计算出它所理解的、最接近满足所表达偏好的 locale。locales 可以是:
undefined(或省略):将使用实现的默认 locale。- 一个 locale:一个 locale 标识符或一个包装了 locale 标识符的
Intl.Locale对象。 - 一个 locale 列表:任何其他值,它将被转换为一个对象,然后被视为一个 locale 数组。
在后两种情况下,实际使用的 locale 是通过 locale 协商 确定的最佳支持 locale。如果 locale 标识符不是字符串或对象,则会抛出 TypeError。如果 locale 标识符是语法无效的字符串,则会抛出 RangeError。如果 locale 标识符格式正确但实现不识别它,则会忽略它,并考虑列表中的下一个 locale,最终回退到系统的 locale。但是,您不应依赖某个特定的 locale 名称被忽略,因为实现将来可能会添加任何 locale 的数据。例如,new Intl.DateTimeFormat("default") 仅因为 "default" 在语法上有效但未被识别为任何 locale,所以使用了实现的默认 locale。
locale 标识符是一个由以下部分组成的字符串:
- 一个 2-3 或 5-8 个字母的语言子标签
- 一个 4 个字母的脚本子标签 可选
- 一个 2 个字母或 3 个数字的地区子标签 可选
- 一个或多个变体子标签(所有这些子标签都必须是唯一的),每个子标签由 5-8 个字母数字字符组成,或者是一个数字后跟 3 个字母数字字符 可选
- 一个或多个 BCP 47 扩展序列 可选
- 一个私有使用扩展序列 可选
每个子标签和序列都由连字符分隔。Locale 标识符是区分 ASCII 大小写的。但是,习惯上对脚本子标签使用标题大小写(首字母大写,其余字母小写),对地区子标签使用大写,对其他所有部分使用小写。例如:
"hi":印地语(语言)"de-AT":在奥地利(地区)使用的德语(语言)"zh-Hans-CN":在 China(地区)使用的简体汉字(脚本)"en-emodeng":古英语(语言)的“中古英语”方言(变体)
标识语言、脚本、地区(包括国家)和(很少使用)变体的子标签在 IANA Language Subtag Registry 中注册。此注册表会随着时间定期更新,实现可能并非始终是最新的,因此不要过度依赖子标签的普遍支持。
BCP 47 扩展序列由单个数字或字母(“x”除外)和一或多个由连字符分隔的 2-8 个字母数字子标签组成。每个数字或字母只允许一个序列:"de-a-foo-a-foo" 是无效的。BCP 47 扩展子标签在 Unicode CLDR Project 中定义。目前只有两个扩展具有定义的语义:
-
"u"(Unicode)扩展可用于请求对IntlAPI 对象的额外自定义。示例:"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-umalqura":使用英式英语和 Umm al-Qura(回历)历,其中公历日期 2017 年 10 月 14 日是回历日期 1439 年 1 月 24 日。
-
"t"(transformed)扩展表示转换后的内容:例如,从另一种 locale 翻译过来的文本。目前没有Intl功能考虑"t"扩展。但是,此扩展有时包含嵌套的 locale(无扩展):例如,"de-t-en"中的转换扩展包含英语的 locale 标识符。如果存在嵌套的 locale,则它必须是有效的 locale 标识符。例如,因为"en-emodeng-emodeng"无效(因为它包含重复的emodeng变体子标签),所以"de-t-en-emodeng-emodeng"也无效。
最后,可能出现一个私有使用扩展序列,使用字母 "x",后跟一或多个由连字符分隔的 1-8 个字母数字子标签。这允许应用程序为其自己的私有使用编码信息,而这些信息将被所有 Intl 操作忽略。
options 参数
options 参数必须是一个对象,其属性因构造函数和函数而异。如果未提供 options 参数或其值为 undefined,则所有属性都使用默认值。
所有语言敏感的构造函数和函数都支持一个属性:localeMatcher 属性,其值必须是字符串 "lookup" 或 "best fit",它选择以下介绍的 locale 匹配算法之一。
Locale 识别和协商
locales 参数指定的 locale 列表,在从中删除 Unicode 扩展后,被解释为应用程序的优先级请求。运行时将其与可用 locale 进行比较,并选择最佳可用 locale。存在两种匹配算法:"lookup" 匹配器遵循 BCP 47 中指定的查找算法;"best fit" 匹配器允许运行时提供一个至少与请求匹配,甚至可能更适合请求的 locale,而不是查找算法的结果。如果应用程序未提供 locales 参数,或者运行时没有与请求匹配的 locale,则使用运行时的默认 locale。可以使用 options 参数的属性来选择匹配器(见下文)。
如果选定的 locale 标识符具有 Unicode 扩展序列,则该扩展现在用于自定义构造的对象或函数的行为。每个构造函数或函数仅支持 Unicode 扩展定义键的子集,并且支持的值通常取决于 locale 标识符。例如,"co"(排序)键仅被 Intl.Collator 支持,并且其 "phonebk" 值仅对德语有效。
静态属性
Intl.Collator-
用于排序器的构造函数,这些对象允许语言敏感的字符串比较。
Intl.DateTimeFormat-
用于允许语言敏感的日期和时间格式化的对象的构造函数。
Intl.DisplayNames-
用于允许一致翻译语言、地区和脚本显示名称的对象的构造函数。
Intl.DurationFormat-
用于允许 locale 敏感的时长格式化的对象的构造函数。
Intl.ListFormat-
用于允许语言敏感的列表格式化的对象的构造函数。
Intl.Locale-
用于表示 Unicode locale 标识符的对象的构造函数。
Intl.NumberFormat-
用于允许语言敏感的数字格式化的对象的构造函数。
Intl.PluralRules-
用于允许复数敏感的格式化以及复数的特定语言规则的对象的构造函数。
Intl.RelativeTimeFormat-
用于允许语言敏感的相对时间格式化的对象的构造函数。
Intl.Segmenter-
用于允许 locale 敏感的文本分段的对象的构造函数。
Intl[Symbol.toStringTag]-
[Symbol.toStringTag]属性的初始值为字符串"Intl"。此属性用于Object.prototype.toString()。
静态方法
Intl.getCanonicalLocales()-
返回规范化的 locale 名称。
Intl.supportedValuesOf()-
返回一个包含实现支持的唯一日历、排序、货币、编号系统或单位值的排序数组。
示例
格式化日期和数字
您可以使用 Intl 将日期和数字格式化为特定语言和地区的惯用形式。
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
使用浏览器的首选语言
而不是将硬编码的 locale 名称传递给 Intl 方法,您可以使用由 navigator.language 提供的用户的首选语言。
const date = new Date("2012-05-24");
const formattedDate = new Intl.DateTimeFormat(navigator.language).format(date);
或者,navigator.languages 属性提供用户首选语言的排序列表。此列表可以直接传递给 Intl 构造函数,以实现基于首选项的回退 locale 选择。 locale 协商 过程用于选择最合适的可用 locale。
const count = 26254.39;
const formattedCount = new Intl.NumberFormat(navigator.languages).format(count);
规范
| 规范 |
|---|
| ECMAScript® 2026 国际化 API 规范 # intl-object |
浏览器兼容性
加载中…
另见
Keyboard.getLayoutMap()navigator.languagenavigator.languages- ECMAScript 国际化 API,作者:Norbert Lindenberg (2012)