清除缓存本身不能修复翻译不显示的问题,真正起作用的是缓存重建过程中重新加载翻译资源;需检查translation.yaml中是否配置framework.translator.default_path为'%kernel.project_dir%/translations',确保目录存在、权限正确、文件命名规范(如messages.fr.xlf)、twig注入translator服务,且locale随路由前缀'/{_locale}'动态生效。

清除缓存本身不能修复翻译不显示的问题,真正起作用的是缓存重建过程中重新加载翻译资源。Symfony 4 默认不自动扫描 translations/ 目录,如果配置缺失或路径错误,trans() 就会始终返回原文——清缓存只是让这个“未加载”状态暴露出来,而不是解决问题的根源。
检查 translation.yaml 是否正确定义 default_path
Symfony 4 不再默认启用 translations 目录扫描,必须手动配置。打开 config/packages/translation.yaml,确认包含:
framework:translator:default_path: '%kernel.project_dir%/translations'
该路径必须真实存在(ls -l translations/ 可验证),且 Web 服务器用户(如 www-data)有读取权限。若目录不存在,运行 mkdir translations 创建。
确认翻译文件命名与格式合规
文件名必须严格遵循 messages.{locale}.{format} 规则,例如:
-
translations/messages.fr.xlf✅(推荐 XLIFF 格式) -
translations/messages.zh_CN.yaml❌(YAML 格式需额外启用 symfony/yaml 组件并注册加载器) -
translations/admin.fr.xlf✅(自定义域,调用时需显式指定domain: 'admin')
XLIFF 文件需符合标准结构,<source></source> 内容应为消息 ID(如 app.welcome),<target></target> 为对应译文。
确保 Twig 模板能访问 translator 服务
Symfony 4.4+ 默认禁用全局 trans 过滤器。在 config/packages/twig.yaml 中添加:
twig:globals:translator: '@translator'
之后模板中才能安全使用 {{ 'app.welcome'|trans }}。更健壮的方式是在控制器中注入 TranslatorInterface,再以变量方式传入模板。
验证 locale 是否随请求生效
即使 URL 是 /fr/contact,若未启用 locale 前缀路由或未设置默认 locale,$translator->getLocale() 仍返回 en。检查:
-
config/routes.yaml是否启用前缀:prefix: '/{_locale}',并设defaults: { _locale: '%kernel.default_locale%' } -
config/packages/framework.yaml中default_locale: en是否被环境变量覆盖(如.env中误写APP_DEFAULT_LOCALE=空值) - 调试时在控制器里加
dump($this->translator->getLocale()); die;确认实际值











