Skip to content

Commit 615cbad

Browse files
committed
feature #46161 [Translation] Add PhpAstExtractor (welcoMattic)
This PR was merged into the 6.2 branch. Discussion ---------- [Translation] Add `PhpAstExtractor` | Q | A | ------------- | --- | Branch? | 6.2 | Bug fix? | no | New feature? | yes | Deprecations? | no | Tickets | Fix #44899, #42285, #45972, #45039 | License | MIT | Doc PR | symfony/symfony-docs#17369 After discussions with `@stof` and `@nicolas`-grekas at SymfonyLive Paris 2022, it appears clear that we need a brand new PhpExtractor in Translation to support various syntax, especially PHP8 new syntax (named arguments for example). In order to make this new extractor sustainable, performant and maintainable, it must be based on AST. That's why this PR adds a new optional dependency on [nikic/php-parser](https://github.com/nikic/PHP-Parser). The tests suite is the same as PhpExtractorTest, in addition to new cases for newly supported syntax. NB: I was inspired by https://github.com/php-translation/extractor design, with adaptations for Symfony. To-do: - [x] As suggested by `@Nyholm`, take a look at https://github.com/php-translation/extractor - [x] Fix #45039 (could be achieved easily with AST tree) Commits ------- 5d4a81f290 Add PhpAstExtractor
2 parents a0b7514 + d0d7003 commit 615cbad

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

DependencyInjection/Compiler/UnusedTagsPass.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class UnusedTagsPass implements CompilerPassInterface
8989
'texter.transport_factory',
9090
'translation.dumper',
9191
'translation.extractor',
92+
'translation.extractor.visitor',
9293
'translation.loader',
9394
'translation.provider_factory',
9495
'twig.extension',

DependencyInjection/FrameworkExtension.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Http\Client\HttpClient;
1818
use phpDocumentor\Reflection\DocBlockFactoryInterface;
1919
use phpDocumentor\Reflection\Types\ContextFactory;
20+
use PhpParser\Parser;
2021
use PHPStan\PhpDocParser\Parser\PhpDocParser;
2122
use Psr\Cache\CacheItemPoolInterface;
2223
use Psr\Container\ContainerInterface as PsrContainerInterface;
@@ -216,6 +217,7 @@
216217
use Symfony\Component\Translation\Bridge\Loco\LocoProviderFactory;
217218
use Symfony\Component\Translation\Bridge\Lokalise\LokaliseProviderFactory;
218219
use Symfony\Component\Translation\Command\XliffLintCommand as BaseXliffLintCommand;
220+
use Symfony\Component\Translation\Extractor\PhpAstExtractor;
219221
use Symfony\Component\Translation\LocaleSwitcher;
220222
use Symfony\Component\Translation\PseudoLocalizationTranslator;
221223
use Symfony\Component\Translation\Translator;
@@ -1313,6 +1315,14 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder
13131315
$container->removeDefinition('translation.locale_switcher');
13141316
}
13151317

1318+
if (ContainerBuilder::willBeAvailable('nikic/php-parser', Parser::class, ['symfony/translation'])
1319+
&& ContainerBuilder::willBeAvailable('symfony/translation', PhpAstExtractor::class, ['symfony/framework-bundle'])
1320+
) {
1321+
$container->removeDefinition('translation.extractor.php');
1322+
} else {
1323+
$container->removeDefinition('translation.extractor.php_ast');
1324+
}
1325+
13161326
$loader->load('translation_providers.php');
13171327

13181328
// Use the "real" translator instead of the identity default

Resources/config/translation.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@
2626
use Symfony\Component\Translation\Dumper\YamlFileDumper;
2727
use Symfony\Component\Translation\Extractor\ChainExtractor;
2828
use Symfony\Component\Translation\Extractor\ExtractorInterface;
29+
use Symfony\Component\Translation\Extractor\PhpAstExtractor;
2930
use Symfony\Component\Translation\Extractor\PhpExtractor;
31+
use Symfony\Component\Translation\Extractor\Visitor\ConstraintVisitor;
32+
use Symfony\Component\Translation\Extractor\Visitor\TranslatableMessageVisitor;
33+
use Symfony\Component\Translation\Extractor\Visitor\TransMethodVisitor;
3034
use Symfony\Component\Translation\Formatter\MessageFormatter;
3135
use Symfony\Component\Translation\Loader\CsvFileLoader;
3236
use Symfony\Component\Translation\Loader\IcuDatFileLoader;
@@ -151,6 +155,19 @@
151155
->set('translation.extractor.php', PhpExtractor::class)
152156
->tag('translation.extractor', ['alias' => 'php'])
153157

158+
->set('translation.extractor.php_ast', PhpAstExtractor::class)
159+
->args([tagged_iterator('translation.extractor.visitor')])
160+
->tag('translation.extractor', ['alias' => 'php'])
161+
162+
->set('translation.extractor.visitor.trans_method', TransMethodVisitor::class)
163+
->tag('translation.extractor.visitor')
164+
165+
->set('translation.extractor.visitor.translatable_message', TranslatableMessageVisitor::class)
166+
->tag('translation.extractor.visitor')
167+
168+
->set('translation.extractor.visitor.constraint', ConstraintVisitor::class)
169+
->tag('translation.extractor.visitor')
170+
154171
->set('translation.reader', TranslationReader::class)
155172
->alias(TranslationReaderInterface::class, 'translation.reader')
156173

0 commit comments

Comments
 (0)