2015-01-09 65 views
4

我想有树枝从翻译文件转换成一个阵列Symfony2的翻译YAML阵列和树枝环

// messages.en.yml

termsAndConditions: 
    title: Terms and Conditions 
    paragraph: 
    - Paragraph text...blah blah...1 
    - Paragraph text...blah blah...2 
    - Paragraph text...blah blah...3 
    - Paragraph text...blah blah...n 

// termsandconditions.html.twig

//试过......

{% for i in range(1,termsAndConditions.paragraph|length) -%} 
    <p>{% trans %}termsAndConditions.paragraph. {{ i }}{% endtrans %}</p> 
{%- endfor %} 

//并试图...

{% for i in range(1,termsAndConditions.paragraph|length) -%} 
    <p>{{ 'termsAndConditions.paragraph.' ~ i ~ |trans }}</p> 
{%- endfor %} 

回答

5

您需要使用双keys: values把事情的工作:

// messages.en.yml 
termsAndConditions: 
    title: Terms and Conditions 
    paragraph: 
    1: Paragraph text...blah blah...1 
    2: Paragraph text...blah blah...2 
    3: Paragraph text...blah blah...3 
    4: Paragraph text...blah blah...n 

另外,并且由于要使用一个变量为您翻译的事实,获得了翻译这样{{('termsAndConditions.paragraph.'~i)|trans }}

我硬编码4而不是termsAndConditions.paragraph|length。真的不知道你是否可以从树枝模板访问它...

// termsandconditions.html.twig 
{% for i in range(1,4) -%} 
    <p>{{('termsAndConditions.paragraph.'~i)|trans}}</p> 
{%- endfor %} 

它应该工作。希望能帮助到你。

UPDATE

termsAndConditions.paragraph|length使除非你在模板中的变量定义或已通过控制器注入的变量没有任何意义。

解决方案

解决方案1.在你的控制,访问YAML并得到翻译的数量,然后将它传递给模板,这就是它。

解决方案2.创建服务并将translator服务注入到服务中。在控制器中创建一个计算特定key的元素数量的方法。注入翻译器服务比直接读取yaml更好,因为它在读取目录时缓存目录。

解决方案3.与2相同,但创建树枝过滤器。因为它看起来很有趣,所以我会去做这个。

解决方案3

让我们通过创建扩展开始:

namespace Acme\DemoBundle\Twig\Extension; 

class TransLengthExtension extends \Twig_Extension 
{ 
    private $translator; 

    public function __construct($translator) { 
     $this->translator = $translator; 
    } 


    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('translength', array($this, 'translengthFilter')), 
     ); 
    } 

    public function translengthFilter($id, $domain = null) 
    { 
     if (null === $domain) { 
      $domain = 'messages'; 
     } 

     $i = 0; 
     $g = $this->translator->getMessages(); 
     foreach($g["messages"] as $key => $message) { 
      if(substr($key, 0, strlen($id)) === $id) { 
       $i++; 
      } 
     } 

     return $i; 
    } 

    public function getName() 
    { 
     return 'acme_extension'; 
    } 
} 

正如你可以在上面看到,它计算的$ id出现在翻译目录的数量。翻译负责区域设置,加载相应的目录等。它还缓存了性能方面非常好的结果。

注册服务注入的翻译和注册的树枝延伸:

services: 
    acme.twig.acme_extension: 
     class: Acme\DemoBundle\Twig\Extension\TransLengthExtension 
     arguments: 
      - "@translator" 
     tags: 
      - { name: twig.extension } 

现在,在您的模板:

{% set end = 'termsAndConditions.paragraph'|translength %} 
{% for i in range(1,end) -%} 
    <p>{{('termsAndConditions.paragraph.'~i)|trans}}</p> 
{%- endfor %} 

希望它能帮助。

+0

它非常接近,但问题是,我不知道总,因此'..n'和长度。 – 2015-01-10 05:37:11

+0

这是我得到的错误'Variable“termsAndConditions”不存在“ – 2015-01-10 05:44:21

+0

@EddieJaoude请检查更新 – acontell 2015-01-10 10:08:07

0

有此树枝过滤器 - keys

{% for keyname in yml_tree_nodes|keys %}