Symfony Console命令可通过注入TranslatorInterface实现在execute()中调用trans()输出多语言提示,需添加--locale选项显式设置语言,并将翻译文件置于translations/目录下使用messages.zh.yaml等标准命名格式。

Symfony 命令行命令本身不自动支持多语言输出,但你可以让自定义的 Console 命令(如 php bin/console app:import-data)在不同语言环境下输出本地化提示、错误或进度信息。关键不是“给 Symfony 命令国际化”,而是让你写的命令主动使用 Translator,并配合全局 locale 管理机制。下面直击实操要点。
让命令能用 TranslatorInterface
Console 命令默认不注入翻译器,需手动声明依赖:
- 在命令类构造函数中添加
TranslatorInterface $translator参数,并赋值给属性 - 确保命令类继承
Symfony\Component\Console\Command\Command,且在configure()中调用$this->setName(...)等基础设置 - 运行时 Symfony 会自动注入已配置好的 translator 实例(前提是 translation 组件已启用)
命令中正确调用翻译
不要硬编码字符串,全部走 $this->translator->trans():
- 用法示例:
$io->success($this->translator->trans('command.import.success', ['%count%' => $total])); - 域(domain)建议统一用
messages,除非你为命令单独建了commands.zh.yaml文件 - 避免在
configure()方法里调用 trans() —— 此时 translator 尚未注入,会报错;所有翻译逻辑放在execute()中
确保命令运行时 locale 生效
命令行没有 URL 或 session,locale 需显式指定或从环境推导:
- 最稳妥方式:加一个
--locale=zh选项,在execute()开头调用$this->translator->setLocale($input->getOption('locale')); - 次选方案:读取系统 locale(
setlocale(LC_ALL, 0))或环境变量LANG,再映射为 Symfony 支持的格式(如zh_CN→zh) - 注意:不要依赖
default_locale配置,它只影响 Web 请求上下文;命令行是独立生命周期
翻译文件放对位置、格式别出错
命令用的翻译和 Web 页面共用同一套翻译体系,路径与格式必须一致:
- 文件仍放在
translations/目录下,命名如messages.zh.yaml或messages.zh.xlf - 若用 YAML,确认
config/packages/translation.yaml含有:
framework:
translation:
enabled_formats: ['xlf', 'yaml'] - 运行
php bin/console debug:translation zh可验证中文翻译是否被识别并加载











