diff --git a/src/Symfony/Component/Translation/Tests/TranslatorCacheTest.php b/src/Symfony/Component/Translation/Tests/TranslatorCacheTest.php index fdbb4f48e6dea..63846a2621bb7 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorCacheTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorCacheTest.php @@ -196,6 +196,37 @@ public function testDifferentCacheFilesAreUsedForDifferentSetsOfFallbackLocales( $this->assertEquals('bar', $translator->trans('bar')); } + public function testGetCatalogueBehavesConsistently() + { + /* + * Create a translator that loads two catalogues for two different locales. + * The catalogues contain distinct sets of messages. + */ + $translator = new Translator('a', null, $this->tmpDir); + $translator->setFallbackLocales(array('b')); + + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', array('foo' => 'foo (a)'), 'a'); + $translator->addResource('array', array('bar' => 'bar (b)'), 'b'); + + $catalogue = $translator->getCatalogue('a'); + $this->assertFalse($catalogue->defines('bar')); // Sure, the "a" catalogue does not contain that message. + + /* + * Now, repeat the same test. + * Behind the scenes, the cache is used. But that should not matter, right? + */ + $translator = new Translator('a', null, $this->tmpDir); + $translator->setFallbackLocales(array('b')); + + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', array('foo' => 'foo (a)'), 'a'); + $translator->addResource('array', array('bar' => 'bar (b)'), 'b'); + + $catalogue = $translator->getCatalogue('a'); + $this->assertFalse($catalogue->defines('bar')); + } + protected function getCatalogue($locale, $messages) { $catalogue = new MessageCatalogue($locale); diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index d62bfb68739cd..7d4f342dff5c3 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -16,6 +16,7 @@ use Symfony\Component\Config\ConfigCacheInterface; use Symfony\Component\Config\ConfigCacheFactoryInterface; use Symfony\Component\Config\ConfigCacheFactory; +use Symfony\Component\Translation\Catalogue\DiffOperation; /** * Translator. @@ -420,21 +421,6 @@ public function dumpCatalogue($locale, ConfigCacheInterface $cache) private function getFallbackContent(MessageCatalogue $catalogue) { - if (!$this->debug) { - // merge all fallback catalogues messages into $catalogue - $fallbackCatalogue = $catalogue->getFallbackCatalogue(); - $messages = $catalogue->all(); - while ($fallbackCatalogue) { - $messages = array_replace_recursive($fallbackCatalogue->all(), $messages); - $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); - } - foreach ($messages as $domain => $domainMessages) { - $catalogue->add($domainMessages, $domain); - } - - return ''; - } - $fallbackContent = ''; $current = ''; $replacementPattern = '/[^a-z0-9_]/i'; @@ -444,6 +430,18 @@ private function getFallbackContent(MessageCatalogue $catalogue) $fallbackSuffix = ucfirst(preg_replace($replacementPattern, '_', $fallback)); $currentSuffix = ucfirst(preg_replace($replacementPattern, '_', $current)); + if (!$this->debug) { + // keep only missing messages. + $currentCatalogue = new MessageCatalogue($fallbackCatalogue->getLocale(), $catalogue->all()); + $operation = new DiffOperation($fallbackCatalogue, $currentCatalogue); + $fallbackMessages = array(); + foreach ($operation->getDomains() as $domain) { + $fallbackMessages[$domain] = $operation->getObsoleteMessages($domain); + } + } else { + $fallbackMessages = $fallbackCatalogue->all(); + } + $fallbackContent .= sprintf(<<addFallbackCatalogue(\$catalogue%s); @@ -452,7 +450,7 @@ private function getFallbackContent(MessageCatalogue $catalogue) , $fallbackSuffix, $fallback, - var_export($fallbackCatalogue->all(), true), + var_export($fallbackMessages, true), $currentSuffix, $fallbackSuffix );