Symfony YAML翻译文件必须严格遵循domain.locale.loader命名规范、存于translations/目录、采用键值对结构,三者缺一不可;否则trans()返回原文。

Symfony 4 的 YAML 翻译文件写起来不难,但必须严格匹配命名、位置和结构三要素,否则 trans() 会直接返回原文,而不是翻译内容。
文件位置和命名规则
必须放在项目根目录下的 translations/ 文件夹里(Symfony 4 默认只扫描这里)。文件名要按 domain.locale.loader 格式写,缺一不可:
-
domain:默认是
messages;也可自定义,比如admin、validators -
locale:语言标识符,如
en、zh_CN、fr_FR(注意大小写和下划线) -
loader:扩展名代表格式,YAML 就用
.yml或.yaml
合法示例:translations/messages.en.ymltranslations/messages.zh_CN.ymltranslations/admin.fr.yml
YAML 文件内容怎么写
结构很简单:每行一个键值对,冒号后加空格,值用双引号或单引号包裹(含特殊字符或空格时建议加引号):
app.welcome: "Welcome to our site" user.greeting: "Hello %name%!" button.save: "Save" form.email.label: "Email address"
注意点:
- 键名(key)必须和模板或代码中
trans('app.welcome')的参数完全一致,包括大小写和点号 - 占位符写法固定为
%name%,不能写成{name}或$name - 支持嵌套键名,但只是逻辑分组,YAML 解析器不认层级,全当扁平字符串处理
让 Symfony 正确加载 YAML 文件
Symfony 4 默认只启用 XLIFF 加载器。要用 YAML,得手动开启 YAML 支持:
- 确保已安装
symfony/yaml组件(通常随框架自带) - 在
config/packages/translation.yaml中确认有以下配置:
framework:
translator:
default_path: '%kernel.project_dir%/translations'
fallbacks: ['en']
- 如果没看到
translation.yaml,就新建一个,并确保它被加载(检查config/bundles.php中Symfony\Bundle\TranslationBundle\TranslationBundle::class是否启用)
Twig 模板里怎么用
在 Twig 中调用翻译,语法很直接:
- 默认域:
{{ 'app.welcome'|trans }} - 指定域:
{{ 'admin.title'|trans(domain='admin') }} - 带参数:
{{ 'user.greeting'|trans({ '%name%': 'Alice' }) }}
前提是 Twig 已注入 translator 服务。Symfony 4 默认已配置,无需额外操作;如遇 trans is not defined 错误,检查 config/packages/twig.yaml 是否存在并启用 globals:
twig:
globals:
translator: '@translator'
调试小技巧
如果翻译没生效,别急着改内容,先验证基础链路:
- 运行
php bin/console debug:translation en查看英文翻译是否被识别 - 加
--domain=messages或--format=json更精准定位 - 检查日志:开启
debug环境,查看是否报Translation key not found—— 这说明文件加载了但 key 不匹配 - 临时在控制器里 dump:
dump($this->translator->trans('app.welcome'));,确认是否走通











