Angular 8 i18n:xlf文件target标签丢失,执行ng xi18n报错求助
解决Angular 8 i18n中标签被移除及翻译缺失报错的问题
这个问题的核心原因是Angular 8的ng xi18n命令默认会完全覆盖目标文件,而不是合并已有的翻译内容。当你直接执行原命令时,之前手动添加的<target>标签会被新生成的只包含<source>的内容替换,导致系统检测到翻译单元缺失<target>,从而抛出"misses a translation"错误。
下面是具体的解决步骤:
1. 初始化翻译文件(首次操作)
如果还没有基础的源文件,先执行以下命令生成默认的源语言xliff文件:
ng xi18n --output-path src/locale
这会在src/locale目录下生成messages.xlf,里面包含所有标记了i18n的文本的<source>标签。
接下来复制messages.xlf为dutch.xlf,并手动为每个<trans-unit>添加对应的<target>荷兰语翻译内容,确保每个翻译单元的结构类似:
<trans-unit id="welcomeTitle" datatype="html"> <source>Welcome to our app</source> <target>Welkom bij onze app</target> </trans-unit>
2. 更新翻译文件(添加新文本后)
当你在代码中新增了需要翻译的文本后,不要直接覆盖原dutch.xlf,而是使用--merge参数合并现有翻译文件,保留已有的<target>标签:
ng xi18n --output-path src/locale --out-file dutch.xlf --i18n-locale nl --merge src/locale/dutch.xlf
这个命令会:
- 扫描代码中的新
i18n标记,添加对应的<trans-unit>到dutch.xlf - 保留所有已存在的
<target>翻译内容 - 新添加的翻译单元会只有
<source>,需要你手动补充<target>
3. 关键注意事项
- 自定义ID的正确使用:如果你使用
@@customId标记文本(比如<h1 i18n="@@welcomeTitle">Welcome</h1>),确保dutch.xlf中对应的<trans-unit>的id属性与自定义ID完全一致,这样合并时Angular才能正确匹配翻译单元,不会重复生成。 - 检查xliff格式:确保
dutch.xlf符合XLIFF 1.2的规范(Angular 8使用的版本),所有标签正确闭合,没有语法错误,否则合并时可能出现解析问题。 - 补充新翻译:每次合并后,新添加的翻译单元会没有
<target>,你需要手动补充这些翻译,否则仍然会触发"misses a translation"错误。
内容的提问来源于stack exchange,提问作者Juliano
相关产品推荐
相关产品推荐

