From b752653e9413dadcc313ef13cfeb8a9f40d7e8cd Mon Sep 17 00:00:00 2001 From: Mathieu Santostefano Date: Tue, 25 Jan 2022 17:40:47 +0100 Subject: [PATCH] Allow usage of Provider domains if possible --- .../Command/TranslationPushCommand.php | 9 ++- .../Command/TranslationPushCommandTest.php | 64 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Translation/Command/TranslationPushCommand.php b/src/Symfony/Component/Translation/Command/TranslationPushCommand.php index 56c6f5b1c59bf..973ed5fe12b4d 100644 --- a/src/Symfony/Component/Translation/Command/TranslationPushCommand.php +++ b/src/Symfony/Component/Translation/Command/TranslationPushCommand.php @@ -20,6 +20,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Translation\Provider\FilteringProvider; use Symfony\Component\Translation\Provider\TranslationProviderCollection; use Symfony\Component\Translation\Reader\TranslationReaderInterface; use Symfony\Component\Translation\TranslatorBag; @@ -133,7 +134,13 @@ protected function execute(InputInterface $input, OutputInterface $output): int $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths); if (!$domains) { - $domains = $this->getDomainsFromTranslatorBag($localTranslations); + if ($provider instanceof FilteringProvider) { + $domains = $provider->getDomains(); + } + + if (!$domains) { + $domains = $this->getDomainsFromTranslatorBag($localTranslations); + } } if (!$deleteMissing && $force) { diff --git a/src/Symfony/Component/Translation/Tests/Command/TranslationPushCommandTest.php b/src/Symfony/Component/Translation/Tests/Command/TranslationPushCommandTest.php index bdbc14616740e..9fcd0d77b183b 100644 --- a/src/Symfony/Component/Translation/Tests/Command/TranslationPushCommandTest.php +++ b/src/Symfony/Component/Translation/Tests/Command/TranslationPushCommandTest.php @@ -17,7 +17,9 @@ use Symfony\Component\Translation\Command\TranslationPushCommand; use Symfony\Component\Translation\Loader\ArrayLoader; use Symfony\Component\Translation\Loader\XliffFileLoader; +use Symfony\Component\Translation\Provider\FilteringProvider; use Symfony\Component\Translation\Provider\ProviderInterface; +use Symfony\Component\Translation\Provider\TranslationProviderCollection; use Symfony\Component\Translation\Reader\TranslationReader; use Symfony\Component\Translation\TranslatorBag; @@ -259,6 +261,68 @@ public function testPushForceAndDeleteMissingMessages() $this->assertStringContainsString('[OK] All local translations has been sent to "null" (for "en, fr" locale(s), and "messages" domain(s)).', trim($tester->getDisplay())); } + public function testPushWithProviderDomains() + { + $arrayLoader = new ArrayLoader(); + $xliffLoader = new XliffFileLoader(); + $locales = ['en', 'fr']; + $domains = ['messages']; + + // Simulate existing messages on Provider + $providerReadTranslatorBag = new TranslatorBag(); + $providerReadTranslatorBag->addCatalogue($arrayLoader->load(['note' => 'NOTE'], 'en')); + $providerReadTranslatorBag->addCatalogue($arrayLoader->load(['note' => 'NOTE'], 'fr')); + + $provider = $this->createMock(FilteringProvider::class); + $provider->expects($this->once()) + ->method('read') + ->with($domains, $locales) + ->willReturn($providerReadTranslatorBag); + $provider->expects($this->once()) + ->method('getDomains') + ->willReturn(['messages']); + + $filenameEn = $this->createFile([ + 'note' => 'NOTE', + 'new.foo' => 'newFoo', + ]); + $filenameFr = $this->createFile([ + 'note' => 'NOTE', + 'new.foo' => 'nouveauFoo', + ], 'fr'); + $localTranslatorBag = new TranslatorBag(); + $localTranslatorBag->addCatalogue($xliffLoader->load($filenameEn, 'en')); + $localTranslatorBag->addCatalogue($xliffLoader->load($filenameFr, 'fr')); + + $provider->expects($this->once()) + ->method('write') + ->with($localTranslatorBag->diff($providerReadTranslatorBag)); + + $provider->expects($this->once()) + ->method('__toString') + ->willReturn('null://default'); + + $reader = new TranslationReader(); + $reader->addLoader('xlf', new XliffFileLoader()); + + $command = new TranslationPushCommand( + new TranslationProviderCollection([ + 'loco' => $provider, + ]), + $reader, + [$this->translationAppDir.'/translations'], + $locales + ); + + $application = new Application(); + $application->add($command); + $tester = new CommandTester($application->find('translation:push')); + + $tester->execute(['--locales' => ['en', 'fr']]); + + $this->assertStringContainsString('[OK] New local translations has been sent to "null" (for "en, fr" locale(s), and "messages" domain(s)).', trim($tester->getDisplay())); + } + /** * @dataProvider provideCompletionSuggestions */