symfony 4 默认使用 xliff 2.0 格式(.xlf 后缀),文件需以 开头,含 元素指定源/目标语言,翻译单元用 包裹 和 ,支持 icu 复数及 上下文区分,命名须为 domain.locale.xlf 并存放于 translations/ 目录。

Symfony 4 使用 XLIFF(XML Localization Interchange File Format)作为默认的翻译文件格式,推荐使用 .xlf 后缀(如 messages.fr.xlf),而非旧版的 .xliff。正确编写 XLIFF 文件是实现多语言支持的关键一步,需严格遵循 Symfony 的命名规范与 XML 结构。
基础结构:必须包含的 XML 元素
每个 XLIFF 文件需以标准 XML 声明开头,并嵌套在 <xliff></xliff> 根元素中,版本必须为 2.0(Symfony 4+ 要求)。内部必须包含一个 <file></file> 元素,其 source-language 属性指定源语言(如 en),target-language 指定当前翻译语言(如 fr),datatype="plaintext" 表明内容为普通文本。
核心翻译单元放在 内的 <trans-unit></trans-unit> 中,每个单元需有唯一 id(通常由 Symfony 自动生成或按约定命名),且至少包含一个 <source></source> 和一个 <target></target> 子元素:
-
<source></source>:存放原始消息(即 Twig 或 PHP 中使用的字符串,不带占位符处理) -
<target></target>:存放对应语言的翻译结果,可含相同占位符(如%name%) - 建议添加
<note></note>元素说明上下文(如“按钮文字”、“邮件标题”),便于译者理解
消息 ID 与复数/上下文处理
Symfony 4 默认使用消息字符串本身作为 ID(即“自然语言键”),因此 <trans-unit id="Save"></trans-unit> 中的 id 属性实际被忽略,真正匹配靠的是 <source></source> 内容。但若需显式控制 ID(例如避免因标点或空格微调导致重复条目),可在配置中启用 framework.translator.default_domain: 'messages' 并配合命名空间化 ID。
对于复数形式(如 “1 comment” / “%count% comments”),Symfony 使用 ICU MessageFormat 语法,XLIFF 中需用 <alt-trans></alt-trans> 或更推荐的方式:在 <source></source> 中直接写 ICU 格式,例如:
<source>{count, plural, one {# comment} other {# comments}}</source><br><target>{count, plural, one {# commentaire} other {# commentaires}}</target>上下文区分(如 “bank” 指金融机构 vs. 河岸)可通过 <context-group></context-group> 添加语境标签,Symfony 会识别 purpose="information" 下的 context 值。
文件命名与存放位置
翻译文件须放在 translations/ 目录下(项目根目录或 src/Resources/translations/),命名格式为:domain.locale.xlf,例如:
-
messages.en.xlf—— 英文源语言(推荐保留,便于对比) -
messages.fr.xlf—— 法语翻译 -
validators.zh_CN.xlf—— 中文简体的验证器消息
注意:locale 必须是 Symfony 支持的合法区域代码(如 zh_CN、pt_BR),不能写成 zh-cn 或 zhcn,否则加载失败。
验证与调试技巧
编写完成后,运行以下命令检查语法和完整性:
php bin/console debug:translation fr --domain=messages
它会列出缺失、过时或重复的翻译项。也可用 xmllint 验证 XML 格式是否合规:
xmllint --noout translations/messages.fr.xlf
常见错误包括:
• 忘记闭合 <target></target> 或拼错标签名
• <source></source> 和 <target></target> 内容为空或仅空白符
• 占位符大小写/拼写不一致(如 %Name% vs %name%)
• 使用了 XLIFF 1.2 语法(如 外还有 <header></header>)











