MessageTest.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <?php
  2. /**
  3. * Lithium: the most rad php framework
  4. *
  5. * @copyright Copyright 2013, Union of RAD (http://union-of-rad.org)
  6. * @license http://opensource.org/licenses/bsd-license.php The BSD License
  7. */
  8. namespace lithium\tests\cases\g11n;
  9. use lithium\core\Environment;
  10. use lithium\g11n\Message;
  11. use lithium\g11n\Catalog;
  12. use lithium\g11n\catalog\adapter\Memory;
  13. class MessageTest extends \lithium\test\Unit {
  14. protected $_backup = array();
  15. public function setUp() {
  16. $this->_backup['catalogConfig'] = Catalog::config();
  17. Catalog::reset();
  18. Catalog::config(array(
  19. 'runtime' => array('adapter' => new Memory())
  20. ));
  21. $data = function($n) { return $n === 1 ? 0 : 1; };
  22. Catalog::write('runtime', 'message.pluralRule', 'root', $data);
  23. $this->_backup['environment'] = Environment::get('test');
  24. Environment::set('test', array('locale' => 'en'));
  25. Environment::set('test');
  26. Message::cache(false);
  27. }
  28. public function tearDown() {
  29. Catalog::reset();
  30. Catalog::config($this->_backup['catalogConfig']);
  31. Environment::set('test', $this->_backup['environment']);
  32. }
  33. public function testTranslateBasic() {
  34. $data = array('catalog' => 'Katalog');
  35. Catalog::write('runtime', 'message', 'de', $data);
  36. $expected = 'Katalog';
  37. $result = Message::translate('catalog', array('locale' => 'de'));
  38. $this->assertEqual($expected, $result);
  39. }
  40. public function testTranslatePlural() {
  41. $data = array(
  42. 'house' => array('Haus', 'Häuser')
  43. );
  44. Catalog::write('runtime', 'message', 'de', $data);
  45. $expected = 'Haus';
  46. $result = Message::translate('house', array('locale' => 'de'));
  47. $this->assertEqual($expected, $result);
  48. $expected = 'Häuser';
  49. $result = Message::translate('house', array('locale' => 'de', 'count' => 5));
  50. $this->assertEqual($expected, $result);
  51. }
  52. public function testTranslateNonIntegerCounts() {
  53. $data = array(
  54. 'house' => array('Haus', 'Häuser')
  55. );
  56. Catalog::write('runtime', 'message', 'de', $data);
  57. $expected = 'Häuser';
  58. $result = Message::translate('house', array('locale' => 'de', 'count' => 2.31));
  59. $this->assertEqual($expected, $result);
  60. $expected = 'Häuser';
  61. $result = Message::translate('house', array('locale' => 'de', 'count' => 1.1));
  62. $this->assertEqual($expected, $result);
  63. $expected = 'Häuser';
  64. $result = Message::translate('house', array('locale' => 'de', 'count' => 0.1));
  65. $this->assertEqual($expected, $result);
  66. $expected = 'Haus';
  67. $result = Message::translate('house', array('locale' => 'de', 'count' => true));
  68. $this->assertEqual($expected, $result);
  69. $expected = 'Häuser';
  70. $result = Message::translate('house', array('locale' => 'de', 'count' => false));
  71. $this->assertEqual($expected, $result);
  72. $expected = 'Häuser';
  73. $result = Message::translate('house', array('locale' => 'de', 'count' => '2'));
  74. $this->assertEqual($expected, $result);
  75. $expected = 'Häuser';
  76. $result = Message::translate('house', array('locale' => 'de', 'count' => '0'));
  77. $this->assertEqual($expected, $result);
  78. }
  79. public function testTranslateNegativeIntegerCounts() {
  80. $data = array(
  81. 'house' => array('Haus', 'Häuser')
  82. );
  83. Catalog::write('runtime', 'message', 'de', $data);
  84. $expected = 'Haus';
  85. $result = Message::translate('house', array('locale' => 'de', 'count' => -1));
  86. $this->assertEqual($expected, $result);
  87. $expected = 'Häuser';
  88. $result = Message::translate('house', array('locale' => 'de', 'count' => -2));
  89. $this->assertEqual($expected, $result);
  90. $expected = 'Häuser';
  91. $result = Message::translate('house', array('locale' => 'de', 'count' => -5));
  92. $this->assertEqual($expected, $result);
  93. }
  94. public function testTranslateFail() {
  95. $result = Message::translate('catalog', array('locale' => 'de'));
  96. $this->assertNull($result);
  97. Catalog::reset();
  98. Catalog::config(array(
  99. 'runtime' => array('adapter' => new Memory())
  100. ));
  101. $data = array(
  102. 'catalog' => array('Katalog', 'Kataloge')
  103. );
  104. Catalog::write('runtime', 'message', 'de', $data);
  105. $result = Message::translate('catalog', array('locale' => 'de'));
  106. $this->assertNull($result);
  107. $data = 'not a valid pluralization function';
  108. Catalog::write('runtime', 'message.pluralRule', 'root', $data);
  109. $result = Message::translate('catalog', array('locale' => 'de'));
  110. $this->assertNull($result);
  111. }
  112. public function testTranslateScope() {
  113. $data = array(
  114. 'catalog' => 'Katalog'
  115. );
  116. Catalog::write('runtime', 'message', 'de', $data, array('scope' => 'test'));
  117. $data = function($n) { return $n === 1 ? 0 : 1; };
  118. Catalog::write('runtime', 'message.pluralRule', 'root', $data, array(
  119. 'scope' => 'test'
  120. ));
  121. $result = Message::translate('catalog', array('locale' => 'de'));
  122. $this->assertNull($result);
  123. $expected = 'Katalog';
  124. $result = Message::translate('catalog', array('locale' => 'de', 'scope' => 'test'));
  125. $this->assertEqual($expected, $result);
  126. }
  127. public function testTranslateDefault() {
  128. $result = Message::translate('Here I am', array('locale' => 'de'));
  129. $this->assertNull($result);
  130. $result = Message::translate('Here I am', array(
  131. 'locale' => 'de', 'default' => 'Here I am'
  132. ));
  133. $expected = 'Here I am';
  134. $this->assertEqual($expected, $result);
  135. }
  136. public function testTranslatePlaceholders() {
  137. $data = array(
  138. 'green' => 'grün',
  139. 'No. {:id}' => 'Nr. {:id}',
  140. 'The fish is {:color}.' => 'Der Fisch ist {:color}.',
  141. '{:count} bike' => array('{:count} Fahrrad', '{:count} Fahrräder')
  142. );
  143. Catalog::write('runtime', 'message', 'de', $data);
  144. $expected = 'Der Fisch ist grün.';
  145. $result = Message::translate('The fish is {:color}.', array(
  146. 'locale' => 'de',
  147. 'color' => Message::translate('green', array('locale' => 'de'))
  148. ));
  149. $this->assertEqual($expected, $result);
  150. $expected = '1 Fahrrad';
  151. $result = Message::translate('{:count} bike', array('locale' => 'de', 'count' => 1));
  152. $this->assertEqual($expected, $result);
  153. $expected = '7 Fahrräder';
  154. $result = Message::translate('{:count} bike', array('locale' => 'de', 'count' => 7));
  155. $this->assertEqual($expected, $result);
  156. $expected = 'Nr. 8';
  157. $result = Message::translate('No. {:id}', array('locale' => 'de', 'id' => 8));
  158. $this->assertEqual($expected, $result);
  159. }
  160. public function testTranslateLocales() {
  161. $data = array(
  162. 'catalog' => 'Katalog'
  163. );
  164. Catalog::write('runtime', 'message', 'de', $data);
  165. $data = array(
  166. 'catalog' => 'catalogue'
  167. );
  168. Catalog::write('runtime', 'message', 'fr', $data);
  169. $expected = 'Katalog';
  170. $result = Message::translate('catalog', array('locale' => 'de'));
  171. $this->assertEqual($expected, $result);
  172. $expected = 'catalogue';
  173. $result = Message::translate('catalog', array('locale' => 'fr'));
  174. $this->assertEqual($expected, $result);
  175. }
  176. public function testTranslateNoop() {
  177. $data = array(
  178. 'catalog' => 'Katalog'
  179. );
  180. Catalog::write('runtime', 'message', 'de', $data);
  181. $result = Message::translate('catalog', array('locale' => 'de', 'noop' => true));
  182. $this->assertNull($result);
  183. }
  184. public function testAliasesBasic() {
  185. $data = array(
  186. 'house' => array('Haus', 'Häuser')
  187. );
  188. Catalog::write('runtime', 'message', 'de', $data);
  189. $filters = Message::aliases();
  190. $t = $filters['t'];
  191. $tn = $filters['tn'];
  192. $expected = 'Haus';
  193. $result = $t('house', array('locale' => 'de'));
  194. $this->assertEqual($expected, $result);
  195. $expected = 'Haus';
  196. $result = $tn('house', 'houses', 1, array('locale' => 'de'));
  197. $this->assertEqual($expected, $result);
  198. $expected = 'Häuser';
  199. $result = $tn('house', 'houses', 3, array('locale' => 'de'));
  200. $this->assertEqual($expected, $result);
  201. }
  202. public function testAliasesSymmetry() {
  203. $data = array('house' => array('Haus', 'Häuser'));
  204. Catalog::write('runtime', 'message', 'de', $data);
  205. $filters = Message::aliases();
  206. $t = $filters['t'];
  207. $tn = $filters['tn'];
  208. $expected = Message::translate('house', array('locale' => 'de'));
  209. $result = $t('house', array('locale' => 'de'));
  210. $this->assertEqual($expected, $result);
  211. $expected = Message::translate('house', array('locale' => 'de', 'count' => 1));
  212. $result = $tn('house', 'houses', 1, array('locale' => 'de'));
  213. $this->assertEqual($expected, $result);
  214. $expected = Message::translate('house', array('locale' => 'de', 'count' => 3));
  215. $result = $tn('house', 'houses', 3, array('locale' => 'de'));
  216. $this->assertEqual($expected, $result);
  217. }
  218. public function testAliasesAsymmetry() {
  219. $filters = Message::aliases();
  220. $t = $filters['t'];
  221. $tn = $filters['tn'];
  222. $expected = Message::translate('house', array('locale' => 'de'));
  223. $result = $t('house', array('locale' => 'de'));
  224. $this->assertNotEqual($expected, $result);
  225. $expected = Message::translate('house', array('locale' => 'de', 'count' => 3));
  226. $result = $tn('house', 'houses', array('locale' => 'de'));
  227. $this->assertNotEqual($expected, $result);
  228. }
  229. public function testCaching() {
  230. $data = array('catalog' => 'Katalog');
  231. Catalog::write('runtime', 'message', 'de', $data, array('scope' => 'foo'));
  232. $this->assertFalse(Message::cache());
  233. $result = Message::translate('catalog', array('locale' => 'de', 'scope' => 'foo'));
  234. $this->assertEqual('Katalog', $result);
  235. $cache = Message::cache();
  236. $this->assertEqual('Katalog', $cache['foo']['de']['catalog']);
  237. Message::cache(false);
  238. $this->assertFalse(Message::cache());
  239. Message::cache(array('foo' => array('de' => array('catalog' => '<Katalog>'))));
  240. $result = Message::translate('catalog', array('locale' => 'de', 'scope' => 'foo'));
  241. $this->assertEqual('<Katalog>', $result);
  242. $options = array('locale' => 'de', 'scope' => 'foo', 'count' => 2);
  243. $this->assertEqual('<Katalog>', Message::translate('catalog', $options));
  244. Message::cache(false);
  245. Message::cache(array('foo' => array('de' => array('catalog' => array('<Katalog>')))));
  246. $this->assertNull(Message::translate('catalog', $options));
  247. }
  248. }
  249. ?>