symfony国际化核心是域+语言环境+加载器协同,消息文件按domain.locale.loader命名并存于translations/目录,配置default_locale和fallbacks,代码用trans()方法、twig用|trans过滤器,支持icu复数与性别语法。

Symfony 国际化消息配置核心在于“域(domain)+ 语言环境(locale)+ 加载器(loader)”三者协同。不需复杂框架,只要结构对、路径准、格式合规,翻译就能自动生效。
消息文件命名与存放位置
翻译文件必须按 domain.locale.loader 规则命名,例如:
-
messages.en.yaml:messages 域、英语、YAML 格式 -
validators.zh_CN.xlf:validators 域、简体中文(中国)、XLIFF 格式
推荐统一放在项目根目录的 translations/ 文件夹下(Symfony 默认扫描路径)。该目录优先级最高,比 bundle 内的 Resources/translations/ 更早被加载。
基础配置(YAML 方式)
确保 config/packages/translation.yaml 中有如下配置:
framework:
default_locale: 'en'
translator:
paths: ['%kernel.project_dir%/translations']
fallbacks: ['en']
其中 default_locale 是默认语言,fallbacks 指当某条翻译缺失时回退的语言。多个 fallback 可写成数组,如 ['en', 'zh']。
在代码中使用 trans() 方法
翻译调用直接、轻量:
- 基础用法:
$translator->trans('welcome.message') - 带参数:
$translator->trans('hello.name', ['name' => 'Alice']) - 指定域:
$translator->trans('form.required', [], 'validators') - 指定 locale:
$translator->trans('save', [], 'messages', 'fr_FR')
在 Twig 模板中更简洁:{{ 'welcome.message'|trans }} 或 {{ 'hello.name'|trans({'name': 'Bob'}) }}。
支持复数和性别的 ICU 格式写法
避免为每种数量或性别单独写键,用 ICU 消息语法一条搞定:
- 复数:
$translator->trans('There is {count, plural, one {# item} other {# items}}', ['count' => $n]) - 性别:
$translator->trans('{gender, select, male {他} female {她} other {它}} saved the file', ['gender' => $user->getGender()])
注意:ICU 格式需启用 symfony/intl 组件,且 locale 必须匹配对应语言规则(如 zh 不支持复数,但 ru 支持三段式)。











