从Angular 7升级至Angular 10后I18n本地化提取与合并失效咨询
Angular 10 环境下i18n提取与合并操作方案
报错核心成因
两个问题叠加导致原有流程失效:
- 原脚本在Windows环境下的反斜杠转义错误,加上Angular 10对
ng xi18n的参数校验收紧,原本指代项目名的\\projectName被CLI识别为路径参数,挤占了--i18n-locale的参数值位置,最终把后续xliffmerge的可执行路径当成无效语言配置传入,触发"language is not valid"报错 - 旧版ngx-i18nsupport的自定义builder和Angular 10的参数解析逻辑不兼容,导致xliffmerge执行时找不到正确的messages.xlf文件路径,触发"i18nFile messages.xlf is not readable"报错
前置依赖校准
当前i18n相关依赖存在跨版本不匹配问题,先完成版本对齐:
- 卸载旧版不兼容的
@ngx-i18nsupport/xliffmerge,安装适配当前Angular 10、TypeScript 4.0.5环境的对应依赖:@angular/localize@10.1.6、xliffmerge@1.5.2 - 确保本地
@angular/cli版本和项目对齐为10.2.0,避免全局CLI和本地版本差异导致的参数解析错位
配置xliffmerge运行规则
废弃原来通过angular.json自定义builder调用xliffmerge的方式,改用独立配置文件规避参数解析bug:
- 在项目根目录新建
xliffmerge.json,写入项目用到的4个locale的配置:
{ "xliffmergeOptions": { "srcDir": "assets/locale", "genDir": "assets/locale", "i18nFile": "messages.xlf", "languages": ["en", "zh-CN", "fr", "es"], "defaultLanguage": "en", "format": "xlf" } }
- 删除angular.json中
projectName:xliffmerge对应的自定义builder配置段,避免CLI自动解析时捕获错误参数
重写extract-i18n执行脚本
修正package.json中原本存在转义错误的脚本,完全匹配Angular 10的ng xi18n参数规范:
- 把旧的"extract-i18n"脚本替换为如下写法:
"extract-i18n": "ng xi18n projectName --i18n-format xlf --output-path assets/locale --i18n-locale en && xliffmerge --profile xliffmerge.json"
注意:Windows环境下不要在脚本里使用双反斜杠转义项目名,直接写项目名即可,CLI会自动适配路径分隔符。
流程验证
- 执行修改后的脚本,会先自动扫描项目中所有带i18n标记的文本,生成基础的messages.xlf文件输出到assets/locale目录
- 脚本会自动触发xliffmerge流程:将新提取的翻译条目和已有的4份locale的xlf文件做合并,保留原有已完成的翻译内容,仅新增未翻译的条目,不会覆盖已有翻译内容
- 原报的两个错误会同步解决:xliffmerge将直接通过配置文件读取指定路径的文件,不再受脚本参数错位的影响
内容的提问来源于stack exchange,提问作者coder123er
相关产品推荐
相关产品推荐

