symfony 4 翻译不显示主因是加载链路中断:未配置translator.default_path导致translations/目录未被扫描;文件命名不规范(如误用.yaml而非.xlf);调用时域(domain)不匹配;twig未注入translator服务;或请求locale未正确设置并同步。

Symfony 4 中翻译消息不显示,通常不是翻译内容写错了,而是加载链路断在某个环节。核心问题集中在“文件没被读到”或“调用没走对服务”。下面从四个关键点帮你快速定位。
检查 translations/ 目录是否被正确加载
Symfony 4 默认不会自动扫描 translations/ 目录,必须显式配置路径。打开 config/packages/translation.yaml,确认包含:
framework:translator:default_path: '%kernel.project_dir%/translations'
同时确保该目录真实存在,且文件命名规范,例如:messages.en.xlf、messages.fr.xlf(注意:不能是 messages.en.yaml,Symfony 4 默认只支持 XLIFF,YAML 需额外启用格式支持)。
验证翻译域(domain)和键名是否匹配
默认使用 messages 域。如果你的文件叫 admin.fr.xlf,调用时必须指定 domain:
$translator->trans('user.deleted', [], 'admin'){{ 'user.deleted'|trans({}, 'admin') }}
如果漏写 domain,系统仍会去查 messages.fr.xlf,自然找不到键——返回原文不是翻译失败,而是查错文件。
确认 Twig 模板中 translator 服务已注入
Symfony 4 的 Twig 默认不提供全局 trans 过滤器。若模板里写 {{ 'hello'|trans }} 却报错或无输出,先检查 config/packages/twig.yaml 是否有:
globals:translator: '@translator'
或者更推荐的方式:在控制器中注入 TranslatorInterface,再把 $translator->trans(...) 结果作为变量传入模板,避免全局依赖和 locale 同步问题。
排查当前请求 locale 是否生效
即使文件存在、调用正确,如果请求的 locale 没设对,也会 fallback 到默认语言甚至返回源文本。检查以下几点:
-
config/packages/framework.yaml中default_locale: en是否设置 - 路由是否携带
_locale参数,例如defaults: { _locale: '%kernel.default_locale%' } - 在控制器中打印
$request->getLocale(),确认值是你预期的语言代码(如fr),而不是空或en
如果 locale 是动态的(比如从 URL 获取),别在模板里硬写 app.request.get('_locale'),应由控制器解析后统一传入。











