From 0fb35a4a83b8f3856e8a02c0a912f11742a0fb3d Mon Sep 17 00:00:00 2001 From: Andrew Hilobok Date: Tue, 23 Apr 2013 17:03:00 +0300 Subject: [PATCH 1/2] Added reloading of fallback catalogues when calling addResource() (#7715) | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #7715 | License | MIT | Doc PR | --- .../Translation/Tests/TranslatorTest.php | 15 +++++++++++++++ src/Symfony/Component/Translation/Translator.php | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/src/Symfony/Component/Translation/Tests/TranslatorTest.php b/src/Symfony/Component/Translation/Tests/TranslatorTest.php index ac8a35e72f..9c6f3cdf66 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorTest.php @@ -67,6 +67,21 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase $this->assertEquals('foobar', $translator->trans('bar')); } + public function testAddResourceAfterTrans() + { + $translator = new Translator('en'); + $translator->addLoader('array', new ArrayLoader()); + + $translator->setLocale('fr'); + $translator->setFallbackLocale('en'); + + $translator->addResource('array', array('foo' => 'foofoo'), 'en'); + $this->assertEquals('foofoo', $translator->trans('foo')); + + $translator->addResource('array', array('bar' => 'foobar'), 'en'); + $this->assertEquals('foobar', $translator->trans('bar')); + } + /** * @dataProvider getTransFileTests * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index 47e8fe183f..dff284f54d 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -95,6 +95,11 @@ class Translator implements TranslatorInterface $this->resources[$locale][] = array($format, $resource, $domain); unset($this->catalogues[$locale]); + + // reload fallback catalogues for all locales that left + foreach(array_keys($this->catalogues) as $locale) { + $this->loadFallbackCatalogues($locale); + } } /** From 3c97004972f8f2094638241f9892b97f2bb8f7a0 Mon Sep 17 00:00:00 2001 From: Andrew Hilobok Date: Tue, 23 Apr 2013 19:01:41 +0300 Subject: [PATCH 2/2] Reset all catalogues when adding resource to fallback locale (#7715, #7819) Slightly refactored testAddResourceAfterTrans() and replaced costly part with reset all catalogues | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #7715, #7819 | License | MIT | Doc PR | --- .../Component/Translation/Tests/TranslatorTest.php | 5 ++--- src/Symfony/Component/Translation/Translator.php | 9 ++++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/Translation/Tests/TranslatorTest.php b/src/Symfony/Component/Translation/Tests/TranslatorTest.php index 9c6f3cdf66..3432fdac69 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorTest.php @@ -69,11 +69,10 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase public function testAddResourceAfterTrans() { - $translator = new Translator('en'); + $translator = new Translator('fr', new MessageSelector()); $translator->addLoader('array', new ArrayLoader()); - $translator->setLocale('fr'); - $translator->setFallbackLocale('en'); + $translator->setFallbackLocales(array('en')); $translator->addResource('array', array('foo' => 'foofoo'), 'en'); $this->assertEquals('foofoo', $translator->trans('foo')); diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index dff284f54d..a45dd0b75e 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -94,11 +94,10 @@ class Translator implements TranslatorInterface { $this->resources[$locale][] = array($format, $resource, $domain); - unset($this->catalogues[$locale]); - - // reload fallback catalogues for all locales that left - foreach(array_keys($this->catalogues) as $locale) { - $this->loadFallbackCatalogues($locale); + if(in_array($locale, $this->fallbackLocales)) { + $this->catalogues = array(); + } else { + unset($this->catalogues[$locale]); } }