PageRenderTime 29ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php

https://gitlab.com/Marwamimo/Crowdrise_Web
PHP | 288 lines | 235 code | 37 blank | 16 comment | 4 complexity | e7b931316c8666edb8d9405213d8b0d0 MD5 | raw file
  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\Bundle\FrameworkBundle\Tests\Translation;
  11. use Symfony\Bundle\FrameworkBundle\Translation\Translator;
  12. use Symfony\Component\HttpFoundation\RequestStack;
  13. use Symfony\Component\Translation\MessageCatalogue;
  14. use Symfony\Component\Filesystem\Filesystem;
  15. use Symfony\Component\Translation\MessageSelector;
  16. class TranslatorTest extends \PHPUnit_Framework_TestCase
  17. {
  18. protected $tmpDir;
  19. protected function setUp()
  20. {
  21. $this->tmpDir = sys_get_temp_dir().'/sf2_translation';
  22. $this->deleteTmpDir();
  23. }
  24. public function tearDown()
  25. {
  26. $this->deleteTmpDir();
  27. }
  28. protected function deleteTmpDir()
  29. {
  30. if (!file_exists($dir = $this->tmpDir)) {
  31. return;
  32. }
  33. $fs = new Filesystem();
  34. $fs->remove($dir);
  35. }
  36. public function testTransWithoutCaching()
  37. {
  38. $translator = $this->getTranslator($this->getLoader());
  39. $translator->setLocale('fr');
  40. $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8', 'sr@latin'));
  41. $this->assertEquals('foo (FR)', $translator->trans('foo'));
  42. $this->assertEquals('bar (EN)', $translator->trans('bar'));
  43. $this->assertEquals('foobar (ES)', $translator->trans('foobar'));
  44. $this->assertEquals('choice 0 (EN)', $translator->transChoice('choice', 0));
  45. $this->assertEquals('no translation', $translator->trans('no translation'));
  46. $this->assertEquals('foobarfoo (PT-PT)', $translator->trans('foobarfoo'));
  47. $this->assertEquals('other choice 1 (PT-BR)', $translator->transChoice('other choice', 1));
  48. $this->assertEquals('foobarbaz (fr.UTF-8)', $translator->trans('foobarbaz'));
  49. $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax'));
  50. }
  51. public function testTransWithCaching()
  52. {
  53. // prime the cache
  54. $translator = $this->getTranslator($this->getLoader(), array('cache_dir' => $this->tmpDir));
  55. $translator->setLocale('fr');
  56. $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8', 'sr@latin'));
  57. $this->assertEquals('foo (FR)', $translator->trans('foo'));
  58. $this->assertEquals('bar (EN)', $translator->trans('bar'));
  59. $this->assertEquals('foobar (ES)', $translator->trans('foobar'));
  60. $this->assertEquals('choice 0 (EN)', $translator->transChoice('choice', 0));
  61. $this->assertEquals('no translation', $translator->trans('no translation'));
  62. $this->assertEquals('foobarfoo (PT-PT)', $translator->trans('foobarfoo'));
  63. $this->assertEquals('other choice 1 (PT-BR)', $translator->transChoice('other choice', 1));
  64. $this->assertEquals('foobarbaz (fr.UTF-8)', $translator->trans('foobarbaz'));
  65. $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax'));
  66. // do it another time as the cache is primed now
  67. $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
  68. $translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir));
  69. $translator->setLocale('fr');
  70. $translator->setFallbackLocales(array('en', 'es', 'pt-PT', 'pt_BR', 'fr.UTF-8', 'sr@latin'));
  71. $this->assertEquals('foo (FR)', $translator->trans('foo'));
  72. $this->assertEquals('bar (EN)', $translator->trans('bar'));
  73. $this->assertEquals('foobar (ES)', $translator->trans('foobar'));
  74. $this->assertEquals('choice 0 (EN)', $translator->transChoice('choice', 0));
  75. $this->assertEquals('no translation', $translator->trans('no translation'));
  76. $this->assertEquals('foobarfoo (PT-PT)', $translator->trans('foobarfoo'));
  77. $this->assertEquals('other choice 1 (PT-BR)', $translator->transChoice('other choice', 1));
  78. $this->assertEquals('foobarbaz (fr.UTF-8)', $translator->trans('foobarbaz'));
  79. $this->assertEquals('foobarbax (sr@latin)', $translator->trans('foobarbax'));
  80. }
  81. public function testTransWithCachingWithInvalidLocale()
  82. {
  83. $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
  84. $translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir), '\Symfony\Bundle\FrameworkBundle\Tests\Translation\TranslatorWithInvalidLocale');
  85. $translator->setLocale('invalid locale');
  86. $this->setExpectedException('\InvalidArgumentException');
  87. $translator->trans('foo');
  88. }
  89. /**
  90. * @dataProvider getGetLocaleData
  91. */
  92. public function testGetLocale($inRequestScope)
  93. {
  94. $requestStack = new RequestStack();
  95. if ($inRequestScope) {
  96. $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
  97. $request
  98. ->expects($this->any())
  99. ->method('getLocale')
  100. ->will($this->returnValue('en'))
  101. ;
  102. $requestStack->push($request);
  103. }
  104. $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
  105. $container
  106. ->expects($this->once())
  107. ->method('get')
  108. ->with('request_stack')
  109. ->will($this->returnValue($requestStack))
  110. ;
  111. $translator = new Translator($container, new MessageSelector());
  112. if ($inRequestScope) {
  113. $this->assertSame('en', $translator->getLocale());
  114. } else {
  115. $this->assertNull($translator->getLocale());
  116. }
  117. }
  118. public function getGetLocaleData()
  119. {
  120. return array(
  121. array(false),
  122. array(true),
  123. );
  124. }
  125. public function testGetLocaleWithInvalidLocale()
  126. {
  127. $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
  128. $request
  129. ->expects($this->any())
  130. ->method('getLocale')
  131. ->will($this->returnValue('foo bar'))
  132. ;
  133. $request
  134. ->expects($this->once())
  135. ->method('getDefaultLocale')
  136. ->will($this->returnValue('en-US'))
  137. ;
  138. $requestStack = new RequestStack();
  139. $requestStack->push($request);
  140. $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
  141. $container
  142. ->expects($this->once())
  143. ->method('get')
  144. ->with('request_stack')
  145. ->will($this->returnValue($requestStack))
  146. ;
  147. $translator = new Translator($container, new MessageSelector());
  148. $this->assertSame('en-US', $translator->getLocale());
  149. }
  150. protected function getCatalogue($locale, $messages)
  151. {
  152. $catalogue = new MessageCatalogue($locale);
  153. foreach ($messages as $key => $translation) {
  154. $catalogue->set($key, $translation);
  155. }
  156. return $catalogue;
  157. }
  158. protected function getLoader()
  159. {
  160. $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
  161. $loader
  162. ->expects($this->at(0))
  163. ->method('load')
  164. ->will($this->returnValue($this->getCatalogue('fr', array(
  165. 'foo' => 'foo (FR)',
  166. ))))
  167. ;
  168. $loader
  169. ->expects($this->at(1))
  170. ->method('load')
  171. ->will($this->returnValue($this->getCatalogue('en', array(
  172. 'foo' => 'foo (EN)',
  173. 'bar' => 'bar (EN)',
  174. 'choice' => '{0} choice 0 (EN)|{1} choice 1 (EN)|]1,Inf] choice inf (EN)',
  175. ))))
  176. ;
  177. $loader
  178. ->expects($this->at(2))
  179. ->method('load')
  180. ->will($this->returnValue($this->getCatalogue('es', array(
  181. 'foobar' => 'foobar (ES)',
  182. ))))
  183. ;
  184. $loader
  185. ->expects($this->at(3))
  186. ->method('load')
  187. ->will($this->returnValue($this->getCatalogue('pt-PT', array(
  188. 'foobarfoo' => 'foobarfoo (PT-PT)',
  189. ))))
  190. ;
  191. $loader
  192. ->expects($this->at(4))
  193. ->method('load')
  194. ->will($this->returnValue($this->getCatalogue('pt_BR', array(
  195. 'other choice' => '{0} other choice 0 (PT-BR)|{1} other choice 1 (PT-BR)|]1,Inf] other choice inf (PT-BR)',
  196. ))))
  197. ;
  198. $loader
  199. ->expects($this->at(5))
  200. ->method('load')
  201. ->will($this->returnValue($this->getCatalogue('fr.UTF-8', array(
  202. 'foobarbaz' => 'foobarbaz (fr.UTF-8)',
  203. ))))
  204. ;
  205. $loader
  206. ->expects($this->at(6))
  207. ->method('load')
  208. ->will($this->returnValue($this->getCatalogue('sr@latin', array(
  209. 'foobarbax' => 'foobarbax (sr@latin)',
  210. ))))
  211. ;
  212. return $loader;
  213. }
  214. protected function getContainer($loader)
  215. {
  216. $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
  217. $container
  218. ->expects($this->any())
  219. ->method('get')
  220. ->will($this->returnValue($loader))
  221. ;
  222. return $container;
  223. }
  224. public function getTranslator($loader, $options = array(), $translatorClass = '\Symfony\Bundle\FrameworkBundle\Translation\Translator')
  225. {
  226. $translator = new $translatorClass(
  227. $this->getContainer($loader),
  228. new MessageSelector(),
  229. array('loader' => array('loader')),
  230. $options
  231. );
  232. $translator->addResource('loader', 'foo', 'fr');
  233. $translator->addResource('loader', 'foo', 'en');
  234. $translator->addResource('loader', 'foo', 'es');
  235. $translator->addResource('loader', 'foo', 'pt-PT'); // European Portuguese
  236. $translator->addResource('loader', 'foo', 'pt_BR'); // Brazilian Portuguese
  237. $translator->addResource('loader', 'foo', 'fr.UTF-8');
  238. $translator->addResource('loader', 'foo', 'sr@latin'); // Latin Serbian
  239. return $translator;
  240. }
  241. }
  242. class TranslatorWithInvalidLocale extends Translator
  243. {
  244. /**
  245. * {@inheritdoc}
  246. */
  247. public function setLocale($locale)
  248. {
  249. $this->locale = $locale;
  250. }
  251. }