2016-06-03 2 views
0

Я пытаюсь создать прут тег, который можно использовать следующим образом:Дать веточка тег, который опирается на другой тег

{% set_domain "zip-recipes" %} 
... 
... 
{% trans "Ingredients" %} 
... 
{% trans "Ingredients" %} 

trans тег будет необходим домен, установленный в set_domain теге.

Я создал узел и анализатор для set_domain, чтобы добавить домен в $context:

class Project_TransDomain_Node extends \Twig_Node 
{ 
    public function __construct($domain, $line, $tag = null) 
    { 
     parent::__construct(array(), array('domain' => $domain), $line, $tag); 
    } 

    public function compile(\Twig_Compiler $compiler) 
    { 
     $compiler 
      ->addDebugInfo($this) 
      ->write('$context[\'trans_domain\'] = "' . $this->getAttribute('domain') . '"') 
      ->raw(";\n") 
     ; 
    } 
} 

class TransDomain_TokenParser extends \Twig_TokenParser 
{ 
    public function parse(\Twig_Token $token) 
    { 
     $parser = $this->parser; 
     $stream = $parser->getStream(); 

     $domain = $stream->expect(\Twig_Token::STRING_TYPE)->getValue(); 
     $stream->expect(\Twig_Token::BLOCK_END_TYPE); 

     return new Project_TransDomain_Node($domain, $token->getLine(), $this->getTag()); 
    } 

    public function getTag() 
    { 
     return 'set_domain'; 
    } 
} 

Однако, я не уверен, как получить доступ, что в node для trans.

Я попытался это, но он не оценивает $context['trans_domain']:

class Project_Trans_Node extends \Twig_Node 
{ 
    public function __construct($string, $line, $tag = null) 
    { 
     parent::__construct(array(), array('string' => $string), $line, $tag); 
    } 

    public function compile(\Twig_Compiler $compiler) 
    { 
     $string = $this->getAttribute('string'); 
     $domainExpr = $context['trans_domain']; 

     $compiler 
      ->addDebugInfo($this) 
      ->write("echo __('${string}','") 
      ->repr('$context["trans_domain"]') 
      ->raw("'") 
      ->raw(";\n") 
     ; 
    } 
} 

ответ

0

Symfony уже имеет trans_default_domain тег (начиная с 2.1), просто использовать.

Вы можете установить домен перевода для всего шаблона Twig с одним тэгом:

{% trans_default_domain "app" %}

Заметим, что это влияет только на текущий шаблон, а не какой-либо «включен» шаблон (для того, чтобы избегать побочных эффектов).

+0

My bad on tagging # symfony2. Я не использую symfony. – Gezim

+0

Я не знаю, что можно сделать, но вы можете посмотреть код Symfony, чтобы получить вдохновение. Код можно найти в [TwigBridge] (https://github.com/symfony/symfony/tree/v3.1.0/src/Symfony/Bridge/Twig). Из того, что я вижу из этого, он не устанавливает домен в контексте, а непосредственно на узлах передачи ([TranslationDefaultDomainNodeVisitor.php] (https://github.com/symfony/symfony/blob/v3.1.0/src/Symfony/ мост/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php)) – 1ed