我在Symfony 4和翻译中遇到Flash消息问题。简单Flash消息的翻译工作正常:
$this->addFlash('success', 'flashmessage.project_deleted');
但是现在我想向Flash消息中添加一些参数,并且我不知道如何处理它。我尝试了很多,但没有任何效果。我想在fe删除后在Flash消息中显示项目的标题。例如:
$this->addFlash('success', sprintf('flashmessage.project_deleted: %s', $project->getTitle()));
但是无法识别翻译,因为参数是在翻译发生之前被替换的(我认为是)。并且还应该有可能在字符串的中间而不是在结尾或开头都具有参数,理想情况下,可以有多个参数。
我在扩展AbstractController的Controller中使用它。
有人对此有解决方案吗?
通常,您会将参数传递给翻译,因此您的代码段应该看起来像您的第一个示例,然后在树枝中您将得到以下内容:
{% for message in app.flashes('success') %}
<div class="alert alert-success">
{{ message|trans({ 'title': project.title }) }}
</div>
{% endfor %}
然后,转换应包含被替换的参数:
flashmessage:
project_created: 'The project "%title%" was created successfully.'
project_deleted: 'You successfully deleted the project "%title%".'
...
显然,缺点是您必须动态传递对于Flash消息没有太大意义的变量,因为并非所有变量都需要这些参数。另外,正如您已经提到的,当您删除项目时,模板中可能再也没有该项目了。
相反,我建议在将消息传递到Flash包之前先对其进行翻译:
$this->addFlash(
'success',
$this->translator->translate(
'flashmessage.project_deleted',
[
'title' => $project->getTitle(),
]
)
);
这将要求您将翻译器传递给控制器。为此,您可以创建自己的类似于Symfony的AbstractController的基本控制器,并创建类似$this->trans()
-method的方法,以便更轻松地在控制器内部转换内容。另外,您仍然必须确保该$project->getTitle()
值仍会返回一个值,因此您可能要在实际删除条目或将数据存储在内存中之前调用它。
当您以这种方式执行此操作时,您不应在模板本身中翻译即显消息,因为它们已被翻译。这仍然可以使用,因为当Symfony尝试翻译已翻译的消息时,例如You successfully deleted the project "foo".
,它将找不到翻译,而只是打印原始文本,但是您会在日志中收到有关缺少翻译的警告。解决方案是删除|trans
模板中的(请参见第一个片段)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句