包含数组的Symfony转换消息,查找长度

时间:2017-11-05 12:24:58

标签: arrays symfony twig yaml translation

设定:

考虑使用Symfony 3构建的多语言网站的情况,使用YAML文件进行翻译消息和TWIG模板进行显示。

在内容的一个部分中,在英语中,应该有一条说明,显示3个项目,每个项目代表一个过程的一个步骤。在德语中应该只有2个,而在西班牙语中则有50个。

此设置可能是:

#messages.en.yaml
root_node:
    -
        title: English title 1
        item: Some first list item
    -
        title: English title 2
        item: Some second list item
    -
        title: English title 3
        item: Some third list item


#messages.de.yaml
root_node:
    -
        title: German title 1
        item: Some other first list item
    -
        title: German title 2
        item: Some second German list item


#messages.es.yaml
root_node:
    -
        title: Spanish title 1
        item: Some Spanish first list item
    ...

etc ...

考虑到这种结构,理想情况下,我希望模板能够读取root_node是一个数组的事实,得到它的长度,以便我们可以显示步骤的总数,然后创建一个结构在twig模板中循环遍历数组并输出步骤作为一些翻译的标题和项目文本。

尝试按{{'root_node'|length}}{{('root_node'|trans)|length}}读取数组长度只是给出文本的长度而{{root_node|length}}给出错误,因为变量不在模板的范围内,因为它应该通过翻译服务查找。

问题:

如何在此翻译键上读取数组的长度? 是否应该以这种方式尝试?如果没有,是否有最佳实践来翻译Symfony中未知大小的数组(取决于翻译语言)?

1 个答案:

答案 0 :(得分:1)

没有直接的能力在Symfony翻译器中实现这种行为。但是,它可以通过在Symfony中使用pluralization机制间接实现。

您可以使用PluralizationRules::set方法设置自定义复数逻辑,然后使用步骤编号作为选择参数调用Translator::transChoice。您需要在模板中使用transchoice(index)过滤器以获取所需的步骤。

您可以通过将它们与translation catalogue分开计算并传递给模板来获取特定区域设置的步骤列表。或者,根据应用程序的逻辑,您可以简单地获取当前步骤的已翻译消息,并测试它是否为空字符串。