diff --git a/src/Symfony/Component/Translation/Command/TranslationPushCommand.php b/src/Symfony/Component/Translation/Command/TranslationPushCommand.php index bf6e8c948b8ed..dcc3e4cf9d9a1 100644 --- a/src/Symfony/Component/Translation/Command/TranslationPushCommand.php +++ b/src/Symfony/Component/Translation/Command/TranslationPushCommand.php @@ -137,7 +137,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int // Reading local translations must be done after retrieving the domains from the provider // in order to manage only translations from configured domains - $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths); + $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths, true); if (!$domains) { $domains = $this->getDomainsFromTranslatorBag($localTranslations); diff --git a/src/Symfony/Component/Translation/Command/TranslationTrait.php b/src/Symfony/Component/Translation/Command/TranslationTrait.php index eafaffd3f10d4..39450f1763618 100644 --- a/src/Symfony/Component/Translation/Command/TranslationTrait.php +++ b/src/Symfony/Component/Translation/Command/TranslationTrait.php @@ -20,7 +20,7 @@ */ trait TranslationTrait { - private function readLocalTranslations(array $locales, array $domains, array $transPaths): TranslatorBag + private function readLocalTranslations(array $locales, array $domains, array $transPaths, bool $mergeIntlIcu = false): TranslatorBag { $bag = new TranslatorBag(); @@ -32,7 +32,7 @@ private function readLocalTranslations(array $locales, array $domains, array $tr if ($domains) { foreach ($domains as $domain) { - $bag->addCatalogue($this->filterCatalogue($catalogue, $domain)); + $bag->addCatalogue($this->filterCatalogue($catalogue, $domain, $mergeIntlIcu)); } } else { $bag->addCatalogue($catalogue); @@ -42,14 +42,14 @@ private function readLocalTranslations(array $locales, array $domains, array $tr return $bag; } - private function filterCatalogue(MessageCatalogue $catalogue, string $domain): MessageCatalogue + private function filterCatalogue(MessageCatalogue $catalogue, string $domain, bool $mergeIntlIcu): MessageCatalogue { $filteredCatalogue = new MessageCatalogue($catalogue->getLocale()); // extract intl-icu messages only $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; if ($intlMessages = $catalogue->all($intlDomain)) { - $filteredCatalogue->add($intlMessages, $intlDomain); + $filteredCatalogue->add($intlMessages, $mergeIntlIcu ? $domain : $intlDomain); } // extract all messages and subtract intl-icu messages diff --git a/src/Symfony/Component/Translation/Tests/Command/TranslationPushCommandTest.php b/src/Symfony/Component/Translation/Tests/Command/TranslationPushCommandTest.php index 9fcd0d77b183b..f869dd1911eea 100644 --- a/src/Symfony/Component/Translation/Tests/Command/TranslationPushCommandTest.php +++ b/src/Symfony/Component/Translation/Tests/Command/TranslationPushCommandTest.php @@ -89,6 +89,52 @@ public function testPushNewMessages() $this->assertStringContainsString('[OK] New local translations has been sent to "null" (for "en, fr" locale(s), and "messages" domain(s)).', trim($tester->getDisplay())); } + public function testPushNewIntlIcuMessages() + { + $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(ProviderInterface::class); + $provider->expects($this->once()) + ->method('read') + ->with($domains, $locales) + ->willReturn($providerReadTranslatorBag); + + // Create local files, with a new message + $filenameEn = $this->createFile([ + 'note' => 'NOTE', + 'new.foo' => 'newFooIntlIcu', + ], 'en', 'messages+intl-icu.%locale%.xlf'); + $filenameFr = $this->createFile([ + 'note' => 'NOTE', + 'new.foo' => 'nouveauFooIntlIcu', + ], 'fr', 'messages+intl-icu.%locale%.xlf'); + $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'); + + $tester = $this->createCommandTester($provider, $locales, $domains); + + $tester->execute(['--locales' => ['en', 'fr'], '--domains' => ['messages']]); + + $this->assertStringContainsString('[OK] New local translations has been sent to "null" (for "en, fr" locale(s), and "messages" domain(s)).', trim($tester->getDisplay())); + } + public function testPushForceMessages() { $xliffLoader = new XliffFileLoader();