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

时间:2013-04-05 13:32:41

标签: symfony internationalization twig

在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) }}

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这里有几个问题,让我们来介绍它们。

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

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

  • {% set var = expression %}{% 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: - )

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 %}

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

注意:

  • _self是存储宏的模板(有关详情,请参阅documentation)。

  • 使用了
  • trim,因为我用缩进和换行符写了这个宏(读起来比较干净)。默认情况下,这些空格是打印的。

相关问题