Symfony 4 的翻译域是影响加载、缓存和提取的核心组织单元,须按业务语义划分:messages(通用界面)、validators(验证错误)、emails(邮件文案)、admin(后台)、api(接口错误);代码中需显式指定 domain,如 $translator->trans('key', [], 'validators') 或 Twig 中 {% trans from 'emails' %}...{% endtrans %}。

Symfony 4 中的翻译域(domain)不是命名标签,而是实际影响加载、缓存和提取行为的核心组织单元。本地化项目一旦超出单页静态文案,就必须按业务语义划分 domain,否则很快会遇到协作冲突、缓存失效粒度粗、提取冗余等问题。
为什么必须分离 domain
把所有字符串塞进 messages.en.yaml 看似省事,但实际带来三类硬伤:
- 不同业务场景下同名键语义冲突——比如 “delete” 在用户管理页是删除账号,在订单页是取消订单,混在同一个 domain 里极易覆盖或误译
- 改一条邮件标题,整个 messages 域缓存全部失效,拖慢部署与预热速度
- 运行
bin/console translation:extract时无法按模块过滤,每次都要手动删掉 validators、emails 等无关键值
推荐 domain 划分与文件结构
按功能模块命名,小写+点号分隔,清晰表达归属:
- messages:通用界面文案(按钮、导航、页面标题)→ translations/messages.en.yaml
- validators:表单验证错误(Symfony 自动使用该 domain)→ translations/validators.en.yaml
- emails:邮件主题与正文(便于单独导出给翻译团队)→ translations/emails.en.yaml
- admin:后台管理专属文案 → translations/admin.en.yaml
- api:JSON 接口返回的错误消息(适合前后端分离)→ translations/api.en.yaml
文件名格式为 domain.locale.loader,例如 emails.zh_CN.yaml 表示中文简体的邮件文案,loader 类型由扩展名决定(YAML 或 XLIFF)。
代码中调用指定 domain
不显式指定 domain,默认走 messages。要调其他域,必须传参:
- 在控制器或服务中:
$translator->trans('password_too_short', [], 'validators'); - 在 Twig 模板中:
{{ 'welcome'|trans({}, 'messages') }} - Twig 中用 trans 标签:
{% trans with {'%name%': 'Alice'} from 'emails' %}Hi %name%{% endtrans %}
配置与路径注意事项
Symfony 4 默认只扫描 translations/ 目录,且自动识别文件名中的 domain 和 locale。无需额外 loader 配置,但需确认:
-
config/packages/translation.yaml中已启用:framework.translator: { enabled: true } - 设置了
default_path: '%kernel.project_dir%/translations'(路径必须存在且可读) - 若使用 YAML 格式,确保已安装并启用了 yaml loader(Symfony 4 默认支持)
- 多个同名 domain + locale 文件共存时(如按 Bundle 分开存放),按
translator.paths列表顺序,前面路径优先











