1212namespace Symfony \Bundle \FrameworkBundle \Tests \Translation ;
1313
1414use Symfony \Bundle \FrameworkBundle \Translation \Translator ;
15+ use Symfony \Component \Translation \Loader \ArrayLoader ;
1516use Symfony \Component \Translation \MessageCatalogue ;
1617use Symfony \Component \Filesystem \Filesystem ;
1718use Symfony \Component \Translation \MessageSelector ;
@@ -183,6 +184,34 @@ public function testGetLocaleWithInvalidLocale()
183184 $ this ->assertSame ('en-US ' , $ translator ->getLocale ());
184185 }
185186
187+ public function testDifferentCacheFilesAreUsedForDifferentSetsOfFallbackLocales ()
188+ {
189+ /*
190+ * Because the cache file contains a catalogue including all of its fallback
191+ * catalogues, we must take the active set of fallback locales into
192+ * consideration when loading a catalogue from the cache.
193+ */
194+ $ translator = $ this ->createTranslator (new ArrayLoader (), array ('cache_dir ' => $ this ->tmpDir ));
195+ $ translator ->setLocale ('a ' );
196+ $ translator ->setFallbackLocales (array ('b ' ));
197+ $ translator ->addResource ('loader ' , array ('foo ' => 'foo (a) ' ), 'a ' );
198+ $ translator ->addResource ('loader ' , array ('bar ' => 'bar (b) ' ), 'b ' );
199+
200+ $ this ->assertEquals ('bar (b) ' , $ translator ->trans ('bar ' ));
201+
202+ // Remove fallback locale
203+ $ translator ->setFallbackLocales (array ());
204+ $ this ->assertEquals ('bar ' , $ translator ->trans ('bar ' ));
205+
206+ // Use a fresh translator with no fallback locales, result should be the same
207+ $ translator = $ this ->createTranslator (new ArrayLoader (), array ('cache_dir ' => $ this ->tmpDir ));
208+ $ translator ->setLocale ('a ' );
209+ $ translator ->addResource ('loader ' , array ('foo ' => 'foo (a) ' ), 'a ' );
210+ $ translator ->addResource ('loader ' , array ('bar ' => 'bar (b) ' ), 'b ' );
211+
212+ $ this ->assertEquals ('bar ' , $ translator ->trans ('bar ' ));
213+ }
214+
186215 protected function getCatalogue ($ locale , $ messages )
187216 {
188217 $ catalogue = new MessageCatalogue ($ locale );
@@ -265,12 +294,7 @@ protected function getContainer($loader)
265294
266295 public function getTranslator ($ loader , $ options = array (), $ translatorClass = '\Symfony\Bundle\FrameworkBundle\Translation\Translator ' )
267296 {
268- $ translator = new $ translatorClass (
269- $ this ->getContainer ($ loader ),
270- new MessageSelector (),
271- array ('loader ' => array ('loader ' )),
272- $ options
273- );
297+ $ translator = $ this ->createTranslator ($ loader , $ options , $ translatorClass );
274298
275299 $ translator ->addResource ('loader ' , 'foo ' , 'fr ' );
276300 $ translator ->addResource ('loader ' , 'foo ' , 'en ' );
@@ -282,6 +306,18 @@ public function getTranslator($loader, $options = array(), $translatorClass = '\
282306
283307 return $ translator ;
284308 }
309+
310+ private function createTranslator ($ loader , $ options , $ translatorClass = '\Symfony\Bundle\FrameworkBundle\Translation\Translator ' )
311+ {
312+ $ translator = new $ translatorClass (
313+ $ this ->getContainer ($ loader ),
314+ new MessageSelector (),
315+ array ('loader ' => array ('loader ' )),
316+ $ options
317+ );
318+
319+ return $ translator ;
320+ }
285321}
286322
287323class TranslatorWithInvalidLocale extends Translator
0 commit comments