From 0f84f3adfa879b8b66731af08e3a9b5dffa84b4b Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Wed, 8 Apr 2015 15:13:56 +0200 Subject: [PATCH] [Translator] Cache does not take fallback locales into consideration As we're dumping entire catalogues including their fallbacks (standalone or inlined in ~2.7), we need to use different cache files for different sets of fallback locales. --- .../Tests/Translation/TranslatorTest.php | 48 ++++++++++++++++--- .../Translation/Translator.php | 7 ++- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php index 2b2e1a6980..deaca9c2e2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php @@ -12,6 +12,7 @@ namespace Symfony\Bundle\FrameworkBundle\Tests\Translation; use Symfony\Bundle\FrameworkBundle\Translation\Translator; +use Symfony\Component\Translation\Loader\ArrayLoader; use Symfony\Component\Translation\MessageCatalogue; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Translation\MessageSelector; @@ -183,6 +184,34 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase $this->assertSame('en-US', $translator->getLocale()); } + public function testDifferentCacheFilesAreUsedForDifferentSetsOfFallbackLocales() + { + /* + * Because the cache file contains a catalogue including all of its fallback + * catalogues, we must take the active set of fallback locales into + * consideration when loading a catalogue from the cache. + */ + $translator = $this->createTranslator(new ArrayLoader(), array('cache_dir' => $this->tmpDir)); + $translator->setLocale('a'); + $translator->setFallbackLocales(array('b')); + $translator->addResource('loader', array('foo' => 'foo (a)'), 'a'); + $translator->addResource('loader', array('bar' => 'bar (b)'), 'b'); + + $this->assertEquals('bar (b)', $translator->trans('bar')); + + // Remove fallback locale + $translator->setFallbackLocales(array()); + $this->assertEquals('bar', $translator->trans('bar')); + + // Use a fresh translator with no fallback locales, result should be the same + $translator = $this->createTranslator(new ArrayLoader(), array('cache_dir' => $this->tmpDir)); + $translator->setLocale('a'); + $translator->addResource('loader', array('foo' => 'foo (a)'), 'a'); + $translator->addResource('loader', array('bar' => 'bar (b)'), 'b'); + + $this->assertEquals('bar', $translator->trans('bar')); + } + protected function getCatalogue($locale, $messages) { $catalogue = new MessageCatalogue($locale); @@ -265,12 +294,7 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase public function getTranslator($loader, $options = array(), $translatorClass = '\Symfony\Bundle\FrameworkBundle\Translation\Translator') { - $translator = new $translatorClass( - $this->getContainer($loader), - new MessageSelector(), - array('loader' => array('loader')), - $options - ); + $translator = $this->createTranslator($loader, $options, $translatorClass); $translator->addResource('loader', 'foo', 'fr'); $translator->addResource('loader', 'foo', 'en'); @@ -282,6 +306,18 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase return $translator; } + + private function createTranslator($loader, $options, $translatorClass = '\Symfony\Bundle\FrameworkBundle\Translation\Translator') + { + $translator = new $translatorClass( + $this->getContainer($loader), + new MessageSelector(), + array('loader' => array('loader')), + $options + ); + + return $translator; + } } class TranslatorWithInvalidLocale extends Translator diff --git a/src/Symfony/Bundle/FrameworkBundle/Translation/Translator.php b/src/Symfony/Bundle/FrameworkBundle/Translation/Translator.php index ffc050fb48..f791a63509 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Translation/Translator.php +++ b/src/Symfony/Bundle/FrameworkBundle/Translation/Translator.php @@ -95,7 +95,7 @@ class Translator extends BaseTranslator $this->assertValidLocale($locale); - $cache = new ConfigCache($this->options['cache_dir'].'/catalogue.'.$locale.'.php', $this->options['debug']); + $cache = new ConfigCache($this->getCatalogueCachePath($locale), $this->options['debug']); if (!$cache->isFresh()) { $this->initialize(); @@ -157,4 +157,9 @@ EOF } } } + + private function getCatalogueCachePath($locale) + { + return $this->options['cache_dir'].'/catalogue.'.$locale.'.'.sha1(serialize($this->getFallbackLocales())).'.php'; + } }