From 3657c0e664bfb1a62f9fea9a898406909a1e130b Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Tue, 24 Dec 2019 19:50:33 +0100 Subject: [PATCH] Use locale_parse for computing fallback locales --- .../Translation/Tests/TranslatorTest.php | 31 ++++++++++++++++--- .../Component/Translation/Translator.php | 13 +++++++- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/Translation/Tests/TranslatorTest.php b/src/Symfony/Component/Translation/Tests/TranslatorTest.php index 77af7de33e..68122b2915 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorTest.php @@ -234,15 +234,38 @@ class TranslatorTest extends TestCase $this->assertEquals('bar', $translator->trans('foo', [], 'resources')); } - public function testTransWithFallbackLocaleBis() + /** + * @dataProvider getFallbackLocales + */ + public function testTransWithFallbackLocaleBis($expectedLocale, $locale) { - $translator = new Translator('en_US'); + $translator = new Translator($locale); $translator->addLoader('array', new ArrayLoader()); - $translator->addResource('array', ['foo' => 'foofoo'], 'en_US'); - $translator->addResource('array', ['bar' => 'foobar'], 'en'); + $translator->addResource('array', ['foo' => 'foofoo'], $locale); + $translator->addResource('array', ['bar' => 'foobar'], $expectedLocale); $this->assertEquals('foobar', $translator->trans('bar')); } + public function getFallbackLocales() + { + $locales = [ + ['en', 'en_US'], + ['en', 'en-US'], + ['sl_Latn_IT', 'sl_Latn_IT_nedis'], + ['sl_Latn', 'sl_Latn_IT'], + ]; + + if (\function_exists('locale_parse')) { + $locales[] = ['sl_Latn_IT', 'sl-Latn-IT-nedis']; + $locales[] = ['sl_Latn', 'sl-Latn-IT']; + } else { + $locales[] = ['sl-Latn-IT', 'sl-Latn-IT-nedis']; + $locales[] = ['sl-Latn', 'sl-Latn-IT']; + } + + return $locales; + } + public function testTransWithFallbackLocaleTer() { $translator = new Translator('fr_FR'); diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index e72d20a86f..1bda62d1b1 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -412,8 +412,19 @@ EOF $locales[] = $fallback; } - if (false !== strrchr($locale, '_')) { + if (\function_exists('locale_parse')) { + $localeSubTags = locale_parse($locale); + if (1 < \count($localeSubTags)) { + array_pop($localeSubTags); + $fallback = locale_compose($localeSubTags); + if (false !== $fallback) { + array_unshift($locales, $fallback); + } + } + } elseif (false !== strrchr($locale, '_')) { array_unshift($locales, substr($locale, 0, -\strlen(strrchr($locale, '_')))); + } elseif (false !== strrchr($locale, '-')) { + array_unshift($locales, substr($locale, 0, -\strlen(strrchr($locale, '-')))); } return array_unique($locales);