symfony 7中translator.default_path必须显式配置,否则即使translations/目录存在且文件命名规范,trans()也会返回原文;需在translation.yaml中设置default_path、确保xliff格式正确、域匹配、twig注入translator服务,并验证locale回退链与xliff文件规范。

translator.default_path 配置必须显式设置
Symfony 7 不再自动扫描 translations/ 目录,哪怕目录存在、文件命名规范,$translator->trans('key') 也会原样返回源文本——不是翻译没写对,而是压根没加载任何资源。
实操建议:
- 确认
config/packages/translation.yaml中有default_path: '%kernel.project_dir%/translations',路径必须真实存在且 Web 进程可读 - 检查目录结构是否为
translations/messages.en.xlf、translations/messages.fr.xlf—— Symfony 7 默认只启用XliffFileLoader,不支持.yaml或.json,除非你手动注册对应 Loader - 若用了自定义域(如
admin.en.xlf),调用时必须显式传domain: 'admin',否则仍查messages域
fallbacks 配置不等于“自动降级”,需匹配 locale 格式
设了 fallbacks: ['en'],但请求 locale 是 fr_FR 时仍返回空或原文?问题常出在 fallback locale 和实际 locale 的格式不兼容。
实操建议:
-
fallbacks列表里的值必须是完整 locale 字符串,如en_US、en_GB;写en可能不生效,因为 Symfony 内部比对时按fr_FR → fr → en_US链路降级,跳过单语言码 - 若主 locale 是
de_DE,推荐 fallback 设为['de', 'en_US'],而非仅['en'] - 可通过
$translator->getCatalogue('fr_FR')->getFallbackCatalogues()调试实际生效的回退链
Twig 中 |trans 失效:全局 translator 未注入
Symfony 5.4+ 默认禁用 Twig 全局 trans 函数,模板里写 {{ 'hello'|trans }} 会报 “Unknown function ‘trans’”,这不是翻译组件问题,而是 Twig 服务未绑定。
实操建议:
- 在
config/packages/twig.yaml加globals: { translator: '@translator' },之后即可使用|trans - 更健壮的做法:控制器中注入
TranslatorInterface,再以变量形式传入模板,例如return $this->render('page.html.twig', ['t' => $translator]),模板中用{{ t.trans('key') }} - 避免在 Twig 里硬编码
app.request.get('_locale'),locale 应由控制器解析后统一传入,否则缓存和回退逻辑易错乱
XLIFF 加载失败时的典型错误与定位方式
常见现象:$translator->trans('missing') 返回空字符串、dump($translator->getCatalogue('en')) 显示 messages 域为空、日志出现 Unable to load resource "..."。
实操建议:
- 先确认文件是否真被加载:执行
php bin/console debug:translation en --domain=messages,它会列出所有已加载的 key,若为空,说明 loader 没触发 - 检查 XLIFF 文件是否符合 1.2 规范:根节点必须是
<xliff version="1.2"></xliff>,<file></file>的source-language属性不能缺失 - 用
XliffFileLoader手动测试:写个简单命令,$loader = new XliffFileLoader(); $cat = $loader->load('translations/messages.en.xlf', 'en', 'messages');,看是否抛出InvalidResourceException - Windows 下注意路径分隔符,
realpath()可能返回反斜杠,某些 loader 版本对此敏感











