You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

L10nTest.php 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. /**
  3. * Copyright (c) 2016 Joas Schilling <nickvergessen@owncloud.com>
  4. * This file is licensed under the Affero General Public License version 3 or
  5. * later.
  6. * See the COPYING-README file.
  7. */
  8. namespace Test\L10N;
  9. use DateTime;
  10. use OC\L10N\Factory;
  11. use OC\L10N\L10N;
  12. use OCP\IConfig;
  13. use OCP\IRequest;
  14. use OCP\IUserSession;
  15. use Test\TestCase;
  16. /**
  17. * Class L10nTest
  18. *
  19. * @package Test\L10N
  20. */
  21. class L10nTest extends TestCase {
  22. /**
  23. * @return Factory
  24. */
  25. protected function getFactory() {
  26. /** @var \OCP\IConfig $config */
  27. $config = $this->createMock(IConfig::class);
  28. /** @var \OCP\IRequest $request */
  29. $request = $this->createMock(IRequest::class);
  30. /** @var IUserSession $userSession */
  31. $userSession = $this->createMock(IUserSession::class);
  32. return new Factory($config, $request, $userSession, \OC::$SERVERROOT);
  33. }
  34. public function testGermanPluralTranslations() {
  35. $transFile = \OC::$SERVERROOT.'/tests/data/l10n/de.json';
  36. $l = new L10N($this->getFactory(), 'test', 'de', 'de_AT', [$transFile]);
  37. $this->assertEquals('1 Datei', (string) $l->n('%n file', '%n files', 1));
  38. $this->assertEquals('2 Dateien', (string) $l->n('%n file', '%n files', 2));
  39. }
  40. public function testRussianPluralTranslations() {
  41. $transFile = \OC::$SERVERROOT.'/tests/data/l10n/ru.json';
  42. $l = new L10N($this->getFactory(), 'test', 'ru', 'ru_UA', [$transFile]);
  43. $this->assertEquals('1 файл', (string)$l->n('%n file', '%n files', 1));
  44. $this->assertEquals('2 файла', (string)$l->n('%n file', '%n files', 2));
  45. $this->assertEquals('6 файлов', (string)$l->n('%n file', '%n files', 6));
  46. $this->assertEquals('21 файл', (string)$l->n('%n file', '%n files', 21));
  47. $this->assertEquals('22 файла', (string)$l->n('%n file', '%n files', 22));
  48. $this->assertEquals('26 файлов', (string)$l->n('%n file', '%n files', 26));
  49. /*
  50. 1 file 1 файл 1 папка
  51. 2-4 files 2-4 файла 2-4 папки
  52. 5-20 files 5-20 файлов 5-20 папок
  53. 21 files 21 файл 21 папка
  54. 22-24 files 22-24 файла 22-24 папки
  55. 25-30 files 25-30 файлов 25-30 папок
  56. etc
  57. 100 files 100 файлов, 100 папок
  58. 1000 files 1000 файлов 1000 папок
  59. */
  60. }
  61. public function testCzechPluralTranslations() {
  62. $transFile = \OC::$SERVERROOT.'/tests/data/l10n/cs.json';
  63. $l = new L10N($this->getFactory(), 'test', 'cs', 'cs_CZ', [$transFile]);
  64. $this->assertEquals('1 okno', (string)$l->n('%n window', '%n windows', 1));
  65. $this->assertEquals('2 okna', (string)$l->n('%n window', '%n windows', 2));
  66. $this->assertEquals('5 oken', (string)$l->n('%n window', '%n windows', 5));
  67. }
  68. public function dataPlaceholders(): array {
  69. return [
  70. ['Ordered placeholders one %s two %s', 'Placeholder one 1 two 2'],
  71. ['Reordered placeholders one %s two %s', 'Placeholder two 2 one 1'],
  72. ['Reordered placeholders one %1$s two %2$s', 'Placeholder two 2 one 1'],
  73. ];
  74. }
  75. /**
  76. * @dataProvider dataPlaceholders
  77. *
  78. * @param $string
  79. * @param $expected
  80. */
  81. public function testPlaceholders($string, $expected): void {
  82. $transFile = \OC::$SERVERROOT.'/tests/data/l10n/de.json';
  83. $l = new L10N($this->getFactory(), 'test', 'de', 'de_AT', [$transFile]);
  84. $this->assertEquals($expected, $l->t($string, ['1', '2']));
  85. }
  86. public function localizationData() {
  87. return [
  88. // timestamp as string
  89. ['February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'en_US', 'datetime', '1234567890'],
  90. ['13. Februar 2009 um 23:31:30 GMT+0', 'de', 'de_DE', 'datetime', '1234567890'],
  91. ['February 13, 2009', 'en', 'en_US', 'date', '1234567890'],
  92. ['13. Februar 2009', 'de', 'de_DE', 'date', '1234567890'],
  93. ['11:31:30 PM GMT+0', 'en', 'en_US', 'time', '1234567890'],
  94. ['23:31:30 GMT+0', 'de', 'de_DE', 'time', '1234567890'],
  95. // timestamp as int
  96. ['February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'en_US', 'datetime', 1234567890],
  97. ['13. Februar 2009 um 23:31:30 GMT+0', 'de', 'de_DE', 'datetime', 1234567890],
  98. ['February 13, 2009', 'en', 'en_US', 'date', 1234567890],
  99. ['13. Februar 2009', 'de', 'de_DE', 'date', 1234567890],
  100. ['11:31:30 PM GMT+0', 'en', 'en_US', 'time', 1234567890],
  101. ['23:31:30 GMT+0', 'de', 'de_DE', 'time', 1234567890],
  102. // DateTime object
  103. ['February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'en_US', 'datetime', new DateTime('@1234567890')],
  104. ['13. Februar 2009 um 23:31:30 GMT+0', 'de', 'de_DE', 'datetime', new DateTime('@1234567890')],
  105. ['February 13, 2009', 'en', 'en_US', 'date', new DateTime('@1234567890')],
  106. ['13. Februar 2009', 'de', 'de_DE', 'date', new DateTime('@1234567890')],
  107. ['11:31:30 PM GMT+0', 'en', 'en_US', 'time', new DateTime('@1234567890')],
  108. ['23:31:30 GMT+0', 'de', 'de_DE', 'time', new DateTime('@1234567890')],
  109. // en_GB
  110. ['13 February 2009 at 23:31:30 GMT+0', 'en_GB', 'en_GB', 'datetime', new DateTime('@1234567890')],
  111. ['13 February 2009', 'en_GB', 'en_GB', 'date', new DateTime('@1234567890')],
  112. ['23:31:30 GMT+0', 'en_GB', 'en_GB', 'time', new DateTime('@1234567890')],
  113. ['13 February 2009 at 23:31:30 GMT+0', 'en-GB', 'en_GB', 'datetime', new DateTime('@1234567890')],
  114. ['13 February 2009', 'en-GB', 'en_GB', 'date', new DateTime('@1234567890')],
  115. ['23:31:30 GMT+0', 'en-GB', 'en_GB', 'time', new DateTime('@1234567890')],
  116. ];
  117. }
  118. /**
  119. * @dataProvider localizationData
  120. */
  121. public function testNumericStringLocalization($expectedDate, $lang, $locale, $type, $value) {
  122. $l = new L10N($this->getFactory(), 'test', $lang, $locale, []);
  123. $this->assertSame($expectedDate, $l->l($type, $value));
  124. }
  125. public function firstDayData() {
  126. return [
  127. [1, 'de', 'de_DE'],
  128. [0, 'en', 'en_US'],
  129. ];
  130. }
  131. /**
  132. * @dataProvider firstDayData
  133. * @param $expected
  134. * @param $lang
  135. * @param $locale
  136. */
  137. public function testFirstWeekDay($expected, $lang, $locale) {
  138. $l = new L10N($this->getFactory(), 'test', $lang, $locale, []);
  139. $this->assertSame($expected, $l->l('firstday', 'firstday'));
  140. }
  141. public function jsDateData() {
  142. return [
  143. ['dd.MM.yy', 'de', 'de_DE'],
  144. ['M/d/yy', 'en', 'en_US'],
  145. ];
  146. }
  147. /**
  148. * @dataProvider jsDateData
  149. * @param $expected
  150. * @param $lang
  151. * @param $locale
  152. */
  153. public function testJSDate($expected, $lang, $locale) {
  154. $l = new L10N($this->getFactory(), 'test', $lang, $locale, []);
  155. $this->assertSame($expected, $l->l('jsdate', 'jsdate'));
  156. }
  157. public function testFactoryGetLanguageCode() {
  158. $l = $this->getFactory()->get('lib', 'de');
  159. $this->assertEquals('de', $l->getLanguageCode());
  160. }
  161. public function testServiceGetLanguageCode() {
  162. $l = \OC::$server->getL10N('lib', 'de');
  163. $this->assertEquals('de', $l->getLanguageCode());
  164. }
  165. public function testWeekdayName() {
  166. $l = \OC::$server->getL10N('lib', 'de');
  167. $this->assertEquals('Mo.', $l->l('weekdayName', new \DateTime('2017-11-6'), ['width' => 'abbreviated']));
  168. }
  169. /**
  170. * @dataProvider findLanguageFromLocaleData
  171. * @param $locale
  172. * @param $language
  173. */
  174. public function testFindLanguageFromLocale($locale, $language) {
  175. $this->assertEquals(
  176. $language,
  177. \OC::$server->getL10NFactory()->findLanguageFromLocale('lib', $locale)
  178. );
  179. }
  180. /**
  181. * @return array
  182. */
  183. public function findLanguageFromLocaleData(): array {
  184. return [
  185. 'en_US' => ['en_US', 'en'],
  186. 'en_UK' => ['en_UK', 'en'],
  187. 'de_DE' => ['de_DE', 'de_DE'],
  188. 'de_AT' => ['de_AT', 'de'],
  189. 'es_EC' => ['es_EC', 'es_EC'],
  190. 'fi_FI' => ['fi_FI', 'fi'],
  191. 'zh_CN' => ['zh_CN', 'zh_CN'],
  192. ];
  193. }
  194. }