diff --git a/src/Symfony/Component/Translation/Tests/TranslatorTest.php b/src/Symfony/Component/Translation/Tests/TranslatorTest.php index 82aedfeeac..cefcf216db 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorTest.php @@ -67,6 +67,36 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase $this->assertEquals('foobar', $translator->trans('bar')); } + /** + * @dataProvider getTransFileTests + * @expectedException Symfony\Component\Translation\Exception\NotFoundResourceException + */ + public function testTransWithoutFallbackLocaleFile($format, $loader) + { + $loaderClass = 'Symfony\\Component\\Translation\\Loader\\'.$loader; + $translator = new Translator('en', new MessageSelector()); + $translator->addLoader($format, new $loaderClass()); + $translator->addResource($format, __DIR__.'/fixtures/non-existing', 'en'); + $translator->addResource($format, __DIR__.'/fixtures/resources.'.$format, 'en'); + + // force catalogue loading + $translator->trans('foo'); + } + + /** + * @dataProvider getTransFileTests + */ + public function testTransWithFallbackLocaleFile($format, $loader) + { + $loaderClass = 'Symfony\\Component\\Translation\\Loader\\'.$loader; + $translator = new Translator('en_GB', new MessageSelector()); + $translator->addLoader($format, new $loaderClass()); + $translator->addResource($format, __DIR__.'/fixtures/non-existing', 'en_GB'); + $translator->addResource($format, __DIR__.'/fixtures/resources.'.$format, 'en', 'resources'); + + $this->assertEquals('bar', $translator->trans('foo', array(), 'resources')); + } + public function testTransWithFallbackLocaleBis() { $translator = new Translator('en_US', new MessageSelector()); @@ -144,6 +174,20 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expected, $translator->transChoice($id, $number, $parameters, $domain, $locale)); } + public function getTransFileTests() + { + return array( + array('csv', 'CsvFileLoader'), + array('ini', 'IniFileLoader'), + array('mo', 'MoFileLoader'), + array('po', 'PoFileLoader'), + array('php', 'PhpFileLoader'), + array('ts', 'QtTranslationsLoader'), + array('xlf', 'XliffFileLoader'), + array('yml', 'YamlFileLoader'), + ); + } + public function getTransTests() { return array( diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index ec043a18f6..439a62d34b 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Translation; use Symfony\Component\Translation\Loader\LoaderInterface; +use Symfony\Component\Translation\Exception\NotFoundResourceException; /** * Translator. @@ -181,7 +182,13 @@ class Translator implements TranslatorInterface protected function loadCatalogue($locale) { - $this->doLoadCatalogue($locale); + try { + $this->doLoadCatalogue($locale); + } catch (NotFoundResourceException $e) { + if (!$this->computeFallbackLocales($locale)) { + throw $e; + } + } $this->loadFallbackCatalogues($locale); }