为何Angular Locale定义文件与registerLocaleData的区域标识符不匹配
问题原因
Angular 的 @angular/common/locales 目录下的区域文件遵循如下命名规则:
- 只有某一语言的不同地区变体差异较大,需要独立维护区域配置时,才会提供带
语言-地区格式后缀的文件,比如英语的英式、美式、加式变体差异明显,所以存在en-GB.js、en-US.js这类带地区后缀的文件。 - 对于主流地区变体和通用语言规范完全一致、或是不同地区变体差异极小的语言,Angular 只会提供不带地区后缀的纯语言代码文件。比如德语的通用规范就以德国地区标准为准,所以没有单独的
de-DE.js,只有de.js,完全覆盖de-DE的场景需求。
解决方案
修改你的加载逻辑,增加降级兼容:先尝试加载完整的语言-地区标识文件,加载失败时自动提取纯语言代码重试加载对应文件,示例代码如下:
public importLocaleDataAndSetLocaleFor(locale: string): Promise<void> { // 优先加载带地区后缀的完整标识文件 return import(`@angular/common/locales/${locale}.js`) .then((localeModule) => { registerLocaleData(localeModule.default, locale); }) .catch(() => { // 加载失败降级为纯语言标识文件 const pureLanguageCode = locale.split('-')[0]; return import(`@angular/common/locales/${pureLanguageCode}.js`) .then((localeModule) => { registerLocaleData(localeModule.default, locale); }); }); }
如果有特殊的地区定制需求,你可以自行从CLDR数据库导出对应区域的配置数据,手动调用registerLocaleData注册即可。
内容的提问来源于stack exchange,提问作者CreativeAbyss
相关产品推荐
相关产品推荐

