Symfony4带参数闪存消息翻译问题求助
解决Symfony4中带参数闪存消息的翻译问题
嘿,我明白你遇到的问题了——直接用sprintf拼接参数会破坏翻译逻辑,因为你实际上是把翻译键和参数混在一起变成了新字符串,Twig再去翻译的时候就找不到对应的键了。下面给你两种靠谱的解决方案,都支持多参数和任意位置的参数替换,而且适配你继承AbstractController的场景:
方法1:Twig层面处理翻译(推荐)
这种方式把翻译键和参数分开存到闪存里,让Twig负责翻译+参数替换,好处是能适配用户当前的语言环境(比如用户切换语言后,闪存消息会自动用对应语言显示)。
控制器代码
// 假设你有项目标题$projectTitle和操作人$operatorName两个参数 $this->addFlash('success', [ 'key' => 'flashmessage.project_deleted', 'params' => [ '%title%' => $projectTitle, '%operator%' => $operatorName ] ]);
Twig模板代码
更新你渲染闪存消息的代码,兼容普通无参数消息和带参数的消息:
{% for type, flashes in app.flashes %} {% for flash in flashes %} <div class="alert alert-{{ type }}"> {% if flash is iterable %} {# 处理带参数的闪存消息 #} {{ flash.key|trans(flash.params) }} {% else %} {# 兼容原来的简单闪存消息 #} {{ flash|trans }} {% endif %} </div> {% endfor %} {% endfor %}
翻译文件配置
确保你的翻译文件(比如messages.en.yaml)里的键是带参数占位符的:
flashmessage: project_deleted: 'Project "%title%" has been deleted by %operator%.操作成功!'
方法2:控制器层面完成翻译
如果你的场景不需要考虑语言切换,或者希望在控制器里直接生成最终的翻译文本,可以用AbstractController自带的trans()方法直接完成翻译+参数替换:
控制器代码
$translatedMessage = $this->trans( 'flashmessage.project_deleted', ['%title%' => $projectTitle] ); $this->addFlash('success', $translatedMessage);
Twig模板代码
这种情况下Twig不需要再用trans过滤器,直接输出即可:
{% for type, flashes in app.flashes %} {% for flash in flashes %} <div class="alert alert-{{ type }}">{{ flash }}</div> {% endfor %} {% endfor %}
为什么之前的sprintf不行?
你之前的写法相当于把flashmessage.project_deleted和参数拼接成了一个新字符串(比如flashmessage.project_deleted: 我的项目),当Twig执行trans过滤器时,它会去翻译这个拼接后的字符串,而不是原来的翻译键,自然找不到对应的翻译内容,导致翻译失效。
内容的提问来源于stack exchange,提问作者Ingrid
相关产品推荐
相关产品推荐

