带占位符的 Symfony 翻译不起作用

Symfony translation with placeholder doesn't work

我正在尝试使用 Symfony translate (5.1.*) 翻译我的应用程序。我使用 Symfony 5.1。 基本翻译工作正常,但我对 twig 中的变量有疑问。

当我做的时候 {% trans with {'%name%': 'World'} from 'app' %}Hello %name%{% endtrans %}

它工作正常,结果如预期的那样 Hello World。但如果我这样做

php bin/console translation:update --force en
php bin/console cache:clear

生成翻译文件,结果为Hello %name%.

如果在翻译文件中,我删除这个引用:

<trans-unit id="yhpYN0i" resname="Hello %name%">
    <source>Hello %name%</source>
    <target>Hello %name%</target>
</trans-unit>

结果又是Hello World.

有人知道为什么在使用变量时翻译文件不起作用吗?

如果您使用 ICU message format,占位符必须是 {}。正如文档所述:

In the previous translation format, placeholders were often wrapped in % (e.g. %name%). This % character is no longer valid with the ICU MessageFormat syntax, so you must rename your parameters if you are upgrading from the previous format.

您必须将翻译文件更改为:

<target>Hello {name}</target>

并从你的 Twig 助手调用中删除 %

{% trans with {'name': 'World'} from 'app' %}Hello %name%{% endtrans %}

如果您不需要 ICU 提供的复数规则,要继续使用旧格式,您可以重命名翻译文件以删除 +intl-icu 后缀。