控制台命令默认不自动应用当前请求语言环境,需通过--locale选项显式传入并调用$translator->setlocale()设置,否则trans()返回默认语言原文。

控制台命令默认不自动应用当前请求的语言环境,所以即使你配置了法语翻译文件,php bin/console app:greet 输出的仍是英文原文。关键在于命令运行时没有绑定 locale,Translator 实例用的是默认语言(如 en),而不是你期望的 fr。
确保命令能感知语言环境
Symfony 控制台命令独立于 HTTP 请求,不自动读取 URL 或 session 中的 _locale。必须显式传入或推导 locale。
- 在命令类中注入
RequestStack和TranslatorInterface,但注意:CLI 环境下$requestStack->getCurrentRequest()返回null,不能直接依赖 - 推荐做法是通过命令选项或参数接收 locale:
$this->addOption('locale', 'l', InputOption::VALUE_REQUIRED, 'Locale to use', 'en') - 执行时指定:
php bin/console app:greet --locale=fr - 在
execute()方法中,用该值设置 Translator:$translator->setLocale($input->getOption('locale'))
使用翻译域与正确 key
控制台命令调用 $translator->trans() 时,需确保:
- 翻译文件放在
translations/目录下,命名符合messages.fr.xlf格式 - key 完全匹配
<source></source>内容,例如<source>greeting.hello</source>,调用时写$translator->trans('greeting.hello') - 若用了自定义域(如
commands.fr.xlf),调用时必须指定:$translator->trans('key', [], 'commands')
避免 Twig 模板干扰
控制台命令一般不渲染 Twig 模板,所以无需配置 twig.globals.translator。重点检查:
-
config/packages/translation.yaml中default_path已设为'%kernel.project_dir%/translations' - 目录存在且可读:
ls -l translations/messages.fr.xlf - 运行
php bin/console debug:translation fr查看是否识别到 key(Symfony 4.4+ 支持该命令)
调试小技巧
快速验证 Translator 是否生效:
- 在命令中加一行:
dump($translator->getLocale(), $translator->trans('greeting.hello')); - 确认输出的 locale 是你传入的值,且翻译文本非空
- 如果返回原文,检查 XLIFF 文件中的
<trans-unit id="..."></trans-unit>的id是否和 source 内容一致(XLIFF 推荐用 source 作 ID,但 Symfony 也支持任意字符串 ID)











