gpt4 book ai didi

symfony - 在 Symfony 4 中翻译带有参数的 flash 消息

转载 作者:行者123 更新时间:2023-12-05 06:21:41 27 4
gpt4 key购买 nike

我在 Symfony 4 和翻译中遇到了闪现消息的问题。简单的 flash 消息的翻译工作正常:

$this->addFlash('success', 'flashmessage.project_deleted');

但是现在我想给闪现消息添加一些参数,我不知道如何处理它。我尝试了很多,但没有任何效果。我想在 flash 消息中显示 f.e. 之后的项目标题。删除。例如:

$this->addFlash('success', sprintf('flashmessage.project_deleted: %s', $project->getTitle()));

但是翻译不被识别,因为参数在翻译发生之前被替换(我认为是这样)。并且还应该可以在字符串中间设置参数,而不仅仅是在末尾或开头,理想情况下不止一个参数。

我在扩展 AbstractController 的 Controller 中使用它。

有人对此有解决方案吗?

最佳答案

通常你会将参数传递给翻译,所以你的代码片段可能应该看起来像你的第一个例子,然后在 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 包之前先翻译消息:

$this->addFlash(
'success',
$this->translator->translate(
'flashmessage.project_deleted',
[
'title' => $project->getTitle(),
]
)
);

这将要求您将翻译器传递给您的 Controller 。您可以为此创建类似于 Symfony 的 AbstractController 的自己的基本 Controller ,并创建类似 $this->trans() 的方法,以便更轻松地在 Controller 内翻译内容。此外,您仍然必须确保 $project->getTitle() 仍会返回一个值,因此您可能希望在实际删除条目或将数据存入内存之前调用它。

当您这样做时,您不应该翻译模板本身中的即显消息,因为它们已经被翻译过了。这仍然有效,因为当 Symfony 尝试翻译已经翻译的消息时,例如您已成功删除项目“foo”。 然后它不会找到翻译并只打印原始文本,但您会在日志中收到有关缺少翻译的警告。解决方案是删除模板中的 |trans(请参阅第一个代码段)。

关于symfony - 在 Symfony 4 中翻译带有参数的 flash 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59660768/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com