diff --git a/Tests/TranslatorTest.php b/Tests/TranslatorTest.php index 6ea62a0d..f4f46788 100644 --- a/Tests/TranslatorTest.php +++ b/Tests/TranslatorTest.php @@ -262,11 +262,17 @@ public function testTransWithIcuVariantFallbackLocale() $translator->addResource('array', ['foo' => 'foofoo'], 'en_GB_scouse'); $translator->addResource('array', ['bar' => 'foobar'], 'en_GB'); $translator->addResource('array', ['baz' => 'foobaz'], 'en_001'); - $translator->addResource('array', ['qux' => 'fooqux'], 'en'); + $translator->addResource('array', ['bar' => 'en', 'qux' => 'fooqux'], 'en'); + $translator->addResource('array', ['bar' => 'nl_NL', 'fallback' => 'nl_NL'], 'nl_NL'); + $translator->addResource('array', ['bar' => 'nl', 'fallback' => 'nl'], 'nl'); + + $translator->setFallbackLocales(['nl_NL', 'nl']); + $this->assertSame('foofoo', $translator->trans('foo')); $this->assertSame('foobar', $translator->trans('bar')); $this->assertSame('foobaz', $translator->trans('baz')); $this->assertSame('fooqux', $translator->trans('qux')); + $this->assertSame('nl_NL', $translator->trans('fallback')); } public function testTransWithIcuRootFallbackLocale() @@ -316,7 +322,7 @@ public function testTransWithFallbackLocaleTer() $translator = new Translator('fr_FR'); $translator->addLoader('array', new ArrayLoader()); $translator->addResource('array', ['foo' => 'foo (en_US)'], 'en_US'); - $translator->addResource('array', ['bar' => 'bar (en)'], 'en'); + $translator->addResource('array', ['foo' => 'foo (en)', 'bar' => 'bar (en)'], 'en'); $translator->setFallbackLocales(['en_US', 'en']); diff --git a/Translator.php b/Translator.php index 9a639561..c432b886 100644 --- a/Translator.php +++ b/Translator.php @@ -411,14 +411,8 @@ protected function computeFallbackLocales(string $locale) $this->parentLocales = json_decode(file_get_contents(__DIR__.'/Resources/data/parents.json'), true); } + $originLocale = $locale; $locales = []; - foreach ($this->fallbackLocales as $fallback) { - if ($fallback === $locale) { - continue; - } - - $locales[] = $fallback; - } while ($locale) { $parent = $this->parentLocales[$locale] ?? null; @@ -439,10 +433,18 @@ protected function computeFallbackLocales(string $locale) } if (null !== $locale) { - array_unshift($locales, $locale); + $locales[] = $locale; } } + foreach ($this->fallbackLocales as $fallback) { + if ($fallback === $originLocale) { + continue; + } + + $locales[] = $fallback; + } + return array_unique($locales); }