Skip to content

Commit

Permalink
[TwigBridge] fixed message keys extraction when no domain is defined …
Browse files Browse the repository at this point in the history
…in the template
  • Loading branch information
fabpot committed Sep 23, 2011
1 parent 645bd82 commit b6c8f63
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 51 deletions.
26 changes: 16 additions & 10 deletions src/Symfony/Bridge/Twig/Translation/TwigExtractor.php
Expand Up @@ -18,7 +18,7 @@

/**
* TwigExtractor extracts translation messages from a twig template.
*
*
* @author Michel Salib <michelsalib@hotmail.com>
*/
class TwigExtractor implements ExtractorInterface
Expand All @@ -28,26 +28,26 @@ class TwigExtractor implements ExtractorInterface
*
* @var string
*/
private $defaultDomain = '';
private $defaultDomain = 'messages';

/**
* Prefix for found message.
*
* @var string
*/
private $prefix = '';

/**
* The twig environment.
* @var \Twig_Environment
*/
private $twig;

public function __construct(\Twig_Environment $twig)
{
$this->twig = $twig;
}

/**
* {@inheritDoc}
*/
Expand All @@ -57,11 +57,17 @@ public function extract($directory, MessageCatalogue $catalogue)
$finder = new Finder();
$files = $finder->files()->name('*.twig')->in($directory);
foreach ($files as $file) {
$tree = $this->twig->parse($this->twig->tokenize(file_get_contents($file->getPathname())));
$this->crawlNode($tree, $catalogue);
$this->extractTemplate(file_get_contents($file->getPathname()), $catalogue);
}
}

protected function extractTemplate($template, MessageCatalogue $catalogue)
{
$tree = $this->twig->parse($this->twig->tokenize($template));

$this->crawlNode($tree, $catalogue);
}

/**
* {@inheritDoc}
*/
Expand Down Expand Up @@ -132,16 +138,16 @@ private function extractDomain(\Twig_Node $node)
if (!$node instanceof \Twig_Node_Expression_Filter) {
return null;
}

// is a trans filter
if ($node->getNode('filter')->getAttribute('value') === 'trans') {
if ($node->getNode('arguments')->hasNode(1)) {
return $node->getNode('arguments')->getNode(1)->getAttribute('value');
}

return $this->defaultDomain;
}

return $this->extractDomain($node->getNode('node'));
}
}

74 changes: 33 additions & 41 deletions tests/Symfony/Tests/Bridge/Twig/Translation/TwigExtractorTest.php
Expand Up @@ -11,56 +11,48 @@

namespace Symfony\Tests\Bridge\Twig\Translation;

use Symfony\Bridge\Twig\Node\TransNode;
use Symfony\Bridge\Twig\Extension\TranslationExtension;
use Symfony\Bridge\Twig\Translation\TwigExtractor;
use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Tests\Bridge\Twig\TestCase;

class TwigExtractorTest extends TestCase
{
public function testFilterExtraction()
/**
* @dataProvider getExtractData
*/
public function testExtract($template, $messages)
{
// 1.Arrange
// a node using trans filter : {{ 'new key' | trans({}, 'domain') }}
$transNode = new \Twig_Node_Expression_Filter(
new \Twig_Node_Expression_Constant('first key', 0),
new \Twig_Node_Expression_Constant('trans', 0),
new \Twig_Node(array(
1 => new \Twig_Node_Expression_Constant('domain', 0)
)), array(), 0);
// a trans block : {% trans from 'domain' %}second key{% endtrans %}
$transBlock = new TransNode(
new \Twig_Node(array(), array('data' => 'second key')),
new \Twig_Node(array(), array('value' => 'domain'))
);
// mock the twig environment
$twig = $this->getMock('Twig_Environment');
$twig->expects($this->once())
->method('tokenize')
->will($this->returnValue(new \Twig_TokenStream(array())))
;
$twig->expects($this->once())
->method('parse')
->will($this->returnValue(
new \Twig_Node(array(
new \Twig_Node_Text('stub text', 0),
new \Twig_Node_Print($transNode,0),
$transBlock,
))
))
;
// prepare extractor and catalogue
$loader = new \Twig_Loader_Array(array());
$twig = new \Twig_Environment($loader, array(
'strict_variables' => true,
'debug' => true,
'cache' => false,
'autoescape' => false,
));
$twig->addExtension(new TranslationExtension($this->getMock('Symfony\Component\Translation\TranslatorInterface')));

$extractor = new TwigExtractor($twig);
$extractor->setPrefix('prefix');
$catalogue = new MessageCatalogue('en');

// 2.Act
$extractor->extract(__DIR__.'/../Fixtures/Resources/views/', $catalogue);

// 3.Assert
$this->assertTrue($catalogue->has('first key', 'domain'), '->extract() should find at leat "first key" message in the domain "domain"');
$this->assertTrue($catalogue->has('second key', 'domain'), '->extract() should find at leat "second key" message in the domain "domain"');
$this->assertEquals(2, count($catalogue->all('domain')), '->extract() should find 2 translations in the domain "domain"');
$this->assertEquals('prefixfirst key', $catalogue->get('first key', 'domain'), '->extract() should apply "prefix" as prefix');

$m = new \ReflectionMethod($extractor, 'extractTemplate');
$m->setAccessible(true);
$m->invoke($extractor, $template, $catalogue);

foreach ($messages as $key => $domain) {
$this->assertTrue($catalogue->has($key, $domain));
$this->assertEquals('prefix'.$key, $catalogue->get($key, $domain));
}
}

public function getExtractData()
{
return array(
array('{{ "new key" | trans() }}', array('new key' => 'messages')),
array('{{ "new key" | trans({}, "domain") }}', array('new key' => 'domain')),
array('{% trans %}new key{% endtrans %}', array('new key' => 'messages')),
array('{% trans from "domain" %}new key{% endtrans %}', array('new key' => 'domain')),
);
}
}

0 comments on commit b6c8f63

Please sign in to comment.