Skip to content

Commit 0e13cf6

Browse files
authored
Use "desc" as default translation when extracting (#218)
* Simplify code * bugfix * Disable DefaultApplyingNodeVisitor and RemovingNodeVisitor when extracting translations * Use "desc" as default translation when extracting * cs
1 parent 3674b79 commit 0e13cf6

File tree

4 files changed

+101
-57
lines changed

4 files changed

+101
-57
lines changed

Model/Metadata.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,21 @@ public function setState($state)
6565
$this->addCategory('state', $state);
6666
}
6767

68+
/**
69+
* @return null|string
70+
*/
71+
public function getDesc()
72+
{
73+
$notes = $this->getAllInCategory('desc');
74+
foreach ($notes as $note) {
75+
if (isset($note['content'])) {
76+
return $note['content'];
77+
}
78+
}
79+
80+
return null;
81+
}
82+
6883
/**
6984
* @return bool
7085
*/

Resources/config/services.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ services:
3232
php_translation.importer:
3333
public: true
3434
class: Translation\Bundle\Service\Importer
35-
arguments: ["@php_translation.extractor"]
35+
arguments: ["@php_translation.extractor", "@twig"]
3636

3737
php_translation.cache_clearer:
3838
public: true

Service/Importer.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
use Symfony\Component\Translation\MessageCatalogue;
1616
use Translation\Bundle\Model\ImportResult;
1717
use Translation\Bundle\Model\Metadata;
18+
use Translation\Bundle\Twig\Visitor\DefaultApplyingNodeVisitor;
19+
use Translation\Bundle\Twig\Visitor\RemovingNodeVisitor;
1820
use Translation\Extractor\Extractor;
1921
use Translation\Extractor\Model\SourceCollection;
2022
use Translation\Extractor\Model\SourceLocation;
@@ -38,11 +40,18 @@ final class Importer
3840
private $config;
3941

4042
/**
41-
* @param Extractor $extractor
43+
* @var \Twig_Environment
4244
*/
43-
public function __construct(Extractor $extractor)
45+
private $twig;
46+
47+
/**
48+
* @param Extractor $extractor
49+
* @param \Twig_Environment $twig
50+
*/
51+
public function __construct(Extractor $extractor, \Twig_Environment $twig)
4452
{
4553
$this->extractor = $extractor;
54+
$this->twig = $twig;
4655
}
4756

4857
/**
@@ -60,6 +69,7 @@ public function __construct(Extractor $extractor)
6069
public function extractToCatalogues(Finder $finder, array $catalogues, array $config = [])
6170
{
6271
$this->processConfig($config);
72+
$this->disableTwigVisitors();
6373
$sourceCollection = $this->extractor->extract($finder);
6474
$results = [];
6575
foreach ($catalogues as $catalogue) {
@@ -86,6 +96,11 @@ public function extractToCatalogues(Finder $finder, array $catalogues, array $co
8696
$meta = $this->getMetadata($result, $key, $domain);
8797
$meta->setState('new');
8898
$this->setMetadata($result, $key, $domain, $meta);
99+
100+
// Add "desc" as translation
101+
if (null === $translation && null !== $desc = $meta->getDesc()) {
102+
$result->set($key, $desc, $domain);
103+
}
89104
}
90105
foreach ($merge->getObsoleteMessages($domain) as $key => $translation) {
91106
$meta = $this->getMetadata($result, $key, $domain);
@@ -196,4 +211,16 @@ private function processConfig($config)
196211

197212
$this->config = $config;
198213
}
214+
215+
private function disableTwigVisitors()
216+
{
217+
foreach ($this->twig->getNodeVisitors() as $visitor) {
218+
if ($visitor instanceof DefaultApplyingNodeVisitor) {
219+
$visitor->setEnabled(false);
220+
}
221+
if ($visitor instanceof RemovingNodeVisitor) {
222+
$visitor->setEnabled(false);
223+
}
224+
}
225+
}
199226
}

Twig/Visitor/DefaultApplyingNodeVisitor.php

Lines changed: 56 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -48,68 +48,70 @@ public function doEnterNode(\Twig_Node $node, \Twig_Environment $env)
4848
return $node;
4949
}
5050

51-
if ($node instanceof \Twig_Node_Expression_Filter && 'desc' === $node->getNode('filter')->getAttribute('value')) {
52-
$transNode = $node->getNode('node');
53-
while ($transNode instanceof \Twig_Node_Expression_Filter
54-
&& 'trans' !== $transNode->getNode('filter')->getAttribute('value')
55-
&& 'transchoice' !== $transNode->getNode('filter')->getAttribute('value')) {
56-
$transNode = $transNode->getNode('node');
57-
}
51+
if (!($node instanceof \Twig_Node_Expression_Filter && 'desc' === $node->getNode('filter')->getAttribute('value'))) {
52+
return $node;
53+
}
5854

59-
if (!$transNode instanceof \Twig_Node_Expression_Filter) {
60-
throw new \RuntimeException(sprintf('The "desc" filter must be applied after a "trans", or "transchoice" filter.'));
61-
}
55+
$transNode = $node->getNode('node');
56+
while ($transNode instanceof \Twig_Node_Expression_Filter
57+
&& 'trans' !== $transNode->getNode('filter')->getAttribute('value')
58+
&& 'transchoice' !== $transNode->getNode('filter')->getAttribute('value')) {
59+
$transNode = $transNode->getNode('node');
60+
}
6261

63-
$wrappingNode = $node->getNode('node');
64-
$testNode = clone $wrappingNode;
65-
$defaultNode = $node->getNode('arguments')->getNode(0);
66-
67-
// if the |transchoice filter is used, delegate the call to the TranslationExtension
68-
// so that we can catch a possible exception when the default translation has not yet
69-
// been extracted
70-
if ('transchoice' === $transNode->getNode('filter')->getAttribute('value')) {
71-
$transchoiceArguments = new \Twig_Node_Expression_Array([], $transNode->getTemplateLine());
72-
$transchoiceArguments->addElement($wrappingNode->getNode('node'));
73-
$transchoiceArguments->addElement($defaultNode);
74-
foreach ($wrappingNode->getNode('arguments') as $arg) {
75-
$transchoiceArguments->addElement($arg);
76-
}
77-
78-
$transchoiceNode = new Transchoice($transchoiceArguments, $transNode->getTemplateLine());
79-
$node->setNode('node', $transchoiceNode);
80-
81-
return $node;
82-
}
62+
if (!$transNode instanceof \Twig_Node_Expression_Filter) {
63+
throw new \RuntimeException(sprintf('The "desc" filter must be applied after a "trans", or "transchoice" filter.'));
64+
}
8365

84-
// if the |trans filter has replacements parameters
85-
// (e.g. |trans({'%foo%': 'bar'}))
86-
if ($wrappingNode->getNode('arguments')->hasNode(0)) {
87-
$lineno = $wrappingNode->getTemplateLine();
88-
89-
// remove the replacements from the test node
90-
$testNode->setNode('arguments', clone $testNode->getNode('arguments'));
91-
$testNode->getNode('arguments')->setNode(0, new \Twig_Node_Expression_Array([], $lineno));
92-
93-
// wrap the default node in a |replace filter
94-
$defaultNode = new \Twig_Node_Expression_Filter(
95-
clone $node->getNode('arguments')->getNode(0),
96-
new \Twig_Node_Expression_Constant('replace', $lineno),
97-
new \Twig_Node([
98-
clone $wrappingNode->getNode('arguments')->getNode(0),
99-
]),
100-
$lineno
101-
);
66+
$wrappingNode = $node->getNode('node');
67+
$testNode = clone $wrappingNode;
68+
$defaultNode = $node->getNode('arguments')->getNode(0);
69+
70+
// if the |transchoice filter is used, delegate the call to the TranslationExtension
71+
// so that we can catch a possible exception when the default translation has not yet
72+
// been extracted
73+
if ('transchoice' === $transNode->getNode('filter')->getAttribute('value')) {
74+
$transchoiceArguments = new \Twig_Node_Expression_Array([], $transNode->getTemplateLine());
75+
$transchoiceArguments->addElement($wrappingNode->getNode('node'));
76+
$transchoiceArguments->addElement($defaultNode);
77+
foreach ($wrappingNode->getNode('arguments') as $arg) {
78+
$transchoiceArguments->addElement($arg);
10279
}
10380

104-
$condition = new \Twig_Node_Expression_Conditional(
105-
new \Twig_Node_Expression_Binary_Equal($testNode, $transNode->getNode('node'), $wrappingNode->getTemplateLine()),
106-
$defaultNode,
107-
clone $wrappingNode,
108-
$wrappingNode->getTemplateLine()
81+
$transchoiceNode = new Transchoice($transchoiceArguments, $transNode->getTemplateLine());
82+
$node->setNode('node', $transchoiceNode);
83+
84+
return $node;
85+
}
86+
87+
// if the |trans filter has replacements parameters
88+
// (e.g. |trans({'%foo%': 'bar'}))
89+
if ($wrappingNode->getNode('arguments')->hasNode(0)) {
90+
$lineno = $wrappingNode->getTemplateLine();
91+
92+
// remove the replacements from the test node
93+
$testNode->setNode('arguments', clone $testNode->getNode('arguments'));
94+
$testNode->getNode('arguments')->setNode(0, new \Twig_Node_Expression_Array([], $lineno));
95+
96+
// wrap the default node in a |replace filter
97+
$defaultNode = new \Twig_Node_Expression_Filter(
98+
clone $node->getNode('arguments')->getNode(0),
99+
new \Twig_Node_Expression_Constant('replace', $lineno),
100+
new \Twig_Node([
101+
clone $wrappingNode->getNode('arguments')->getNode(0),
102+
]),
103+
$lineno
109104
);
110-
$node->setNode('node', $condition);
111105
}
112106

107+
$condition = new \Twig_Node_Expression_Conditional(
108+
new \Twig_Node_Expression_Binary_Equal($testNode, $transNode->getNode('node'), $wrappingNode->getTemplateLine()),
109+
$defaultNode,
110+
clone $wrappingNode,
111+
$wrappingNode->getTemplateLine()
112+
);
113+
$node->setNode('node', $condition);
114+
113115
return $node;
114116
}
115117

0 commit comments

Comments
 (0)