PageRenderTime 49ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/Zend/TranslateTest.php

https://bitbucket.org/ksekar/campus
PHP | 927 lines | 660 code | 129 blank | 138 comment | 4 complexity | 78a043aca1b34a2de41ccd8850604570 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.0, MIT
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Translate
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id $
  21. */
  22. /**
  23. * Zend_Translate
  24. */
  25. require_once 'Zend/Translate.php';
  26. /**
  27. * Zend_Translate_Plural
  28. */
  29. require_once 'Zend/Translate/Plural.php';
  30. /**
  31. * @category Zend
  32. * @package Zend_Translate
  33. * @subpackage UnitTests
  34. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  35. * @license http://framework.zend.com/license/new-bsd New BSD License
  36. * @group Zend_Translate
  37. */
  38. class Zend_TranslateTest extends PHPUnit_Framework_TestCase
  39. {
  40. /**
  41. * Runs the test methods of this class.
  42. *
  43. * @return void
  44. */
  45. public static function main()
  46. {
  47. $suite = new PHPUnit_Framework_TestSuite("Zend_TranslateTest");
  48. $result = PHPUnit_TextUI_TestRunner::run($suite);
  49. }
  50. public function setUp()
  51. {
  52. if (Zend_Translate::hasCache()) {
  53. Zend_Translate::removeCache();
  54. }
  55. require_once 'Zend/Translate/Adapter/Array.php';
  56. if (Zend_Translate_Adapter_Array::hasCache()) {
  57. Zend_Translate_Adapter_Array::removeCache();
  58. }
  59. }
  60. public function testCreate()
  61. {
  62. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('1' => '1'));
  63. $this->assertTrue($lang instanceof Zend_Translate);
  64. }
  65. public function testLocaleInitialization()
  66. {
  67. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'message1'), 'en');
  68. $this->assertEquals('en', $lang->getLocale());
  69. }
  70. public function testDefaultLocale()
  71. {
  72. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'message1'));
  73. $defaultLocale = new Zend_Locale();
  74. $this->assertEquals($defaultLocale->toString(), $lang->getLocale());
  75. }
  76. public function testGetAdapter()
  77. {
  78. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY , array('1' => '1'), 'en');
  79. $this->assertTrue($lang->getAdapter() instanceof Zend_Translate_Adapter_Array);
  80. $lang = new Zend_Translate(Zend_Translate::AN_GETTEXT , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.mo', 'en');
  81. $this->assertTrue($lang->getAdapter() instanceof Zend_Translate_Adapter_Gettext);
  82. $lang = new Zend_Translate(Zend_Translate::AN_TMX , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.tmx', 'en');
  83. $this->assertTrue($lang->getAdapter() instanceof Zend_Translate_Adapter_Tmx);
  84. $lang = new Zend_Translate(Zend_Translate::AN_CSV , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.csv', 'en');
  85. $this->assertTrue($lang->getAdapter() instanceof Zend_Translate_Adapter_Csv);
  86. $lang = new Zend_Translate(Zend_Translate::AN_XLIFF , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.xliff', 'en');
  87. $this->assertTrue($lang->getAdapter() instanceof Zend_Translate_Adapter_Xliff);
  88. $lang = new Zend_Translate('Qt' , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en2.ts', 'en');
  89. $this->assertTrue($lang->getAdapter() instanceof Zend_Translate_Adapter_Qt);
  90. $lang = new Zend_Translate('XmlTm' , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.xmltm', 'en');
  91. $this->assertTrue($lang->getAdapter() instanceof Zend_Translate_Adapter_XmlTm);
  92. $lang = new Zend_Translate('Tbx' , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.tbx', 'en');
  93. $this->assertTrue($lang->getAdapter() instanceof Zend_Translate_Adapter_Tbx);
  94. }
  95. public function testSetAdapter()
  96. {
  97. $lang = new Zend_Translate(Zend_Translate::AN_GETTEXT , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.mo', 'en');
  98. $lang->setAdapter(Zend_Translate::AN_ARRAY, array('de' => 'de'));
  99. $this->assertTrue($lang->getAdapter() instanceof Zend_Translate_Adapter_Array);
  100. try {
  101. $lang->xxxFunction();
  102. $this->fail("exception expected");
  103. } catch (Zend_Translate_Exception $e) {
  104. // success
  105. }
  106. }
  107. public function testAddTranslation()
  108. {
  109. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  110. $this->assertEquals('msg2', $lang->_('msg2'));
  111. $lang->addTranslation(array('msg2' => 'Message 2'), 'en');
  112. $this->assertEquals('Message 2', $lang->_('msg2'));
  113. $this->assertEquals('msg3', $lang->_('msg3'));
  114. $lang->addTranslation(array('msg3' => 'Message 3'), 'en', array('clear' => true));
  115. $this->assertEquals('msg2', $lang->_('msg2'));
  116. $this->assertEquals('Message 3', $lang->_('msg3'));
  117. }
  118. public function testGetLocale()
  119. {
  120. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  121. $this->assertEquals('en', $lang->getLocale());
  122. }
  123. public function testSetLocale()
  124. {
  125. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  126. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'ru');
  127. $this->assertEquals('ru', $lang->getLocale());
  128. $lang->setLocale('en');
  129. $this->assertEquals('en', $lang->getLocale());
  130. $lang->setLocale('ru');
  131. $this->assertEquals('ru', $lang->getLocale());
  132. $lang->setLocale('ru_RU');
  133. $this->assertEquals('ru', $lang->getLocale());
  134. }
  135. public function testSetLanguage()
  136. {
  137. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  138. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'ru');
  139. $this->assertEquals('ru', $lang->getLocale());
  140. $lang->setLocale('en');
  141. $this->assertEquals('en', $lang->getLocale());
  142. }
  143. public function testGetLanguageList()
  144. {
  145. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  146. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'ru');
  147. $this->assertEquals(2, count($lang->getList()));
  148. $this->assertTrue(in_array('en', $lang->getList()));
  149. $this->assertTrue(in_array('ru', $lang->getList()));
  150. }
  151. public function testIsAvailable()
  152. {
  153. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  154. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'ru');
  155. $this->assertTrue( $lang->isAvailable('en'));
  156. $this->assertTrue( $lang->isAvailable('ru'));
  157. $this->assertFalse($lang->isAvailable('fr'));
  158. }
  159. public function testTranslate()
  160. {
  161. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1 (en)'), 'en');
  162. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'ru');
  163. $this->assertEquals('Message 1 (en)', $lang->_('msg1', 'en' ));
  164. $this->assertEquals('Message 1 (ru)', $lang->_('msg1' ));
  165. $this->assertEquals('msg2', $lang->_('msg2', 'en' ));
  166. $this->assertEquals('msg2', $lang->_('msg2' ));
  167. $this->assertEquals('Message 1 (en)', $lang->translate('msg1', 'en'));
  168. $this->assertEquals('Message 1 (ru)', $lang->translate('msg1' ));
  169. $this->assertEquals('msg2', $lang->translate('msg2', 'en'));
  170. $this->assertEquals('msg2', $lang->translate('msg2' ));
  171. }
  172. public function testIsTranslated()
  173. {
  174. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1 (en)'), 'en_US');
  175. $this->assertTrue( $lang->isTranslated('msg1' ));
  176. $this->assertFalse($lang->isTranslated('msg2' ));
  177. $this->assertFalse($lang->isTranslated('msg1', false, 'en'));
  178. $this->assertFalse($lang->isTranslated('msg1', true, 'en'));
  179. $this->assertFalse($lang->isTranslated('msg1', false, 'ru'));
  180. }
  181. public function testWithOption()
  182. {
  183. $lang = new Zend_Translate(Zend_Translate::AN_CSV , dirname(__FILE__) . '/Translate/Adapter/_files/translation_otherdelimiter.csv', 'en', array('delimiter' => ','));
  184. $this->assertEquals('Message 1 (en)', $lang->translate('Message 1'));
  185. $this->assertEquals('Message 4 (en)', $lang->translate('Message 4,'));
  186. $this->assertEquals('Message 5, (en)', $lang->translate('Message 5'));
  187. }
  188. public function testDirectorySearch()
  189. {
  190. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files/testcsv', 'de_AT', array('scan' => Zend_Translate::LOCALE_DIRECTORY));
  191. $this->assertEquals(array('de_AT' => 'de_AT', 'en_GB' => 'en_GB'), $lang->getList());
  192. $this->assertEquals('Nachricht 8', $lang->translate('Message 8'));
  193. }
  194. public function testFileSearch()
  195. {
  196. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files/testcsv', 'de_DE', array('scan' => Zend_Translate::LOCALE_FILENAME));
  197. $this->assertEquals(array('de_DE' => 'de_DE', 'en_US' => 'en_US'), $lang->getList());
  198. $this->assertEquals('Nachricht 8', $lang->translate('Message 8'));
  199. }
  200. public function testTestingCacheHandling()
  201. {
  202. require_once 'Zend/Cache.php';
  203. $cache = Zend_Cache::factory('Core', 'File',
  204. array('lifetime' => 120, 'automatic_serialization' => true),
  205. array('cache_dir' => dirname(__FILE__) . '/_files/'));
  206. Zend_Translate::setCache($cache);
  207. $cache = Zend_Translate::getCache();
  208. $this->assertTrue($cache instanceof Zend_Cache_Core);
  209. $this->assertTrue(Zend_Translate::hasCache());
  210. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1 (en)'), 'en');
  211. $adapter = $lang->getAdapter();
  212. $this->assertTrue($adapter instanceof Zend_Translate_Adapter_Array);
  213. $adaptercache = $adapter->getCache();
  214. $this->assertTrue($adaptercache instanceof Zend_Cache_Core);
  215. Zend_Translate::clearCache();
  216. $this->assertTrue(Zend_Translate::hasCache());
  217. Zend_Translate::removeCache();
  218. $this->assertFalse(Zend_Translate::hasCache());
  219. }
  220. public function testExceptionWhenNoAdapterClassWasSet()
  221. {
  222. try {
  223. $lang = new Zend_Translate('Zend_Locale', dirname(__FILE__) . '/Translate/_files/test2', null, array('scan' => Zend_Translate::LOCALE_FILENAME));
  224. $this->fail('Exception due to false adapter class expected');
  225. } catch (Zend_Translate_Exception $e) {
  226. $this->assertContains('does not extend Zend_Translate_Adapter', $e->getMessage());
  227. }
  228. }
  229. public function testZF3679()
  230. {
  231. require_once 'Zend/Locale.php';
  232. $locale = new Zend_Locale('de_AT');
  233. require_once 'Zend/Registry.php';
  234. Zend_Registry::set('Zend_Locale', $locale);
  235. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'message1'), 'de_AT');
  236. $this->assertEquals('de_AT', $lang->getLocale());
  237. Zend_Registry::_unsetInstance();
  238. }
  239. /**
  240. * ZF-4994
  241. */
  242. public function testCamelCasedOptions()
  243. {
  244. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files/translation_otherdelimiter.csv', 'en', array('delimiter' => ','));
  245. $lang->setOptions(array('myOption' => true));
  246. $this->assertTrue($lang->getOptions('myOption'));
  247. }
  248. /**
  249. * ZF-4905
  250. */
  251. public function testPathNameWithColonResolution()
  252. {
  253. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/../Adapter/_files', 'en', array('delimiter' => ','));
  254. $this->assertEquals('en', $lang->getLocale());
  255. }
  256. public function testUntranslatedMessageWithTriggeredError()
  257. {
  258. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files', 'en', array('delimiter' => ','));
  259. $this->assertEquals('ignored', $lang->translate('ignored'));
  260. $this->_errorOccured = false;
  261. $lang->setOptions(array('logUntranslated' => true));
  262. set_error_handler(array($this, 'errorHandlerIgnore'));
  263. $this->assertEquals('ignored', $lang->translate('ignored'));
  264. $this->assertTrue($this->_errorOccured);
  265. restore_error_handler();
  266. }
  267. public function testLogUntranslatedMessage()
  268. {
  269. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files', 'en', array('delimiter' => ','));
  270. $this->assertEquals('ignored', $lang->translate('ignored'));
  271. $stream = fopen('php://memory', 'w+');
  272. require_once 'Zend/Log/Writer/Stream.php';
  273. $writer = new Zend_Log_Writer_Stream($stream);
  274. require_once 'Zend/Log.php';
  275. $log = new Zend_Log($writer);
  276. $lang->setOptions(array('logUntranslated' => true, 'log' => $log));
  277. $this->assertEquals('ignored', $lang->translate('ignored'));
  278. rewind($stream);
  279. $this->assertContains('ignored', stream_get_contents($stream));
  280. }
  281. public function testSettingUnknownLocaleWithTriggeredError()
  282. {
  283. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files', 'en', array('delimiter' => ','));
  284. $this->_errorOccured = false;
  285. set_error_handler(array($this, 'errorHandlerIgnore'));
  286. $lang->setLocale('ru');
  287. $this->assertEquals('ru', $lang->getLocale('ru'));
  288. $this->assertTrue($this->_errorOccured);
  289. restore_error_handler();
  290. }
  291. public function testSettingUnknownLocaleWritingToLog()
  292. {
  293. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files', 'en', array('delimiter' => ','));
  294. $stream = fopen('php://memory', 'w+');
  295. require_once 'Zend/Log/Writer/Stream.php';
  296. $writer = new Zend_Log_Writer_Stream($stream);
  297. require_once 'Zend/Log.php';
  298. $log = new Zend_Log($writer);
  299. $lang->setOptions(array('log' => $log));
  300. $lang->setLocale('ru');
  301. rewind($stream);
  302. $this->assertContains('has to be added', stream_get_contents($stream));
  303. }
  304. public function testSettingNoLogAsLog()
  305. {
  306. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files', 'en', array('delimiter' => ','));
  307. try {
  308. $lang->setOptions(array('log' => 'nolog'));
  309. $this->fail();
  310. } catch (Zend_Translate_Exception $e) {
  311. $this->assertContains('Instance of Zend_Log expected', $e->getMessage());
  312. }
  313. }
  314. public function testSettingUnknownLocaleWritingToSelfDefinedLog()
  315. {
  316. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files', 'en', array('delimiter' => ','));
  317. $this->assertEquals('ignored', $lang->translate('ignored'));
  318. $stream = fopen('php://memory', 'w+');
  319. require_once 'Zend/Log/Writer/Stream.php';
  320. $writer = new Zend_Log_Writer_Stream($stream);
  321. require_once 'Zend/Log.php';
  322. $log = new Zend_Log($writer);
  323. $lang->setOptions(array('logUntranslated' => true, 'log' => $log, 'logMessage' => 'Self defined log message'));
  324. $this->assertEquals('ignored', $lang->translate('ignored'));
  325. rewind($stream);
  326. $this->assertContains('Self defined log message', stream_get_contents($stream));
  327. }
  328. /**
  329. * Tests if cached options are read from the cache for a new instance
  330. */
  331. public function testGetOptionsFromCache()
  332. {
  333. require_once 'Zend/Cache.php';
  334. $cache = Zend_Cache::factory('Core', 'File',
  335. array('lifetime' => 120, 'automatic_serialization' => true),
  336. array('cache_dir' => dirname(__FILE__) . '/_files/'));
  337. Zend_Translate::setCache($cache);
  338. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files', 'en', array('delimiter' => ','));
  339. $lang->setOptions(array('logMessage' => 'test'));
  340. $this->assertEquals('test', $lang->getOptions('logMessage'));
  341. unset($lang);
  342. $lang2 = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files', 'en', array('delimiter' => ','));
  343. $this->assertEquals('test', $lang2->getOptions('logMessage'));
  344. }
  345. /**
  346. * Tests if setting locale as options sets locale
  347. */
  348. public function testSetLocaleAsOption()
  349. {
  350. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  351. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'ru');
  352. $lang->setOptions(array('locale' => 'ru'));
  353. $this->assertEquals('ru', $lang->getLocale());
  354. $lang->setOptions(array('locale' => 'en'));
  355. $this->assertEquals('en', $lang->getLocale());
  356. }
  357. /**
  358. * Tests getting null returns all options
  359. */
  360. public function testGettingAllOptions()
  361. {
  362. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  363. $this->assertTrue(is_array($lang->getOptions()));
  364. }
  365. /**
  366. * Tests if setting locale as options sets locale
  367. */
  368. public function testGettingUnknownOption()
  369. {
  370. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  371. $this->assertEquals(null, $lang->getOptions('unknown'));
  372. }
  373. /**
  374. * Tests getting of all message ids works
  375. */
  376. public function testGettingAllMessageIds()
  377. {
  378. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1', 'msg2' => 'Message 2'), 'en');
  379. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'ru');
  380. $this->assertEquals(array('msg1'), $lang->getMessageIds());
  381. $this->assertEquals(array('msg1', 'msg2'), $lang->getMessageIds('en'));
  382. }
  383. /**
  384. * Tests getting of single message ids
  385. */
  386. public function testGettingSingleMessageIds()
  387. {
  388. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1', 'msg2' => 'Message 2'), 'en');
  389. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'ru');
  390. $this->assertEquals('msg1', $lang->getMessageId('Message 1 (ru)'));
  391. $this->assertEquals('msg2', $lang->getMessageId('Message 2', 'en'));
  392. $this->assertFalse($lang->getMessageId('Message 5'));
  393. }
  394. /**
  395. * Tests getting of all messages
  396. */
  397. public function testGettingAllMessages()
  398. {
  399. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1', 'msg2' => 'Message 2'), 'en');
  400. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'ru');
  401. $this->assertEquals(array('msg1' => 'Message 1 (ru)'), $lang->getMessages());
  402. $this->assertEquals(
  403. array('msg1' => 'Message 1', 'msg2' => 'Message 2'),
  404. $lang->getMessages('en'));
  405. $this->assertEquals(
  406. array(
  407. 'en' => array('msg1' => 'Message 1', 'msg2' => 'Message 2'),
  408. 'ru' => array('msg1' => 'Message 1 (ru)')),
  409. $lang->getMessages('all'));
  410. }
  411. /**
  412. * Tests getting default plurals
  413. */
  414. public function testGettingPlurals()
  415. {
  416. $lang = new Zend_Translate(
  417. Zend_Translate::AN_ARRAY,
  418. array('singular' =>
  419. array('plural_0 (en)',
  420. 'plural_1 (en)',
  421. 'plural_2 (en)',
  422. 'plural_3 (en)'),
  423. 'plural' => ''), 'en'
  424. );
  425. $this->assertEquals('plural_0 (en)', $lang->translate(array('singular', 'plural', 1)));
  426. $this->assertEquals('plural_1 (en)', $lang->translate(array('singular', 'plural', 2)));
  427. $this->assertEquals('plural_0 (en)', $lang->plural('singular', 'plural', 1));
  428. $this->assertEquals('plural_1 (en)', $lang->plural('singular', 'plural', 2));
  429. }
  430. /**
  431. * Tests getting plurals from lowered locale
  432. */
  433. public function testGettingPluralsFromLoweredLocale()
  434. {
  435. $lang = new Zend_Translate(
  436. Zend_Translate::AN_ARRAY,
  437. array('singular' =>
  438. array('plural_0 (en)',
  439. 'plural_1 (en)',
  440. 'plural_2 (en)',
  441. 'plural_3 (en)'),
  442. 'plural' => ''), 'en'
  443. );
  444. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'en_US');
  445. $lang->setLocale('en_US');
  446. $this->assertEquals('plural_0 (en)', $lang->translate(array('singular', 'plural', 1)));
  447. $this->assertEquals('plural_0 (en)', $lang->plural('singular', 'plural', 1));
  448. }
  449. /**
  450. * Tests getting plurals from lowered locale
  451. */
  452. public function testGettingPluralsFromUnknownLocale()
  453. {
  454. $lang = new Zend_Translate(
  455. Zend_Translate::AN_ARRAY,
  456. array('singular' =>
  457. array('plural_0 (en)',
  458. 'plural_1 (en)',
  459. 'plural_2 (en)',
  460. 'plural_3 (en)'),
  461. 'plural' => ''), 'en'
  462. );
  463. $this->assertEquals('singular', $lang->translate(array('singular', 'plural', 1), 'ru'));
  464. $this->assertEquals('singular', $lang->plural('singular', 'plural', 1, 'ru'));
  465. $this->assertEquals('plural', $lang->translate(array('singular', 'plural', 'plural2', 2, 'en'), 'ru'));
  466. $this->assertEquals('plural', $lang->plural('singular', 'plural', 2, 'ru'));
  467. }
  468. public function testPluralsWithGettext()
  469. {
  470. $lang = new Zend_Translate(Zend_Translate::AN_GETTEXT , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.mo', 'en');
  471. $this->assertEquals('Message 5 (en) Plural 0', $lang->translate(array('Message 5', 'Message 5 Plural', 1)));
  472. $this->assertEquals('Message 5 (en) Plural 0', $lang->plural('Message 5', 'Message 5 Plural', 1));
  473. $this->assertEquals('Message 5 (en) Plural 1', $lang->translate(array('Message 5', 'Message 5 Plural', 2)));
  474. $this->assertEquals('Message 5 (en) Plural 1', $lang->plural('Message 5', 'Message 5 Plural', 2));
  475. }
  476. public function testPluralsWithCsv()
  477. {
  478. $lang = new Zend_Translate(Zend_Translate::AN_CSV , dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.csv', 'en');
  479. $this->assertEquals('Message 6 (en) Plural 0', $lang->translate(array('Message 6', 'Message 6 Plural1', 1)));
  480. $this->assertEquals('Message 6 (en) Plural 0', $lang->plural('Message 6', 'Message 6 Plural1', 1));
  481. $this->assertEquals('Message 6 (en) Plural 1', $lang->translate(array('Message 6', 'Message 6 Plural1', 2)));
  482. $this->assertEquals('Message 6 (en) Plural 1', $lang->plural('Message 6', 'Message 6 Plural1', 2));
  483. }
  484. /**
  485. * ZF-6671
  486. */
  487. public function testAddTranslationAfterwards()
  488. {
  489. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array('msg1' => 'Message 1'), 'en');
  490. $this->assertEquals('Message 1', $lang->_('msg1'));
  491. $lang->addTranslation(array('msg1' => 'Message 1 (en)'), 'en');
  492. $this->assertEquals('Message 1 (en)', $lang->_('msg1'));
  493. }
  494. /**
  495. * ZF-7560
  496. */
  497. public function testUseNumericTranslations()
  498. {
  499. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, array(0 => 'Message 1', 2 => 'Message 2'), 'en');
  500. $this->assertEquals('Message 1', $lang->_(0));
  501. $this->assertEquals('Message 2', $lang->_(2));
  502. $lang->addTranslation(array(4 => 'Message 4'), 'en');
  503. $this->assertEquals('Message 4', $lang->_(4));
  504. }
  505. /**
  506. * ZF-7508
  507. */
  508. public function testDontLogUntranslatedMessageWithIsTranslated()
  509. {
  510. $lang = new Zend_Translate(Zend_Translate::AN_CSV, dirname(__FILE__) . '/Translate/Adapter/_files', 'en', array('delimiter' => ','));
  511. $this->assertFalse($lang->isTranslated('ignored'));
  512. $stream = fopen('php://memory', 'w+');
  513. require_once 'Zend/Log/Writer/Stream.php';
  514. $writer = new Zend_Log_Writer_Stream($stream);
  515. require_once 'Zend/Log.php';
  516. $log = new Zend_Log($writer);
  517. $lang->setOptions(array('logUntranslated' => true, 'log' => $log));
  518. $this->assertFalse($lang->isTranslated('ignored'));
  519. rewind($stream);
  520. $this->assertNotContains('ignored', stream_get_contents($stream));
  521. }
  522. /**
  523. * ZF-7130
  524. */
  525. public function testMultiFolderScan()
  526. {
  527. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, dirname(__FILE__) . '/Translate/Adapter/_files/testarray', 'en_GB', array('scan' => Zend_Translate::LOCALE_DIRECTORY));
  528. $this->assertEquals('Message 1 (ja)', $lang->_('Message 1', 'ja' ));
  529. $this->assertEquals('Message 1 (en)', $lang->_('Message 1' ));
  530. }
  531. /**
  532. * ZF-7214
  533. */
  534. public function testMultiClear()
  535. {
  536. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, dirname(__FILE__) . '/Translate/Adapter/_files/testarray', 'en_GB', array('scan' => Zend_Translate::LOCALE_DIRECTORY));
  537. $this->assertEquals('Message 1 (ja)', $lang->_('Message 1', 'ja'));
  538. $lang->addTranslation(dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.php', 'ja', array('clear'));
  539. $this->assertEquals('Message 1 (en)', $lang->_('Message 1', 'ja'));
  540. }
  541. /**
  542. * ZF-7941
  543. */
  544. public function testEmptyTranslation()
  545. {
  546. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, null, null, array('disableNotices' => true));
  547. $this->assertEquals(0, count($lang->getList()));
  548. }
  549. /**
  550. * Translating Object
  551. */
  552. public function testObjectTranslation()
  553. {
  554. $lang = new Zend_Translate(Zend_Translate::AN_ARRAY, dirname(__FILE__) . '/Translate/Adapter/_files/testarray', 'en_GB', array('scan' => Zend_Translate::LOCALE_DIRECTORY));
  555. $this->assertEquals('Message 1 (ja)', $lang->_('Message 1', 'ja'));
  556. $this->assertEquals($lang, $lang->translate($lang));
  557. }
  558. /**
  559. * Tests getting plurals from lowered locale
  560. */
  561. public function testGettingPluralsUsingOwnRule()
  562. {
  563. $lang = new Zend_Translate(
  564. Zend_Translate::AN_ARRAY,
  565. array('singular' =>
  566. array('plural_0 (en)',
  567. 'plural_1 (en)',
  568. 'plural_2 (en)',
  569. 'plural_3 (en)'),
  570. 'plural' => ''), 'en'
  571. );
  572. $lang->addTranslation(array('msg1' => 'Message 1 (ru)'), 'en_US');
  573. $lang->setLocale('en_US');
  574. Zend_Translate_Plural::setPlural(array($this, 'customPlural'), 'en_US');
  575. $this->assertEquals('plural_1 (en)', $lang->translate(array('singular', 'plural', 1)));
  576. $this->assertEquals('plural_1 (en)', $lang->plural('singular', 'plural', 1));
  577. $this->assertEquals('plural_1 (en)', $lang->translate(array('singular', 'plural', 0)));
  578. $this->assertEquals('plural_1 (en)', $lang->plural('singular', 'plural', 0));
  579. }
  580. /**
  581. * @group ZF-9489
  582. */
  583. public function testAddingAdapterToSourceUsingOwnRule()
  584. {
  585. $translate = new Zend_Translate(
  586. Zend_Translate::AN_ARRAY,
  587. array('singular' =>
  588. array('plural_0 (en)',
  589. 'plural_1 (en)',
  590. 'plural_2 (en)',
  591. 'plural_3 (en)'),
  592. 'plural' => ''), 'en'
  593. );
  594. $this->assertFalse($translate->isTranslated('Message 1'));
  595. $adapter = new Zend_Translate_Adapter_Gettext(dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.mo', 'en');
  596. $translate->addTranslation($adapter);
  597. $this->assertTrue($adapter->isTranslated('Message 1'));
  598. $adapter2 = new Zend_Translate_Adapter_Gettext(dirname(__FILE__) . '/Translate/Adapter/_files/testmo/de_AT/LC_TEST/translation-de_DE.mo', 'de_AT');
  599. $adapter2->addTranslation(dirname(__FILE__) . '/Translate/Adapter/_files/translation_en2.mo', 'fr');
  600. $translate->addTranslation($adapter2, 'fr');
  601. $languages = $translate->getList();
  602. $this->assertFalse(array_key_exists('de_AT', $languages));
  603. $this->assertTrue(array_key_exists('fr', $languages));
  604. }
  605. /**
  606. * @group ZF-9500
  607. */
  608. public function testIgnoreMultipleDirectories()
  609. {
  610. $translate = new Zend_Translate(
  611. Zend_Translate::AN_ARRAY,
  612. dirname(__FILE__) . '/Translate/Adapter/_files/testarray/',
  613. 'auto',
  614. array(
  615. 'scan' => Zend_Translate::LOCALE_FILENAME,
  616. 'ignore' => array('.', 'ignoreme', 'LC_TEST')
  617. )
  618. );
  619. $langs = $translate->getList();
  620. $this->assertFalse(array_key_exists('de_DE', $langs));
  621. $this->assertTrue(array_key_exists('ja', $langs));
  622. $this->assertTrue(array_key_exists('en_US', $langs));
  623. $translate2 = new Zend_Translate(
  624. Zend_Translate::AN_ARRAY,
  625. dirname(__FILE__) . '/Translate/Adapter/_files/testarray/',
  626. 'auto',
  627. array(
  628. 'scan' => Zend_Translate::LOCALE_FILENAME,
  629. 'ignore' => array('.', 'regex_1' => '/de_DE/', 'regex' => '/ja/')
  630. )
  631. );
  632. $langs = $translate2->getList();
  633. $this->assertFalse(array_key_exists('de_DE', $langs));
  634. $this->assertFalse(array_key_exists('ja', $langs));
  635. $this->assertTrue(array_key_exists('en_US', $langs));
  636. }
  637. /**
  638. * @group ZF-2736
  639. */
  640. public function testReroutingForTranslations()
  641. {
  642. $translate = new Zend_Translate(
  643. array(
  644. 'adapter' => Zend_Translate::AN_ARRAY,
  645. 'content' => dirname(__FILE__) . '/Translate/Adapter/_files/testarray/',
  646. 'locale' => 'auto',
  647. 'scan' => Zend_Translate::LOCALE_FILENAME,
  648. 'ignore' => array('.', 'ignoreme', 'LC_OTHER'),
  649. 'route' => array('ja' => 'en_US'),
  650. )
  651. );
  652. $translate2 = new Zend_Translate(
  653. array(
  654. 'adapter' => Zend_Translate::AN_CSV,
  655. 'content' => dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.csv',
  656. 'locale' => 'en_US',
  657. )
  658. );
  659. $translate->addTranslation($translate2);
  660. $langs = $translate->getList();
  661. $this->assertFalse(array_key_exists('de_AT', $langs));
  662. $this->assertTrue(array_key_exists('ja', $langs));
  663. $this->assertTrue(array_key_exists('en_US', $langs));
  664. $this->assertEquals('Message 5 (en)', $translate->translate('Message 5', 'ja'));
  665. }
  666. /**
  667. * @group ZF-2736
  668. */
  669. public function testCircleReroutingForTranslations()
  670. {
  671. $translate = new Zend_Translate(
  672. array(
  673. 'adapter' => Zend_Translate::AN_ARRAY,
  674. 'content' => dirname(__FILE__) . '/Translate/Adapter/_files/testarray/',
  675. 'locale' => 'auto',
  676. 'scan' => Zend_Translate::LOCALE_FILENAME,
  677. 'ignore' => array('.', 'ignoreme', 'LC_TEST'),
  678. 'route' => array('ja' => 'en_US', 'en_US' => 'ja'),
  679. )
  680. );
  681. $translate2 = new Zend_Translate(
  682. array(
  683. 'adapter' => Zend_Translate::AN_CSV,
  684. 'content' => dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.csv',
  685. 'locale' => 'en_US',
  686. )
  687. );
  688. $translate->addTranslation($translate2);
  689. $langs = $translate->getList();
  690. $this->assertFalse(array_key_exists('de_DE', $langs));
  691. $this->assertTrue(array_key_exists('ja', $langs));
  692. $this->assertTrue(array_key_exists('en_US', $langs));
  693. $this->assertEquals('Message 5 (en)', $translate->translate('Message 5', 'ja'));
  694. $this->assertEquals('Message 10', $translate->translate('Message 10', 'ja'));
  695. }
  696. /**
  697. * @group ZF-2736
  698. */
  699. public function testDoubleReroutingForTranslations()
  700. {
  701. $translate = new Zend_Translate(
  702. array(
  703. 'adapter' => Zend_Translate::AN_ARRAY,
  704. 'content' => dirname(__FILE__) . '/Translate/Adapter/_files/testarray/',
  705. 'locale' => 'auto',
  706. 'scan' => Zend_Translate::LOCALE_FILENAME,
  707. 'ignore' => array('.', 'ignoreme', 'LC_TEST'),
  708. 'route' => array('ja' => 'en_US', 'en_US' => 'ja'),
  709. )
  710. );
  711. $translate2 = new Zend_Translate(
  712. array(
  713. 'adapter' => Zend_Translate::AN_CSV,
  714. 'content' => dirname(__FILE__) . '/Translate/Adapter/_files/translation_en.csv',
  715. 'locale' => 'en_US',
  716. )
  717. );
  718. $translate->addTranslation($translate2);
  719. $langs = $translate->getList();
  720. $this->assertFalse(array_key_exists('de_DE', $langs));
  721. $this->assertTrue(array_key_exists('ja', $langs));
  722. $this->assertTrue(array_key_exists('en_US', $langs));
  723. $this->assertEquals('Message 5 (en)', $translate->translate('Message 5', 'ja'));
  724. $this->assertEquals('Message 5 (en)', $translate->translate('Message 5', 'ja'));
  725. }
  726. /**
  727. * ZF-9877
  728. */
  729. public function testSetCacheThroughOptions()
  730. {
  731. require_once 'Zend/Cache.php';
  732. $cache = Zend_Cache::factory('Core', 'File',
  733. array('lifetime' => 120, 'automatic_serialization' => true),
  734. array('cache_dir' => dirname(__FILE__) . '/_files/'));
  735. $translate = new Zend_Translate(array(
  736. 'adapter' => Zend_Translate::AN_ARRAY,
  737. 'content' => array('msg1' => 'Message 1 (en)'),
  738. 'locale' => 'en',
  739. 'cache' => $cache,
  740. ));
  741. $return = Zend_Translate::getCache();
  742. $this->assertTrue($return instanceof Zend_Cache_Core);
  743. $this->assertTrue(Zend_Translate::hasCache());
  744. }
  745. /**
  746. * @ZF-10051
  747. */
  748. public function testSettingLogPriorityForLog()
  749. {
  750. $stream = fopen('php://memory', 'w+');
  751. require_once 'Zend/Log/Writer/Stream.php';
  752. $writer = new Zend_Log_Writer_Stream($stream);
  753. require_once 'Zend/Log.php';
  754. $log = new Zend_Log($writer);
  755. $lang = new Zend_Translate(array(
  756. 'adapter' => Zend_Translate::AN_CSV,
  757. 'content' => dirname(__FILE__) . '/Translate/Adapter/_files',
  758. 'locale' => 'en',
  759. 'delimiter' => ',',
  760. 'logPriority' => 3,
  761. 'log' => $log)
  762. );
  763. $lang->setLocale('ru');
  764. rewind($stream);
  765. $this->assertContains('ERR (3)', stream_get_contents($stream));
  766. $lang->setOptions(array('logPriority' => 1));
  767. $lang->setLocale('sv');
  768. rewind($stream);
  769. $this->assertContains('ALERT (1)', stream_get_contents($stream));
  770. }
  771. /**
  772. * Ignores a raised PHP error when in effect, but throws a flag to indicate an error occurred
  773. *
  774. * @param integer $errno
  775. * @param string $errstr
  776. * @param string $errfile
  777. * @param integer $errline
  778. * @param array $errcontext
  779. * @return void
  780. */
  781. public function errorHandlerIgnore($errno, $errstr, $errfile, $errline, array $errcontext)
  782. {
  783. $this->_errorOccured = true;
  784. }
  785. /**
  786. * Custom callback for testGettingPluralsUsingOwnRule
  787. *
  788. * @param integer $number
  789. * @return integer
  790. */
  791. public function customPlural($number) {
  792. return 1;
  793. }
  794. }
  795. // Call Zend_TranslateTest::main() if this source file is executed directly.
  796. if (PHPUnit_MAIN_METHOD == "Zend_TranslateTest::main") {
  797. Zend_TranslateTest::main();
  798. }