Web 平台 API / Intl · 浏览器内置的本地化引擎 / Intl.Locale:把 locale 串变成可读可改的对象 待审核 2 / 9
Locale · locale 对象本身

Intl.Locale:把 locale 串变成可读可改的对象

其他九个 API 都是取值 → 出结果的工作对象——吃一个值吐一段文案。Intl.Locale 是这一家里的异类:它什么都不格式化,只把一串 BCP-47 文本('zh-Hant-HK-u-nu-hanidec')解析、规范化成一个能逐字段读取(.language / .region / …)、能用 options 覆写、还能 maximize() / minimize() 推断默认字段的对象。把它当作「locale 串的 URL 解析器」。

1 · 解析与规范化的职责

图 1-1 · Intl.Locale 只解析与规范化,不产出面向用户的文本。

传给任何 Intl.X(locales,)Intl.X(locales, \dots ) 的第一参数,既可以是字符串也可以是一个 Intl.Locale 实例——后者的好处是先把 locale 处理清楚再传入:可以读它、改它、maximize() 它,确定无误后再去构造格式化器。

2 · 逐字段读:一个串拆成十个属性

输入或点选一个 locale 串,看 Intl.Locale 把它拆成哪些属性。除 language 外的可选字段,没出现在串里时读出来是 undefined;唯一的例外是布尔型的 numeric——没写 -u-kn 时它给 false 而非 undefined(实测):

图 2-1 · locale 串被拆成的各字段。可输入或点选一个串观察各属性的取值。

baseName 是「语言-书写体-地区」这段核心(zh-Hant-HK),-u- 里的本地化偏好则被拆进 numberingSystem / calendar / hourCycle / collation / caseFirst / numeric 这几个属性。规范化也在此发生:大小写被修正(ZH-hant-hkzh-Hant-HK)、废弃的旧标签被替换。

3 · 反过来:用 options 拼一个 locale

构造器第二参数能覆写各字段——不用手写 -u- 串。改下面的选项,看它拼出的 locale 长什么样(注意 script / regionbaseName,而 nu / hc / ca 落到 -u- 扩展里):

图 3-1 · 用第二参数覆写各字段并拼出新的 locale 串。

4 · likely subtags:maximize() 补全 / minimize() 收敛

这是 Intl.Locale 独有、别的 API 都没有的能力。CLDR 有一张「最可能子标签」表:给一个残缺的 locale,maximize() 按统计把缺的语言/书写体/地区全补上;minimize() 反过来,把能从默认推回来的字段去掉,留最短的等价串。

图 4-1 · maximize 与 minimize 按 CLDR 的最可能子标签表补全或精简 locale。

典型用途:把用户给的简写规范成完整 locale 再做匹配/比较。zhzh-Hans-CNenen-Latn-USsrsr-Cyrl-RS。反向的 minimize() 适合对外展示/存储——给人看的 locale 越短越简洁(en-Latn-USen)。注意这是统计上的「最可能」而非事实:maximize('zh') 给的是 CN,不代表用户在中国大陆。

5 · 进阶:地区元信息

较新的浏览器还能让 Intl.Locale 直接给出一个地区的元信息——一周从周几开始、周末是哪两天、文字方向:

图 5-1 · 地区元信息:一周从周几开始、周末是哪两天、文字方向。

getWeekInfo() / getTextInfo() 是较新的方法,各引擎落地时间不一,本页已做特性探测降级(核对于 2026-08)。同系还有 getCalendars() / getCollations() / getNumberingSystems() / getTimeZones(),返回该 locale 可用的历法、排序、数字系统与时区清单,它们的落地进度与前两个并不同步,需各自探测。