Intl.Locale:把 locale 串变成可读可改的对象
其他七个 API 都是格式化器——吃一个值吐一段文案。Intl.Locale 是这一家里的异类:它什么都不格式化,只把一串 BCP-47 文本('zh-Hant-HK-u-nu-hanidec')解析、规范化成一个能逐字段读取(.language /
.region / …)、能用 options 覆写、还能 maximize() / minimize() 推断默认字段的对象。把它当作「locale 串的 URL 解析器」。
1 · 它解析 + 规范化,不格式化
传给任何
的第一参数,既可以是字符串也可以是一个 Intl.Locale 实例——后者的好处是先把 locale 处理清楚再传入:可以读它、改它、maximize() 它,确定无误后再去构造格式化器。
2 · 逐字段读:一个串拆成十个属性
输入或点选一个 locale 串,看 Intl.Locale 把它拆成哪些属性。没出现在串里的字段读出来是 undefined:
baseName 是「语言-书写体-地区」这段核心(zh-Hant-HK),-u- 里的本地化偏好则被拆进 numberingSystem / calendar / hourCycle / collation / caseFirst /
numeric 这几个属性。规范化也在这里发生:大小写被修正(ZH-hant-hk → zh-Hant-HK)、废弃的旧标签被替换。
3 · 反过来:用 options 拼一个 locale
构造器第二参数能覆写各字段——不用手写 -u- 串。改下面的选项,看它拼出的 locale 长什么样(注意 script / region 进 baseName,而 nu / hc / ca 落到 -u- 扩展里):
4 · likely subtags:maximize() 补全 / minimize() 收敛
这是 Intl.Locale 独有、别的 API 都没有的能力。CLDR 有一张「最可能子标签」表:给一个残缺的 locale,maximize() 按统计把缺的语言/书写体/地区全补上;minimize() 反过来,把能从默认推回来的字段去掉,留最短的等价串。
典型用途:把用户给的简写规范成完整 locale 再做匹配/比较。zh → zh-Hans-CN、en → en-Latn-US、sr → sr-Cyrl-RS。反向的 minimize() 适合对外展示/存储——给人看的 locale 越短越简洁(en-Latn-US
→ en)。注意这是统计上的「最可能」而非事实:maximize('zh') 给的是 CN,不代表用户在中国大陆。
5 · 进阶:地区元信息
较新的浏览器还能让 Intl.Locale 直接给出一个地区的元信息——一周从周几开始、周末是哪两天、文字方向:
getWeekInfo() / getTextInfo() 是 2024 年起才逐步支持的新方法(较旧浏览器没有,本页已做特性探测降级)。同系还有 getCalendars() / getCollations() / getNumberingSystems() / getTimeZones(),返回该 locale
可用的历法/排序/数字系统/时区清单。