在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的其他标签,我也需要将它们传递给翻译器。我不能以某种方式通过完整的阵列吗?
答案 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
,因为我用缩进和换行符写了这个宏(读起来比较干净)。默认情况下,这些空格是打印的。