[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.
This commit is contained in:
Matthias Pigulla 2015-04-08 15:13:56 +02:00
parent e140c7f3bd
commit 0f84f3adfa
2 changed files with 48 additions and 7 deletions

View File

@ -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

View File

@ -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';
}
}