From 02bc23a7359bd60b799823aa6cb6dea79e7ba3b2 Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Wed, 7 Jan 2015 12:58:10 +0000 Subject: [PATCH] [Twig][Bridge][TranslationDefaultDomain] add support of named arguments. --- .../TranslationDefaultDomainNodeVisitor.php | 30 +++++++++++++--- .../Extension/TranslationExtensionTest.php | 34 +++++++++++++++++++ ...ranslationDefaultDomainNodeVisitorTest.php | 7 ++++ .../Tests/NodeVisitor/TwigNodeProvider.php | 26 ++++++++------ 4 files changed, 81 insertions(+), 16 deletions(-) diff --git a/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php b/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php index 8e7e7f48e3..841eb0dca2 100644 --- a/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php +++ b/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php @@ -62,14 +62,20 @@ class TranslationDefaultDomainNodeVisitor implements \Twig_NodeVisitorInterface } if ($node instanceof \Twig_Node_Expression_Filter && in_array($node->getNode('filter')->getAttribute('value'), array('trans', 'transchoice'))) { - $ind = 'trans' === $node->getNode('filter')->getAttribute('value') ? 1 : 2; $arguments = $node->getNode('arguments'); - if (!$arguments->hasNode($ind)) { - if (!$arguments->hasNode($ind - 1)) { - $arguments->setNode($ind - 1, new \Twig_Node_Expression_Array(array(), $node->getLine())); + $ind = 'trans' === $node->getNode('filter')->getAttribute('value') ? 1 : 2; + if ($this->isNamedArguments($arguments)) { + if (!$arguments->hasNode('domain') && !$arguments->hasNode($ind)) { + $arguments->setNode('domain', $this->scope->get('domain')); } + } else { + if (!$arguments->hasNode($ind)) { + if (!$arguments->hasNode($ind - 1)) { + $arguments->setNode($ind - 1, new \Twig_Node_Expression_Array(array(), $node->getLine())); + } - $arguments->setNode($ind, $this->scope->get('domain')); + $arguments->setNode($ind, $this->scope->get('domain')); + } } } elseif ($node instanceof TransNode) { if (null === $node->getNode('domain')) { @@ -103,4 +109,18 @@ class TranslationDefaultDomainNodeVisitor implements \Twig_NodeVisitorInterface { return -10; } + + /** + * @return bool + */ + private function isNamedArguments($arguments) + { + foreach ($arguments as $name => $node) { + if (!is_int($name)) { + return true; + } + } + + return false; + } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php index 8bd2838899..979301d466 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php @@ -148,6 +148,40 @@ class TranslationExtensionTest extends TestCase $this->assertEquals('foo (foo)foo (custom)foo (foo)foo (custom)foo (foo)foo (custom)', trim($template->render(array()))); } + public function testDefaultTranslationDomainWithNamedArguments() + { + $templates = array( + 'index' => ' + {%- trans_default_domain "foo" %} + + {%- block content %} + {{- "foo"|trans(arguments = {}, domain = "custom") }} + {{- "foo"|transchoice(count = 1) }} + {{- "foo"|transchoice(count = 1, arguments = {}, domain = "custom") }} + {{- "foo"|trans({}, domain = "custom") }} + {{- "foo"|trans({}, "custom", locale = "fr") }} + {{- "foo"|transchoice(1, arguments = {}, domain = "custom") }} + {{- "foo"|transchoice(1, {}, "custom", locale = "fr") }} + {% endblock %} + ', + + 'base' => ' + {%- block content "" %} + ', + ); + + $translator = new Translator('en', new MessageSelector()); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', array('foo' => 'foo (messages)'), 'en'); + $translator->addResource('array', array('foo' => 'foo (custom)'), 'en', 'custom'); + $translator->addResource('array', array('foo' => 'foo (foo)'), 'en', 'foo'); + $translator->addResource('array', array('foo' => 'foo (fr)'), 'fr', 'custom'); + + $template = $this->getTemplate($templates, $translator); + + $this->assertEquals('foo (custom)foo (foo)foo (custom)foo (custom)foo (fr)foo (custom)foo (fr)', trim($template->render(array()))); + } + protected function getTemplate($template, $translator = null) { if (null === $translator) { diff --git a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php index 24a6215e67..5e69c0939b 100644 --- a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php +++ b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php @@ -78,6 +78,13 @@ class TranslationDefaultDomainNodeVisitorTest extends TestCase array(TwigNodeProvider::getTransFilter(self::$message)), array(TwigNodeProvider::getTransChoiceFilter(self::$message)), array(TwigNodeProvider::getTransTag(self::$message)), + // with named arguments + array(TwigNodeProvider::getTransFilter(self::$message, null, array( + 'arguments' => new \Twig_Node_Expression_Array(array(), 0), + ))), + array(TwigNodeProvider::getTransChoiceFilter(self::$message), null, array( + 'arguments' => new \Twig_Node_Expression_Array(array(), 0), + )), ); } } diff --git a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php index 277e777483..0e401f62ea 100644 --- a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php +++ b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php @@ -29,12 +29,14 @@ class TwigNodeProvider ); } - public static function getTransFilter($message, $domain = null) + public static function getTransFilter($message, $domain = null, $arguments = null) { - $arguments = $domain ? array( - new \Twig_Node_Expression_Array(array(), 0), - new \Twig_Node_Expression_Constant($domain, 0), - ) : array(); + if (!$arguments) { + $arguments = $domain ? array( + new \Twig_Node_Expression_Array(array(), 0), + new \Twig_Node_Expression_Constant($domain, 0), + ) : array(); + } return new \Twig_Node_Expression_Filter( new \Twig_Node_Expression_Constant($message, 0), @@ -44,13 +46,15 @@ class TwigNodeProvider ); } - public static function getTransChoiceFilter($message, $domain = null) + public static function getTransChoiceFilter($message, $domain = null, $arguments = null) { - $arguments = $domain ? array( - new \Twig_Node_Expression_Constant(0, 0), - new \Twig_Node_Expression_Array(array(), 0), - new \Twig_Node_Expression_Constant($domain, 0), - ) : array(); + if (!$arguments) { + $arguments = $domain ? array( + new \Twig_Node_Expression_Constant(0, 0), + new \Twig_Node_Expression_Array(array(), 0), + new \Twig_Node_Expression_Constant($domain, 0), + ) : array(); + } return new \Twig_Node_Expression_Filter( new \Twig_Node_Expression_Constant($message, 0),