[关闭]
@Dale-Lin 2023-03-03T14:58:01.000000Z 字数 5943 阅读 140

Intl

web_APIs


Intl 是 ES 国际化 API 的一个命名空间,提供了精确的字符串对比,数字的格式化和日期时间格式化。

internationalization 构造器和其他语言相关的方法及构造器使用通用的模式来识别语言环境(locales),并决定实际使用哪种:都接受 localesoptions 参数,并会对请求使用的语言环境和支持的语言环境通过 options.localeMatcher 属性来协商。

locales 参数

locales 参数决定某次操作的语言环境,JS 的视线会校验 locales 参数,计算出一个能理解且最接近的语言环境。例如:

上述的后两种情况下,实际使用取决于 locale negotiation 且支持性最好的语言环境。

一个 locale 标识是一个字符串,有以下组成:

每个标记和序列间使用 hyphens(-)隔开。Locale 标识是大小写敏感的。对于脚本标记习惯使用首字母大写的写法;对于地区标记使用全部大写;其他标记和序列使用小写:

BCP 47 语言标记注册列表:IANA Language Subtag Registry

BCP 47 扩展使用一个数字/字母和一个或以上 2~8 位的字母/数字组成,每个数字或者字母只支持一个序列。目前只有两个语义化定义的扩展:

BCP 47 扩展标记:Unicode CLDR Project

options 参数

options 参数必须是一个对象,其属性会根据构造函数或者方法变化,如果没有提供 options 参数,会使用所有属性的默认值。

options.localeMatcher 属性适用于所有语言敏感的构造器和函数,这个属性的值可以是 "lookup""best fit",用来选择下面提到的本地语言匹配算法:

语言标识和协商

locales 参数指定的一组语言环境在 Unicode 扩展被移除后,被 interpreted(解释)为来自应用的 prioritized request(优先请求)。运行时将它和支持的语言环境比较,选出最佳的可用结果。

如果应用没有提供 locales 参数,或者运行时没有匹配到请求的语言,使用默认的运行时语言。

如果选中的语言标识具有 Unicode 扩展子序列,那么这个扩展会用来自定义化函数的构造器或行为。每个函数的构造器只支持一组扩展。例如 "co"(collation,校对)只有 Intl.Collator 支持,而且 "phonebk" 值只有德语支持。

构造器属性

Intl.Collator()

校对器对象的构造函数,支持语言敏感的字符串比较。

  1. const collator = new Intl.Collotor('zh')
  2. const list = ['赵', '钱', '孙', '李']
  3. list.sort() // ['孙', '李', '赵', '钱']
  4. list.sort(collator.compare) // ['李', '钱', '孙', '赵']
  1. new Intl.Collator('zh').resolvedOptions()
  2. /**
  3. {
  4. caseFirst: "false",
  5. collation: "default",
  6. ignorePunctuation: false,
  7. locale: 'zh',
  8. numeric: false,
  9. sensitivity: "variant",
  10. usage: "sort"
  11. }
  12. */

Intl.DateTimeFormat()

支持语言敏感的时间日期格式化的对象构造器。

  1. const date = new Date(Date.UTC(2020, 11, 20, 3, 23, 16, 738))
  2. console.log(new Intl.DateTimeFormat('en-US').format(date))
  3. // "12/20/2020"
  4. console.log(new Intl.DateTimeFormat('zh-CN').format(date))
  5. // "2020/12/20"
  6. console.log(new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeStyle: 'long', timeZone: 'Australia/Sydney' }).format(date))
  7. // "Sunday, 20 December 2020 at 14:23:16 GMT+11"

将一个日期对象构造成对应语言环境的格式(使用 options)

返回构造时初始化对象使用的选项

返回一个日期范围

  1. const fromDate = new Date(Date.UTC(2020, 11, 20, 3, 23, 16, 738))
  2. const toDate = new Date(Date.UTC(2023, 2, 27, 22, 33, 13, 633))
  3. console.log(new Intl.DateTimeFormat().formatRange(fromDate, toDate))
  4. // "2020/12/20 - 2023/3/28"
  1. const date = new Date(Date.UTC(2022, 11, 20, 3, 0, 0))
  2. const options = {
  3. weekday: "long",
  4. year: "numeric",
  5. month: "long",
  6. day: "numeric"
  7. }
  8. console.log(new Intl.DateTimeFormat("de-DE", options).format(date))
  9. // "Donnerstag, 20. Dezember 2012"
  10. options.timeZone = "UTC"
  11. options.timeZoneName = "short"
  12. console.log(new Intl.DateTimeFormat("en-US", options).format(date))
  13. // "Thursday, December 20, 2012, GMT"
  1. const options = { calendar: "chinese", numberingSystem: "arab" }
  2. const dateFormat = new Intl.DateTimeFormat("default", options)
  3. const usedOptions = dateFormat.resolvedOptions()
  4. console.log(usedOptions.calendar) // "chinese"
  5. console.log(usedOptions.numberingSystem) // "arab"
  6. console.log(usedOptions.timeZone)
  7. // "Asia/shanghai" (the users default time zone)

Intl.DisplayNames()

支持语言、地区和脚本展示名称的一致翻译的对象构造器

Intl.ListFormat()

支持语言敏感的列表格式化的对象构造器

  1. const list = ['Motorcycle', 'Bus', 'Car']
  2. conosle.log(new Intl.ListFormat('en-GB', { style: 'long', type: 'conjunction' }).format(list))
  3. // Motorcycle, Bus and Car
  4. console.log(new Intl.ListFormat('zh-CN', { style: 'short', type: 'disjunction' }).format(list))
  5. // Motorcycle、Bus或Car
  6. console.log(new Intl.ListFormat('en-GB', { style: 'narrow', type: 'unit' }).format(list))
  7. // Motorcycle Bus Car
  8. console.log(new Intl.ListFormat('zh-CN', { style: 'narrow', type: 'unit' }).format(list))
  9. // MotorcycleBusCar
  10. // Motorcycle Bus Car
  1. const list = ['Motorcycle', 'Bus', 'Car']
  2. console.log(new Intl.ListFormat('en-GB', { style: 'long', type: 'conjunction' }).formatToParts(list))
  3. // [ { "type": "element", "value": "Motorcycle" },
  4. // { "type": "literal", "value: ", " },
  5. // { "type": "element", "value": "Bus" },
  6. // { "type": "literal", "value": ", and " },
  7. // { "type": "element", "value": "Car" } ]

Intl.Locale()

  1. const locale = new Intl.Locale('en-CA')
  2. console.log(locale.hourCycles) // ['h12']
  3. console.log(locale.timeZones)
  4. /**
  5. /* [ "America/Blanc-Sablon",
  6. /* "America/Cambridge_Bay",
  7. /* "America/Coral_Harbour"
  8. /* ...,
  9. /* "America/Toronto",
  10. /* "America/YellowKnife" ]
  11. */
  12. console.log(new Intl.Locale('zh-CN').timeZones)
  13. /**
  14. /* ["Asia/Shanghai", "Asia/Urumqi"]
  15. */

用来表示一个 Unicode 语言标识的对象构造器

Intl.NumberFormat()

支持语言敏感的数字格式化的对象构造器

options 文档

货币:

  1. const number = 123456.789
  2. console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' })).format(number)
  3. // 123.456,79 €
  4. console.log(new Intl.NumberFormat('en-IN', { maximumSignificantDigits: 3 })).format(number)
  5. // 1,23,000

货币单位查询

单位:

  1. console.log(new Intl.NumberFormat('en', { style: 'unit', unit: 'kilometer-per-hour' }).format(50))
  2. // 50 km/h

Intl.PluralRules()

支持复数敏感且指定语言的复数语法的对象构造器;例如:1 => one; 6 => few; 20 => many

Intl.RelativeTimeFormat()

支持语言敏感的相对时间格式化的对象构造器。

  1. const rtf1 = new Intl.RelativeTimeFormat('en', { style: 'narrow' })
  2. console.log(rtf1.format(3, quarter))
  3. // in 3 qtrs
  4. console.log(rtf1.format(-1, 'day'))
  5. // 1 day ago
  6. const rtf2 = new Intl.RelativeTimeFormat('zh', { numeric: 'auto' })
  7. console.log(rtf2.format(2, 'day'))
  8. // 后天

Intl.Segmenter()

支持语言敏感的文本分段(text segmentation)对象的构造器;可以实现非空格分隔文本的词语分隔

静态方法

Intl.getCananicalLocales()

返回典范的(canonical)本地语言名称

Intl.supportedValuesOf()

返回实现了的特定日历,校对器,币种,数字系统

用例

格式化日期和数字

使用 Intl 来格式化日期和数字,转换成某个地区/语言的常用格式

  1. const count = 26254.39
  2. const date = new Date("2012-05-24")
  3. const log = (locales) => {
  4. console.log(
  5. `${new Intl.DateTimeFormat(locale).format(date)} ${new Intl.NumberFormat(locale).format(count)}`
  6. )
  7. }
  8. log("en-US") // 5/24/2012 26,254.39
  9. log("de-DE") // 24.5.2012 26.254,39
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注