使用标签在翻译中使用占位符

rol*_*dow 8 internationalization symfony twig

在Symfony/Twig中,我可以通过在翻译块中使用百分比来使用标记.例如:

Hello {{nickname}}
Run Code Online (Sandbox Code Playgroud)

会成为

{% trans %}Hello %nickname%{% endtrans %}
Run Code Online (Sandbox Code Playgroud)

这按预期工作.我传递给Twig的占位符数组会自动映射到%placeHolder%.不需要额外的工作.所以这适用于来自控制器的我的PHP数组:

Array('nickname' => 'rolandow')
Run Code Online (Sandbox Code Playgroud)

当我想在翻译块中使用昵称时,我所要做的就是用百分比%来包围它.不幸的是,当我传递给它时,这似乎不起作用trans.

现在我想使用标签翻译整个文本块.我无法弄清楚如何在翻译中使用这些标签.所以,我的树枝看起来像这样:

{{ say.hello|trans }}
Run Code Online (Sandbox Code Playgroud)

和我的翻译片段

<trans-unit id="1">
  <source>say.hello</source>
  <target>Hello %nickName%, how are you doing today? lots-of-text-here</target>
</trans-unit>
Run Code Online (Sandbox Code Playgroud)

我通过在我的模板中使用它来实现它,但感觉就像做两次.我现在需要将占位符数组再次放入trans函数中.例如:

{{ say.hello|trans('%nickName%' : nickName) }}
Run Code Online (Sandbox Code Playgroud)

如果我想在控制器中使用给予twig的其他标签,我也需要将它们传递给翻译器.我不能以某种方式通过完整的阵列吗?

Ala*_*blo 1

这里有几个问题,所以让我们来讨论一下。

1) Twig 的行为不像 Doctrine 查询,每个参数都必须有界。您可以将包含未使用参数的数组传递给trans,因此如果您不想指定{'key': 'value', 'key2': 'value2'...}给过滤器,只需传递整个数组(例如:| trans(array))。这就是@Luke 的观点。

2)您可以使用多种方式翻译文本块,最简单的是{% set %}。该{% set %}标签有两种使用方式:

  • {% set var = expression %}or{% set var1, var2 = expression1, expression2 %}是最知名和最常用的方法:只需将一些值放入一个或多个变量中即可。

  • {% set var %}文本块{% endset %}允许您在该变量内设置整个文本块。如果您想将该块放入过滤器中(例如,escape,或者在您的情况下,trans),这非常有用。

因此,要翻译一段文本,您需要执行以下操作:

{% set variable %}
block to translate %placeholder%
{% endset %}
{{ variable | trans(array) }}
Run Code Online (Sandbox Code Playgroud)

无论如何,我不认为一次性翻译整个块有任何兴趣:我们| trans通常在属性(例如say.hello)之后使用,并且我无法想象您的 xlf/yml 翻译文件具有这样的设计。如果您只想使用翻译器来完成占位符,只需使用 Twig,因为它是为该工作编写的:-)

3)关于在参数数组的键中替换placeholder%placeholder%:Twig 的要点是:将您想要的内容作为占位符。这样,如果您的翻译句子包含多个%,您可以使用$something$#something#甚至something作为占位符。

如果你的数组键不包含这些%,你需要添加它们,你没有任何选择。如果您确实想在 Twig 文件上执行此操作,您可以创建一个宏来为您完成这项工作,并将其放入您在基本布局中导入的文件中。

就像是 :

{% macro trans_pct(property, params) %}
  {% set newParams = [] }
  {% if params %}
    {% for key, value in params %}
      {% set newParams['%' ~ key ~ '%'] = value %}
    {% endfor %}
  {% endif %}
  {{ property | trans(newParams) }}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

然后将其与 一起使用{{ _self.trans_pct('hello.say', array) | trim }}

注意事项:

  • _self是存储宏的模板(有关更多详细信息,请参阅文档)。

  • trim使用它是因为我编写了带有缩进和换行符的宏(这样读起来更清晰)。默认情况下,会打印这些空格。