[Twig][Bridge][TranslationDefaultDomain] add support of named arguments.

This commit is contained in:
Abdellatif Ait boudad 2015-01-07 12:58:10 +00:00 committed by Fabien Potencier
parent ec1cae8b14
commit 02bc23a735
4 changed files with 81 additions and 16 deletions

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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),
)),
);
}
}

View File

@ -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),