← 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 · 它解析 + 规范化,不格式化

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

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

输入或点选一个 locale 串,看 Intl.Locale 把它拆成哪些属性。没出现在串里的字段读出来是 undefined:

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- 扩展里):

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

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

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

5 · 进阶:地区元信息

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

getWeekInfo() / getTextInfo() 是 2024 年起才逐步支持的新方法(较旧浏览器没有,本页已做特性探测降级)。同系还有 getCalendars() / getCollations() / getNumberingSystems() / getTimeZones(),返回该 locale 可用的历法/排序/数字系统/时区清单。