No Description

TranslatorCacheTest.php 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\Translation\Tests;
  11. use Symfony\Component\Translation\Translator;
  12. use Symfony\Component\Translation\MessageCatalogue;
  13. use Symfony\Component\Translation\MessageSelector;
  14. class TranslatorCacheTest extends \PHPUnit_Framework_TestCase
  15. {
  16. protected $tmpDir;
  17. protected function setUp()
  18. {
  19. $this->tmpDir = sys_get_temp_dir().'/sf2_translation';
  20. $this->deleteTmpDir();
  21. }
  22. public function tearDown()
  23. {
  24. $this->deleteTmpDir();
  25. }
  26. protected function deleteTmpDir()
  27. {
  28. if (!file_exists($dir = $this->tmpDir)) {
  29. return;
  30. }
  31. $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->tmpDir), \RecursiveIteratorIterator::CHILD_FIRST);
  32. foreach ($iterator as $path) {
  33. if (preg_match('#[/\\\\]\.\.?$#', $path->__toString())) {
  34. continue;
  35. }
  36. if ($path->isDir()) {
  37. rmdir($path->__toString());
  38. } else {
  39. unlink($path->__toString());
  40. }
  41. }
  42. rmdir($this->tmpDir);
  43. }
  44. public function testTransWithoutCaching()
  45. {
  46. $translator = $this->getTranslator($this->getLoader());
  47. $translator->setLocale('fr');
  48. $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8', 'sr@latin'));
  49. $this->assertEquals('foo (FR)', $translator->trans('foo'));
  50. $this->assertEquals('bar (EN)', $translator->trans('bar'));
  51. $this->assertEquals('foobar (ES)', $translator->trans('foobar'));
  52. $this->assertEquals('choice 0 (EN)', $translator->transChoice('choice', 0));
  53. $this->assertEquals('no translation', $translator->trans('no translation'));
  54. $this->assertEquals('foobarfoo (PT-PT)', $translator->trans('foobarfoo'));
  55. $this->assertEquals('other choice 1 (PT-BR)', $translator->transChoice('other choice', 1));
  56. $this->assertEquals('foobarbaz (fr.UTF-8)', $translator->trans('foobarbaz'));
  57. $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax'));
  58. }
  59. public function testTransWithCaching()
  60. {
  61. // prime the cache
  62. $translator = $this->getTranslator($this->getLoader(), $this->tmpDir);
  63. $translator->setLocale('fr');
  64. $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8', 'sr@latin'));
  65. $this->assertEquals('foo (FR)', $translator->trans('foo'));
  66. $this->assertEquals('bar (EN)', $translator->trans('bar'));
  67. $this->assertEquals('foobar (ES)', $translator->trans('foobar'));
  68. $this->assertEquals('choice 0 (EN)', $translator->transChoice('choice', 0));
  69. $this->assertEquals('no translation', $translator->trans('no translation'));
  70. $this->assertEquals('foobarfoo (PT-PT)', $translator->trans('foobarfoo'));
  71. $this->assertEquals('other choice 1 (PT-BR)', $translator->transChoice('other choice', 1));
  72. $this->assertEquals('foobarbaz (fr.UTF-8)', $translator->trans('foobarbaz'));
  73. $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax'));
  74. // do it another time as the cache is primed now
  75. $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
  76. $translator = $this->getTranslator($loader, $this->tmpDir);
  77. $translator->setLocale('fr');
  78. $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8', 'sr@latin'));
  79. $this->assertEquals('foo (FR)', $translator->trans('foo'));
  80. $this->assertEquals('bar (EN)', $translator->trans('bar'));
  81. $this->assertEquals('foobar (ES)', $translator->trans('foobar'));
  82. $this->assertEquals('choice 0 (EN)', $translator->transChoice('choice', 0));
  83. $this->assertEquals('no translation', $translator->trans('no translation'));
  84. $this->assertEquals('foobarfoo (PT-PT)', $translator->trans('foobarfoo'));
  85. $this->assertEquals('other choice 1 (PT-BR)', $translator->transChoice('other choice', 1));
  86. $this->assertEquals('foobarbaz (fr.UTF-8)', $translator->trans('foobarbaz'));
  87. $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax'));
  88. }
  89. public function testTransWithCachingWithInvalidLocale()
  90. {
  91. $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
  92. $translator = $this->getTranslator($loader, $this->tmpDir, 'Symfony\Component\Translation\Tests\TranslatorWithInvalidLocale');
  93. $translator->setLocale('invalid locale');
  94. try {
  95. $translator->trans('foo');
  96. $this->fail();
  97. } catch (\InvalidArgumentException $e) {
  98. $this->assertFalse(file_exists($this->tmpDir.'/catalogue.invalid locale.php'));
  99. }
  100. }
  101. public function testLoadCatalogueWithCachingWithInvalidLocale()
  102. {
  103. $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
  104. $translator = $this->getTranslator($loader, $this->tmpDir, 'Symfony\Component\Translation\Tests\TranslatorWithInvalidLocale');
  105. try {
  106. $translator->proxyLoadCatalogue('invalid locale');
  107. $this->fail();
  108. } catch (\InvalidArgumentException $e) {
  109. $this->assertFalse(file_exists($this->tmpDir.'/catalogue.invalid locale.php'));
  110. }
  111. }
  112. protected function getCatalogue($locale, $messages)
  113. {
  114. $catalogue = new MessageCatalogue($locale);
  115. foreach ($messages as $key => $translation) {
  116. $catalogue->set($key, $translation);
  117. }
  118. return $catalogue;
  119. }
  120. protected function getLoader()
  121. {
  122. $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
  123. $loader
  124. ->expects($this->at(0))
  125. ->method('load')
  126. ->will($this->returnValue($this->getCatalogue('fr', array(
  127. 'foo' => 'foo (FR)',
  128. ))))
  129. ;
  130. $loader
  131. ->expects($this->at(1))
  132. ->method('load')
  133. ->will($this->returnValue($this->getCatalogue('en', array(
  134. 'foo' => 'foo (EN)',
  135. 'bar' => 'bar (EN)',
  136. 'choice' => '{0} choice 0 (EN)|{1} choice 1 (EN)|]1,Inf] choice inf (EN)',
  137. ))))
  138. ;
  139. $loader
  140. ->expects($this->at(2))
  141. ->method('load')
  142. ->will($this->returnValue($this->getCatalogue('es', array(
  143. 'foobar' => 'foobar (ES)',
  144. ))))
  145. ;
  146. $loader
  147. ->expects($this->at(3))
  148. ->method('load')
  149. ->will($this->returnValue($this->getCatalogue('pt-PT', array(
  150. 'foobarfoo' => 'foobarfoo (PT-PT)',
  151. ))))
  152. ;
  153. $loader
  154. ->expects($this->at(4))
  155. ->method('load')
  156. ->will($this->returnValue($this->getCatalogue('pt_BR', array(
  157. 'other choice' => '{0} other choice 0 (PT-BR)|{1} other choice 1 (PT-BR)|]1,Inf] other choice inf (PT-BR)',
  158. ))))
  159. ;
  160. $loader
  161. ->expects($this->at(5))
  162. ->method('load')
  163. ->will($this->returnValue($this->getCatalogue('fr.UTF-8', array(
  164. 'foobarbaz' => 'foobarbaz (fr.UTF-8)',
  165. ))))
  166. ;
  167. $loader
  168. ->expects($this->at(6))
  169. ->method('load')
  170. ->will($this->returnValue($this->getCatalogue('sr@latin', array(
  171. 'foobarbax' => 'foobarbax (sr@latin)',
  172. ))))
  173. ;
  174. return $loader;
  175. }
  176. public function getTranslator($loader, $cacheDir = null, $translatorClass = '\Symfony\Component\Translation\Translator')
  177. {
  178. $translator = new $translatorClass('fr', new MessageSelector(), $cacheDir);
  179. $translator->addLoader('loader', $loader);
  180. $translator->addResource('loader', 'foo', 'fr');
  181. $translator->addResource('loader', 'foo', 'en');
  182. $translator->addResource('loader', 'foo', 'es');
  183. $translator->addResource('loader', 'foo', 'pt-PT'); // European Portuguese
  184. $translator->addResource('loader', 'foo', 'pt_BR'); // Brazilian Portuguese
  185. $translator->addResource('loader', 'foo', 'fr.UTF-8');
  186. $translator->addResource('loader', 'foo', 'sr@latin'); // Latin Serbian
  187. return $translator;
  188. }
  189. }
  190. class TranslatorWithInvalidLocale extends Translator
  191. {
  192. /**
  193. * {@inheritdoc}
  194. */
  195. public function setLocale($locale)
  196. {
  197. $this->locale = $locale;
  198. }
  199. public function proxyLoadCatalogue($locale)
  200. {
  201. $this->loadCatalogue($locale);
  202. }
  203. }