symfony4本地化翻译占位符需用%key%语法,php中trans()第二参数须为含%name%键的数组,xliff中source与target占位符必须一致,twig中用'|trans({'%name%': value})',常见错误包括路径错误、漏%号、域不匹配或locale未配置。

在 Symfony4 中,本地化翻译里传递占位符参数,核心是用 %key% 语法配合 trans() 或 Twig 的 trans 过滤器,同时确保翻译源文件中对应 key 的值包含相同命名的占位符。
PHP 中 trans() 传参写法
调用 trans() 时,第二个参数传入一个关联数组,键名必须和翻译字符串里的占位符名称完全一致(包括大小写和下划线):
trans('welcome.user', ['%name%' => '张三', '%role%' => '管理员'])- 对应翻译文件中需写:
<target>欢迎,%name%,您是%role%</target> - 注意:占位符必须带百分号,
%name%不能写成name或{name}
XLIFF 文件中的占位符写法
在 messages.en.xlf 或 messages.zh_CN.xlf 里,<source></source> 和 <target></target> 都要保留相同的占位符结构:
<source>welcome.user</source><target>Welcome, %name%, your role is %role%.</target>- 如果源语言用的是
%name%,目标语言也必须用%name%,不能改成{{ name }}或$name
Twig 模板中使用 trans 过滤器
在 Twig 里更简洁,直接用命名参数:
{{ 'welcome.user'|trans({'%name%': '李四', '%role%': '编辑'}) }}- 也可结合变量:
{{ 'welcome.user'|trans({'%name%': user.name, '%role%': user.role}) }} - 不支持省略百分号,
'name'会失效,必须是'%name%'
常见错误与验证要点
占位符不生效,通常卡在这几个地方:
- 翻译文件未放在
translations/目录下,或命名不符合domain.locale.loader规则(如写成messages.zh.yml而非messages.zh_CN.yaml) - trans() 第二个参数键名漏了百分号,比如传
['name' => 'xxx'],但翻译里是%name% - 翻译域(domain)没对上,默认是
messages,若用了自定义域如admin,就得调用trans('key', [], 'admin') - locale 设置未生效,检查
config/packages/translation.yaml是否启用了translator,且default_locale已配置











