Fix 9.2.3 LookupMatcher algorithm S0
中文标题:修复 9.2.3 LookupMatcher 算法
提案概览
- 阶段: Stage 0
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
提案速览
该提案旨在修复 ECMA-402 中的 LookupMatcher 算法,该算法目前无法正确将 az-IR 或 zh-AU 等区域设置解析为正确的语言/脚本变体。问题在于当前算法过于激进地截断子标签,导致错误的回退。
Note
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
更新
阶段 0
Ecma-402 中有一个关于查找匹配(Lookup Matching)的规范,由 LookupMatcher(9.2.3)和 BestAvailableLocale(9.2.2)描述。它基于 RFC 4647 第 3.4 节中描述的查找算法。但是,Ecma-402 规范和 RFC 4647 算法在某些情况下都无法执行该任务。例如:
az-IR映射到az(az-Latn-AZ的默认值),而不是正确的az-Arab-IR。en-Latn-GB和en-Latn-IN映射到en(en-Latn-US的默认值),而不是分别正确的en-GB和en-IN。ha-CM和ha-SD映射到ha(ha-Latn-NG的默认值),而不是正确的ha-Arab-*。kk-CN、kk-IR和kk-MN映射到kk(kk-Cyrl-KZ的默认值),而不是正确的kk-Arab-*。sr-ME、sr-RO、sr-RU、sr-TR映射到sr(sr-Cyrl-RS的默认值),而不是正确的sr-Latn-*。uz-AF映射到uz(uz-Latn-UZ的默认值),而不是正确的uz-Arab-AF。zh-AU、zh-BN、zh-GB、zh-GF、zh-ID、zh-MO、zh-MY、zh-PA、zh-PF、zh-PH、zh-SR、zh-TH、zh-US和zh-VN映射到zh(zh-Hans-CN的默认值),而不是正确的zh-Hant-*。
影响
错误的规范可以在当今的实现中观察到。
原因
指定的算法过于简单。它基本上指示实现执行子标签截断,直到找到区域设置,这是错误的。相关问题和更多细节可以在以下地方找到:
- Fixing Inheritance by Mark Davis
- Cldrjs issue #17
- Cldrjs's Lookup Matcher
- Globalize issue #357
- ICU issue #11404
- Improving Locale/LanguageMatcher by Mark Davis
- BestFitAvailableLocale in ibm-js/ecma402
修复
根据 Mark Davis 的说法,"推荐的捆绑包查找方法是使用语言匹配"。因此,有两个选项:
- 遵循 Unicode 技术标准 #35 指定的 Language Matching 算法。
- 遵循 [cldrjs 中更快的算法][],该算法在考虑 100% 分数阈值的情况下产生与语言匹配相同的结果。