通常你会将参数传递给翻译函数,在你的代码片段中应该像第一个例子一样,然后在Twig模板中,你会有类似这样的语句:
{% 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消息都需要这些参数。此外,正如您已经提到的那样,当您删除项目时,模板中可能不再可用。
相反,我建议在将消息传递到Flash包之前进行翻译:
$this->addFlash(
'success',
$this->translator->translate(
'flashmessage.project_deleted',
[
'title' => $project->getTitle(),
]
)
);
这将需要您将翻译器传递给控制器。您可以创建自己的基础控制器,类似于Symfony的AbstractController,并创建类似于$this->trans()
方法,以便更轻松地在控制器内部翻译内容。此外,您仍然需要确保$project->getTitle()
返回一个值,因此您可能希望在实际删除条目或将数据存储在内存中之前调用此函数。
如果您以这种方式进行操作,则不应在模板本身中翻译闪存消息,因为它们已经被翻译过了。这仍然有效,因为当Symfony尝试翻译已经翻译过的消息时,例如You successfully deleted the project "foo".
,它将找不到翻译并只打印原始文本,但是您将在日志中收到有关缺少翻译的警告。解决方案是从模板中删除|trans
(请参见第一个代码片段)。
现在它已经起作用了。我的解决方法是将TranslatorInterface添加为函数参数,代码看起来像这样:
$flashmessage = $translator->trans('flashmessage.project_created_successfully', ['title' => $gdprcontent->getTitle()]); $this->addFlash('success', $flashmessage);
翻译文件中的代码如下:<trans-unit id=".UV8EG1" resname="flashmessage.project_created_successfully"> <source>flashmessage.project_created_successfully</source> <target>项目创建成功:title</target> </trans-unit>
- Ingrid