From 567cee5f02d16ec4af270c71bfd2efc661fee424 Mon Sep 17 00:00:00 2001 From: Artem Oliynyk Date: Mon, 20 Apr 2020 18:22:39 +0300 Subject: [PATCH] [Translation] Fix for translation:update command updating ICU messages --- .../Command/TranslationUpdateCommand.php | 9 ++++++- .../Translation/MessageCatalogue.php | 5 ++++ .../Tests/MessageCatalogueTest.php | 24 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php index ed871a5410b1..77bd9de7dd31 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php @@ -356,7 +356,14 @@ private function filterCatalogue(MessageCatalogue $catalogue, string $domain): M { $filteredCatalogue = new MessageCatalogue($catalogue->getLocale()); - if ($messages = $catalogue->all($domain)) { + // extract intl-icu messages only + $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; + if ($intlMessages = $catalogue->all($intlDomain)) { + $filteredCatalogue->add($intlMessages, $intlDomain); + } + + // extract all messages and subtract intl-icu messages + if ($messages = array_diff($catalogue->all($domain), $intlMessages)) { $filteredCatalogue->add($messages, $domain); } foreach ($catalogue->getResources() as $resource) { diff --git a/src/Symfony/Component/Translation/MessageCatalogue.php b/src/Symfony/Component/Translation/MessageCatalogue.php index 0aee3f849e14..75ec5b46c2d6 100644 --- a/src/Symfony/Component/Translation/MessageCatalogue.php +++ b/src/Symfony/Component/Translation/MessageCatalogue.php @@ -72,6 +72,11 @@ public function getDomains() public function all($domain = null) { if (null !== $domain) { + // skip messages merge if intl-icu requested explicitly + if (false !== strpos($domain, self::INTL_DOMAIN_SUFFIX)) { + return $this->messages[$domain] ?? []; + } + return ($this->messages[$domain.self::INTL_DOMAIN_SUFFIX] ?? []) + ($this->messages[$domain] ?? []); } diff --git a/src/Symfony/Component/Translation/Tests/MessageCatalogueTest.php b/src/Symfony/Component/Translation/Tests/MessageCatalogueTest.php index 5c4c7687ec08..b4e3149c7cad 100644 --- a/src/Symfony/Component/Translation/Tests/MessageCatalogueTest.php +++ b/src/Symfony/Component/Translation/Tests/MessageCatalogueTest.php @@ -67,6 +67,30 @@ public function testAll() $this->assertEquals($messages, $catalogue->all()); } + public function testAllIntICU() + { + $messages = [ + 'domain1+intl-icu' => ['foo' => 'bar'], + 'domain2+intl-icu' => ['bar' => 'foo'], + 'domain2' => ['biz' => 'biz'], + ]; + $catalogue = new MessageCatalogue('en', $messages); + + // separated domains + $this->assertSame(['foo' => 'bar'], $catalogue->all('domain1+intl-icu')); + $this->assertSame(['bar' => 'foo'], $catalogue->all('domain2+intl-icu')); + + // merged, intl-icu ignored + $this->assertSame(['bar' => 'foo', 'biz' => 'biz'], $catalogue->all('domain2')); + + // intl-icu ignored + $messagesExpected = [ + 'domain1' => ['foo' => 'bar'], + 'domain2' => ['bar' => 'foo', 'biz' => 'biz'], + ]; + $this->assertSame($messagesExpected, $catalogue->all()); + } + public function testHas() { $catalogue = new MessageCatalogue('en', ['domain1' => ['foo' => 'foo'], 'domain2+intl-icu' => ['bar' => 'bar']]);