From 122eaba746a4f77be6ec2798a697fc2aed54045e Mon Sep 17 00:00:00 2001 From: Stephen Date: Sun, 6 Dec 2020 15:28:21 +0100 Subject: [PATCH] [TwigBridge] export concatenated translations --- .../NodeVisitor/TranslationNodeVisitor.php | 35 +++++++++++++++++++ .../Tests/Translation/TwigExtractorTest.php | 13 +++++++ 2 files changed, 48 insertions(+) diff --git a/src/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php b/src/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php index 23c244e4248f7..e5b0fc4ea1b73 100644 --- a/src/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php +++ b/src/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php @@ -13,6 +13,7 @@ use Symfony\Bridge\Twig\Node\TransNode; use Twig\Environment; +use Twig\Node\Expression\Binary\ConcatBinary; use Twig\Node\Expression\ConstantExpression; use Twig\Node\Expression\FilterExpression; use Twig\Node\Expression\FunctionExpression; @@ -87,6 +88,16 @@ protected function doEnterNode(Node $node, Environment $env): Node $node->getNode('body')->getAttribute('data'), $node->hasNode('domain') ? $this->getReadDomainFromNode($node->getNode('domain')) : null, ]; + } elseif ( + $node instanceof FilterExpression && + 'trans' === $node->getNode('filter')->getAttribute('value') && + $node->getNode('node') instanceof ConcatBinary && + $message = $this->getConcatValueFromNode($node->getNode('node'), null) + ) { + $this->messages[] = [ + $message, + $this->getReadDomainFromArguments($node->getNode('arguments'), 1), + ]; } return $node; @@ -151,4 +162,28 @@ private function getReadDomainFromNode(Node $node): ?string return self::UNDEFINED_DOMAIN; } + + private function getConcatValueFromNode(Node $node, ?string $value): ?string + { + if ($node instanceof ConcatBinary) { + foreach ($node as $nextNode) { + if ($nextNode instanceof ConcatBinary) { + $nextValue = $this->getConcatValueFromNode($nextNode, $value); + if (null === $nextValue) { + return null; + } + $value .= $nextValue; + } elseif ($nextNode instanceof ConstantExpression) { + $value .= $nextNode->getAttribute('value'); + } else { + // this is a node we cannot process (variable, or translation in translation) + return null; + } + } + } elseif ($node instanceof ConstantExpression) { + $value .= $node->getAttribute('value'); + } + + return $value; + } } diff --git a/src/Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php b/src/Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php index 03e2936d42ca2..66a9515c2d7d7 100644 --- a/src/Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php @@ -43,6 +43,10 @@ public function testExtract($template, $messages) $m->setAccessible(true); $m->invoke($extractor, $template, $catalogue); + if (0 === \count($messages)) { + $this->assertSame($catalogue->all(), $messages); + } + foreach ($messages as $key => $domain) { $this->assertTrue($catalogue->has($key, $domain)); $this->assertEquals('prefix'.$key, $catalogue->get($key, $domain)); @@ -70,6 +74,15 @@ public function getExtractData() // make sure this works with twig's named arguments ['{{ "new key" | trans(domain="domain") }}', ['new key' => 'domain']], + + // concat translations + ['{{ ("new" ~ " key") | trans() }}', ['new key' => 'messages']], + ['{{ ("another " ~ "new " ~ "key") | trans() }}', ['another new key' => 'messages']], + ['{{ ("new" ~ " key") | trans(domain="domain") }}', ['new key' => 'domain']], + ['{{ ("another " ~ "new " ~ "key") | trans(domain="domain") }}', ['another new key' => 'domain']], + // if it has a variable or other expression, we can not extract it + ['{% set foo = "new" %} {{ ("new " ~ foo ~ "key") | trans() }}', []], + ['{{ ("foo " ~ "new"|trans ~ "key") | trans() }}', ['new' => 'messages']], ]; } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy