rol*_*dow 8 internationalization symfony 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的其他标签,我也需要将它们传递给翻译器.我不能以某种方式通过完整的阵列吗?
这里有几个问题,所以让我们来讨论一下。
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,因为它是为该工作编写的:-)
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是存储宏的模板(有关更多详细信息,请参阅文档)。
trim使用它是因为我编写了带有缩进和换行符的宏(这样读起来更清晰)。默认情况下,会打印这些空格。
| 归档时间: | 
 | 
| 查看次数: | 4664 次 | 
| 最近记录: |