Node.js 的国际化(Internationalization,简称 i18n)模块允许应用程序在多语言环境中正确处理文本、日期、时间和货币格式。Node.js 提供了 Intl
对象,这是 ECMAScript 国际化 API 的一部分,主要通过各种构造函数和方法提供国际化支持。
以下是关于 Node.js 国际化(Intl
)的详细介绍,包括它的属性、方法以及使用示例。
1. Intl
对象
Intl
是 JavaScript 的全局对象之一,提供了多种构造函数和方法来支持不同的国际化需求,如格式化日期、时间、数字和货币,以及处理字符串的比较。
1.1 Intl
构造函数
Intl.Collator
: 用于比较字符串。Intl.DateTimeFormat
: 用于格式化日期和时间。Intl.NumberFormat
: 用于格式化数字(包括货币和百分比)。Intl.PluralRules
: 用于确定复数规则。Intl.RelativeTimeFormat
: 用于格式化相对时间。Intl.ListFormat
: 用于格式化列表。Intl.DisplayNames
: 用于显示各种语言、区域、脚本和货币名称。
1.2 Intl
方法
Intl.getCanonicalLocales(locales)
: 返回语言环境的规范化名称数组。
const canonicalLocales = Intl.getCanonicalLocales('EN-us');
console.log(canonicalLocales); // ["en-US"]
2. Intl.Collator
Intl.Collator
用于字符串比较,例如在不同语言环境下对字符串进行排序。
2.1 构造函数
new Intl.Collator([locales[, options]])
: 创建一个新的字符串比较对象。locales
: 可选,表示一个或多个语言环境的字符串或数组。options
: 可选,包含影响比较行为的配置。usage
:sort
或search
,默认值为sort
。sensitivity
:base
,accent
,case
或variant
。ignorePunctuation
: 是否忽略标点符号。
2.2 方法
collator.compare(string1, string2)
: 比较两个字符串,返回一个数字,指示字符串的排序顺序。
const collator = new Intl.Collator('en', { sensitivity: 'base' });
console.log(collator.compare('a', 'A')); // 0,表示相等
collator.resolvedOptions()
: 返回一个对象,表示实例的配置选项。
console.log(collator.resolvedOptions());
// {locale: "en", usage: "sort", sensitivity: "base", ignorePunctuation: false, ...}
3. Intl.DateTimeFormat
Intl.DateTimeFormat
用于格式化日期和时间,根据语言环境以不同格式展示日期和时间信息。
3.1 构造函数
new Intl.DateTimeFormat([locales[, options]])
: 创建一个日期时间格式化对象。locales
: 可选,表示一个或多个语言环境的字符串或数组。options
: 可选,包含影响日期和时间格式的配置。weekday
,era
,year
,month
,day
,hour
,minute
,second
: 用于指定时间的各个部分应该如何显示。timeZone
: 用于指定时区(如'UTC'
)。
3.2 方法
dateTimeFormat.format(date)
: 格式化指定的日期对象。
const dateFormat = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(dateFormat.format(new Date())); // September 4, 2024
dateTimeFormat.formatToParts(date)
: 将日期对象格式化为不同部分的数组。
console.log(dateFormat.formatToParts(new Date()));
// [{type: "month", value: "September"}, {type: "literal", value: " "}, ...]
dateTimeFormat.resolvedOptions()
: 返回一个对象,表示实例的配置选项。
console.log(dateFormat.resolvedOptions());
// {locale: "en-US", calendar: "gregory", numberingSystem: "latn", ...}
4. Intl.NumberFormat
Intl.NumberFormat
用于根据语言环境格式化数字,支持货币、百分比等格式。
4.1 构造函数
new Intl.NumberFormat([locales[, options]])
: 创建一个数字格式化对象。locales
: 可选,表示一个或多个语言环境的字符串或数组。options
: 可选,包含影响数字格式的配置。style
:decimal
,currency
,percent
,指定格式类型。currency
: 指定货币代码(如'USD'
)。minimumFractionDigits
,maximumFractionDigits
: 小数位数。
4.2 方法
numberFormat.format(number)
: 格式化数字。
const currencyFormat = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
console.log(currencyFormat.format(1234.56)); // $1,234.56
numberFormat.formatToParts(number)
: 将数字格式化为不同部分的数组。
console.log(currencyFormat.formatToParts(1234.56));
// [{type: "currency", value: "$"}, {type: "integer", value: "1"}, ...]
numberFormat.resolvedOptions()
: 返回一个对象,表示实例的配置选项。
console.log(currencyFormat.resolvedOptions());
// {locale: "en-US", numberingSystem: "latn", style: "currency", currency: "USD", ...}
5. Intl.PluralRules
Intl.PluralRules
用于根据语言环境的复数规则,确定数值的复数形式。
5.1 构造函数
new Intl.PluralRules([locales[, options]])
: 创建一个复数规则对象。locales
: 可选,表示一个或多个语言环境的字符串或数组。options
: 可选,影响复数规则的配置。type
:cardinal
或ordinal
,表示基数或序数。
5.2 方法
pluralRules.select(number)
: 返回给定数字的复数形式。
const pluralRules = new Intl.PluralRules('en-US');
console.log(pluralRules.select(1)); // "one"
console.log(pluralRules.select(2)); // "other"
pluralRules.resolvedOptions()
: 返回一个对象,表示实例的配置选项。
console.log(pluralRules.resolvedOptions());
// {locale: "en-US", type: "cardinal", minimumIntegerDigits: 1, ...}
6. Intl.RelativeTimeFormat
Intl.RelativeTimeFormat
用于格式化相对时间,如“2 天前”或“明天”。
6.1 构造函数
new Intl.RelativeTimeFormat([locales[, options]])
: 创建一个相对时间格式化对象。locales
: 可选,表示一个或多个语言环境的字符串或数组。options
: 可选,包含影响相对时间格式的配置。numeric
:always
或auto
,指示是否总是使用数字。style
:long
,short
,narrow
。
6.2 方法
relativeTimeFormat.format(value, unit)
: 格式化相对时间。
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
console.log(rtf.format(-1, 'day')); // "yesterday"
console.log(rtf.format(1, 'day')); // "tomorrow"
relativeTimeFormat.formatToParts(value, unit)
: 将相对时间格式化为不同部分的数组。
console.log(rtf.formatToParts(-1, 'day'));
// [{type: "literal", value: "yesterday"}]
relativeTimeFormat.resolvedOptions()
: 返回一个对象,表示实例的配置选项。
console.log(rtf.resolvedOptions());
// {locale: "en", style: "long", numeric: "auto", ...}
7. Intl.ListFormat
Intl.ListFormat
用于格式化项目列表,例如将数组转换为“苹果、香蕉和橙子”这样的字符串。
7.1 构造函数
new Intl.ListFormat([locales[, options]])
: 创建一个列表格式化对象。locales
: 可选
,表示一个或多个语言环境的字符串或数组。
options
: 可选,影响列表格式的配置。type
:conjunction
(和),disjunction
(或),unit
(单位)。style
:long
,short
,narrow
。
7.2 方法
listFormat.format(list)
: 格式化列表。
const listFormat = new Intl.ListFormat('en', { style: 'short', type: 'conjunction' });
console.log(listFormat.format(['Apple', 'Banana', 'Orange'])); // "Apple, Banana, and Orange"
listFormat.formatToParts(list)
: 将列表格式化为不同部分的数组。
console.log(listFormat.formatToParts(['Apple', 'Banana', 'Orange']));
// [{type: "element", value: "Apple"}, {type: "literal", value: ", "}, ...]
listFormat.resolvedOptions()
: 返回一个对象,表示实例的配置选项。
console.log(listFormat.resolvedOptions());
// {locale: "en", style: "short", type: "conjunction", ...}
8. Intl.DisplayNames
Intl.DisplayNames
用于显示语言、区域、脚本和货币的名称。
8.1 构造函数
new Intl.DisplayNames(locales, options)
: 创建一个显示名称对象。locales
: 一个或多个语言环境的字符串或数组。options
: 配置显示名称的选项。type
:language
,region
,script
,currency
。style
:long
,short
,narrow
。fallback
:code
,none
。
8.2 方法
displayNames.of(code)
: 获取给定代码的显示名称。
const displayNames = new Intl.DisplayNames(['en'], { type: 'currency' });
console.log(displayNames.of('USD')); // "US Dollar"
displayNames.resolvedOptions()
: 返回一个对象,表示实例的配置选项。
console.log(displayNames.resolvedOptions());
// {locale: "en", style: "long", type: "currency", ...}
9. 总结
Node.js 的国际化支持通过 Intl
对象及其构造函数和方法提供了强大的工具,帮助开发者在全球化应用中处理不同语言环境下的日期、时间、数字、货币和文本格式。利用这些工具,开发者可以确保应用程序在多语言环境中的一致性和正确性,从而更好地服务于全球用户。