8

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

Hello {{nickname}}

会成为

{% trans %}Hello %nickname%{% endtrans %}

这按预期工作。我传递给 Twig 的带有占位符的数组会自动映射到 %placeHolder%。不涉及额外的工作。因此,这适用于控制器中的我的 PHP 数组:

Array('nickname' => 'rolandow')

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

现在我想使用标签翻译整个文本块。我不知道如何在翻译中使用标签。所以,我的树枝看起来像这样:

{{ say.hello|trans }}

还有我的翻译片段

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

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

{{ say.hello|trans('%nickName%' : nickName) }}

如果我想在我的控制器中使用给树枝的其他标签,我也需要将它们传递给翻译器。我不能以某种方式传递完整的数组吗?

4

2 回答 2

2

{{ say.hello|trans('%nickname%': 'rolandow') }}

于 2017-06-22T06:10:31.650 回答
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) }}

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

placeholder3)关于在你的参数数组的键中替换%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 %}

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

备注:

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

  • trim之所以使用,是因为我编写了带有缩进和换行符的宏(这更容易阅读)。默认情况下,这些空格是打印的。

于 2013-05-06T20:37:44.130 回答