2015-01-09 45 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 %}