要让 Symfony 4 中第三方 Bundle 支持本地化翻译并允许项目级覆盖,需将翻译文件置于项目 translations/ 目录下,按 domain.locale.xlf 命名(如 admin.zh_CN.xlf),并在 translation.yaml 中配置 paths 和 fallbacks;Symfony 会自动识别并优先加载该路径下的翻译。

要让 Symfony 4 中的第三方 Bundle 支持本地化翻译并允许项目级覆盖,关键在于理解 Symfony 翻译组件的加载优先级和路径查找机制,而不是直接修改 vendor 中的文件。
翻译文件存放位置与加载顺序
Symfony 按以下顺序查找翻译资源,靠前的路径具有更高优先级:
- 项目根目录下的 translations/(最高优先级,推荐放自定义覆盖)
- Bundle 内部的 src/Resources/{BundleName}/translations/(仅适用于你自己的 Bundle)
- Bundle 的 Resources/translations/(常见于第三方 Bundle,但不可写)
第三方 Bundle 的翻译通常位于 vendor/{vendor}/{bundle}/Resources/translations/,你不能也不应直接修改那里。覆盖必须通过项目级路径完成。
按域和语言环境命名翻译文件
第三方 Bundle 一般会使用自己的翻译域(如 contao_core、easy_admin),而非默认的 messages。你需要先确认它用的 domain —— 查看其源码中的 $translator->trans('key', [], 'domain') 调用,或检查其 Resources/translations/ 下的文件名。
例如,若某 Bundle 使用 admin.en.xlf,则你在项目中应创建:
-
translations/admin.en.xlf(覆盖英文) -
translations/admin.zh_CN.xlf(新增中文)
文件格式建议统一用 XLIFF(.xlf),结构需保持 <trans-unit id="xxx"></trans-unit> 与原 key 一致,只改 <target></target> 内容。
确保翻译域被识别
Symfony 默认只加载 messages 域。若第三方 Bundle 使用了其他 domain(如 security、validators 或自定义名),需在配置中显式声明:
在 config/packages/translation.yaml 中补充:
framework:
translator:
paths:
- '%kernel.project_dir%/translations'
fallbacks:
- 'en'
# 显式启用第三方使用的 domain
default_path: '%kernel.project_dir%/translations'
无需额外注册 domain,只要文件名符合 {domain}.{locale}.{loader} 规则(如 admin.zh_CN.xlf),且放在 translations/ 下,Symfony 就会自动加载。
验证与调试技巧
运行以下命令快速确认翻译是否生效:
-
php bin/console debug:translation zh_CN --domain=admin(查看未翻译/冗余条目) -
php bin/console translation:extract zh_CN --enable-extractor=php --output-format=xlf --output-dir=translations(可辅助提取新 key)
如果仍不生效,检查:
– 当前请求的语言环境是否正确设置(request.getLocale() 或 %locale% 参数);
– 翻译文件中的 source-language 和 target-language 是否匹配;
– key 名是否完全一致(含大小写和标点)。











