[Twig][Bridge][TranslationDefaultDomain] add support of named arguments.
This commit is contained in:
parent
ec1cae8b14
commit
02bc23a735
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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),
|
||||
)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
Reference in New Issue