From d2ec41f4ef01774b33e397c7b3fb21773646ca2d Mon Sep 17 00:00:00 2001 From: Hugo Sales Date: Sat, 18 Jul 2020 02:28:19 +0000 Subject: [PATCH] [Translation] Add support for calling 'trans' with ICU formatted messages --- .../Component/Translation/CHANGELOG.md | 1 + .../Translation/Tests/TranslatorTest.php | 19 +++++++++++++++++++ .../Component/Translation/Translator.php | 5 ++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Translation/CHANGELOG.md b/src/Symfony/Component/Translation/CHANGELOG.md index eda8f363f9..004cd83ec9 100644 --- a/src/Symfony/Component/Translation/CHANGELOG.md +++ b/src/Symfony/Component/Translation/CHANGELOG.md @@ -4,6 +4,7 @@ CHANGELOG 5.2.0 ----- + * added support for calling `trans` with ICU formatted messages * added `PseudoLocalizationTranslator` 5.1.0 diff --git a/src/Symfony/Component/Translation/Tests/TranslatorTest.php b/src/Symfony/Component/Translation/Tests/TranslatorTest.php index 72a4f9055a..2d2e5e40df 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorTest.php @@ -368,6 +368,14 @@ class TranslatorTest extends TestCase $this->assertEquals($expected, $translator->trans($id, $parameters, $domain, $locale)); } + /** + * @dataProvider getTransICUTests + */ + public function testTransICU(...$args) + { + $this->testTrans(...$args); + } + /** * @dataProvider getInvalidLocalesTests */ @@ -444,6 +452,17 @@ class TranslatorTest extends TestCase ]; } + public function getTransICUTests() + { + $id = '{apples, plural, =0 {There are no apples} one {There is one apple} other {There are # apples}}'; + + return [ + ['There are no apples', $id, $id, ['{apples}' => 0], 'en', 'test'.MessageCatalogue::INTL_DOMAIN_SUFFIX], + ['There is one apple', $id, $id, ['{apples}' => 1], 'en', 'test'.MessageCatalogue::INTL_DOMAIN_SUFFIX], + ['There are 3 apples', $id, $id, ['{apples}' => 3], 'en', 'test'.MessageCatalogue::INTL_DOMAIN_SUFFIX], + ]; + } + public function getFlattenedTransTests() { $messages = [ diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index c92abf1383..6b1f3985be 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -214,7 +214,10 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA } } - if ($this->hasIntlFormatter && $catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) { + $len = \strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX); + if ($this->hasIntlFormatter + && ($catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX) + || 0 == substr_compare($domain, MessageCatalogue::INTL_DOMAIN_SUFFIX, -$len, $len))) { return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, $parameters); }