From 1113999699517e867f9df478f59418b266ec9116 Mon Sep 17 00:00:00 2001 From: iamluc Date: Mon, 22 Dec 2014 09:44:13 +0100 Subject: [PATCH] Refresh catalogues when resources change --- .../Translation/Tests/TranslatorCacheTest.php | 35 +++++++++++++++++++ .../Component/Translation/Translator.php | 34 +++++++++++++++--- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Translation/Tests/TranslatorCacheTest.php b/src/Symfony/Component/Translation/Tests/TranslatorCacheTest.php index 088fe21ccd..be9703b03b 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorCacheTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorCacheTest.php @@ -101,6 +101,41 @@ class TranslatorCacheTest extends \PHPUnit_Framework_TestCase $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax')); } + public function testRefreshCacheWhenResourcesChange() + { + // prime the cache + $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface'); + $loader + ->method('load') + ->will($this->returnValue($this->getCatalogue('fr', array( + 'foo' => 'foo A', + )))) + ; + + $translator = new Translator('fr', new MessageSelector(), $this->tmpDir, true); + $translator->setLocale('fr'); + $translator->addLoader('loader', $loader); + $translator->addResource('loader', 'foo', 'fr'); + + $this->assertEquals('foo A', $translator->trans('foo')); + + // add a new resource to refresh the cache + $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface'); + $loader + ->method('load') + ->will($this->returnValue($this->getCatalogue('fr', array( + 'foo' => 'foo B', + )))) + ; + + $translator = new Translator('fr', new MessageSelector(), $this->tmpDir, true); + $translator->setLocale('fr'); + $translator->addLoader('loader', $loader); + $translator->addResource('loader', 'bar', 'fr'); + + $this->assertEquals('foo B', $translator->trans('foo')); + } + public function testTransWithCachingWithInvalidLocale() { $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface'); diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index 69d765b78e..8b95333f16 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -346,8 +346,9 @@ class Translator implements TranslatorInterface, TranslatorBagInterface /** * @param string $locale + * @param bool $forceRefresh */ - private function initializeCacheCatalogue($locale) + private function initializeCacheCatalogue($locale, $forceRefresh = false) { if (isset($this->catalogues[$locale])) { return; @@ -361,7 +362,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface $this->assertValidLocale($locale); $cache = new ConfigCache($this->cacheDir.'/catalogue.'.$locale.'.php', $this->debug); - if (!$cache->isFresh()) { + if ($forceRefresh || !$cache->isFresh()) { $this->initializeCatalogue($locale); $fallbackContent = ''; @@ -392,13 +393,15 @@ EOF use Symfony\Component\Translation\MessageCatalogue; +\$resourcesHash = '%s'; \$catalogue = new MessageCatalogue('%s', %s); %s -return \$catalogue; +return array(\$catalogue, \$resourcesHash); EOF , + $this->getResourcesHash($locale), $locale, var_export($this->catalogues[$locale]->all(), true), $fallbackContent @@ -409,7 +412,30 @@ EOF return; } - $this->catalogues[$locale] = include $cache; + $catalogue = include $cache; + + /** + * Old cache returns only the catalogue, without resourcesHash + */ + $resourcesHash = null; + if (is_array($catalogue)) { + list($catalogue, $resourcesHash) = $catalogue; + } + + if ($this->debug && $resourcesHash !== $this->getResourcesHash($locale)) { + return $this->initializeCacheCatalogue($locale, true); + } + + $this->catalogues[$locale] = $catalogue; + } + + private function getResourcesHash($locale) + { + if (!isset($this->resources[$locale])) { + return ''; + } + + return sha1(serialize($this->resources[$locale])); } private function doLoadCatalogue($locale)