CreateTest.php 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * This file is part of the Carbon package.
  5. *
  6. * (c) Brian Nesbitt <brian@nesbot.com>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Tests\Carbon;
  12. use Carbon\Carbon;
  13. use Carbon\Exceptions\InvalidTimeZoneException;
  14. use Carbon\Exceptions\OutOfRangeException;
  15. use DateTime;
  16. use DateTimeZone;
  17. use InvalidArgumentException;
  18. use Tests\AbstractTestCase;
  19. class CreateTest extends AbstractTestCase
  20. {
  21. public function testCreateReturnsDatingInstance()
  22. {
  23. $d = Carbon::create();
  24. $this->assertInstanceOfCarbon($d);
  25. }
  26. public function testCreateWithDefaults()
  27. {
  28. $d = Carbon::create();
  29. $this->assertSame($d->getTimestamp(), Carbon::create('0000-01-01 00:00:00')->getTimestamp());
  30. }
  31. public function testCreateWithNull()
  32. {
  33. $d = Carbon::create(null, null, null, null, null, null);
  34. $this->assertSame($d->getTimestamp(), Carbon::now()->getTimestamp());
  35. }
  36. public function testCreateWithYear()
  37. {
  38. $d = Carbon::create(2012);
  39. $this->assertSame(2012, $d->year);
  40. }
  41. public function testCreateHandlesNegativeYear()
  42. {
  43. $c = Carbon::create(-1, 10, 12, 1, 2, 3);
  44. $this->assertCarbon($c, -1, 10, 12, 1, 2, 3);
  45. }
  46. public function testCreateHandlesFiveDigitsPositiveYears()
  47. {
  48. $c = Carbon::create(999999999, 10, 12, 1, 2, 3);
  49. $this->assertCarbon($c, 999999999, 10, 12, 1, 2, 3);
  50. }
  51. public function testCreateHandlesFiveDigitsNegativeYears()
  52. {
  53. $c = Carbon::create(-999999999, 10, 12, 1, 2, 3);
  54. $this->assertCarbon($c, -999999999, 10, 12, 1, 2, 3);
  55. }
  56. public function testCreateWithMonth()
  57. {
  58. $d = Carbon::create(null, 3);
  59. $this->assertSame(3, $d->month);
  60. }
  61. public function testCreateWithInvalidMonth()
  62. {
  63. $this->expectExceptionObject(new InvalidArgumentException(
  64. 'month must be between 0 and 99, -5 given'
  65. ));
  66. Carbon::create(null, -5);
  67. }
  68. public function testOutOfRangeException()
  69. {
  70. /** @var OutOfRangeException $error */
  71. $error = null;
  72. try {
  73. Carbon::create(null, -5);
  74. } catch (OutOfRangeException $exception) {
  75. $error = $exception;
  76. }
  77. $this->assertInstanceOf(OutOfRangeException::class, $error);
  78. $this->assertSame('month', $error->getUnit());
  79. $this->assertSame(-5, $error->getValue());
  80. $this->assertSame(0, $error->getMin());
  81. $this->assertSame(99, $error->getMax());
  82. }
  83. public function testCreateWithInvalidMonthNonStrictMode()
  84. {
  85. Carbon::useStrictMode(false);
  86. $this->assertFalse(Carbon::isStrictModeEnabled());
  87. $this->assertFalse(Carbon::create(null, -5));
  88. Carbon::useStrictMode(true);
  89. $this->assertTrue(Carbon::isStrictModeEnabled());
  90. }
  91. public function testCreateMonthWraps()
  92. {
  93. $d = Carbon::create(2011, 0, 1, 0, 0, 0);
  94. $this->assertCarbon($d, 2010, 12, 1, 0, 0, 0);
  95. }
  96. public function testCreateWithDay()
  97. {
  98. $d = Carbon::create(null, null, 21);
  99. $this->assertSame(21, $d->day);
  100. }
  101. public function testCreateWithInvalidDay()
  102. {
  103. $this->expectExceptionObject(new InvalidArgumentException(
  104. 'day must be between 0 and 99, -4 given'
  105. ));
  106. Carbon::create(null, null, -4);
  107. }
  108. public function testCreateDayWraps()
  109. {
  110. $d = Carbon::create(2011, 1, 40, 0, 0, 0);
  111. $this->assertCarbon($d, 2011, 2, 9, 0, 0, 0);
  112. }
  113. public function testCreateWithHourAndDefaultMinSecToZero()
  114. {
  115. $d = Carbon::create(null, null, null, 14);
  116. $this->assertSame(14, $d->hour);
  117. $this->assertSame(0, $d->minute);
  118. $this->assertSame(0, $d->second);
  119. }
  120. public function testCreateWithInvalidHour()
  121. {
  122. $this->expectExceptionObject(new InvalidArgumentException(
  123. 'hour must be between 0 and 99, -1 given'
  124. ));
  125. Carbon::create(null, null, null, -1);
  126. }
  127. public function testCreateHourWraps()
  128. {
  129. $d = Carbon::create(2011, 1, 1, 24, 0, 0);
  130. $this->assertCarbon($d, 2011, 1, 2, 0, 0, 0);
  131. }
  132. public function testCreateWithMinute()
  133. {
  134. $d = Carbon::create(null, null, null, null, 58);
  135. $this->assertSame(58, $d->minute);
  136. }
  137. public function testCreateWithInvalidMinute()
  138. {
  139. $this->expectExceptionObject(new InvalidArgumentException(
  140. 'minute must be between 0 and 99, -2 given'
  141. ));
  142. Carbon::create(2011, 1, 1, 0, -2, 0);
  143. }
  144. public function testCreateMinuteWraps()
  145. {
  146. $d = Carbon::create(2011, 1, 1, 0, 62, 0);
  147. $this->assertCarbon($d, 2011, 1, 1, 1, 2, 0);
  148. }
  149. public function testCreateWithSecond()
  150. {
  151. $d = Carbon::create(null, null, null, null, null, 59);
  152. $this->assertSame(59, $d->second);
  153. }
  154. public function testCreateWithInvalidSecond()
  155. {
  156. $this->expectExceptionObject(new InvalidArgumentException(
  157. 'second must be between 0 and 99, -2 given'
  158. ));
  159. Carbon::create(null, null, null, null, null, -2);
  160. }
  161. public function testCreateSecondsWrap()
  162. {
  163. $d = Carbon::create(2012, 1, 1, 0, 0, 61);
  164. $this->assertCarbon($d, 2012, 1, 1, 0, 1, 1);
  165. }
  166. public function testCreateWithDateTimeZone()
  167. {
  168. $d = Carbon::create(2012, 1, 1, 0, 0, 0, new DateTimeZone('Europe/London'));
  169. $this->assertCarbon($d, 2012, 1, 1, 0, 0, 0);
  170. $this->assertSame('Europe/London', $d->tzName);
  171. }
  172. public function testCreateWithTimeZoneString()
  173. {
  174. $d = Carbon::create(2012, 1, 1, 0, 0, 0, 'Europe/London');
  175. $this->assertCarbon($d, 2012, 1, 1, 0, 0, 0);
  176. $this->assertSame('Europe/London', $d->tzName);
  177. }
  178. public function testMake()
  179. {
  180. $this->assertCarbon(Carbon::make('2017-01-05'), 2017, 1, 5, 0, 0, 0);
  181. $this->assertCarbon(Carbon::make(new DateTime('2017-01-05')), 2017, 1, 5, 0, 0, 0);
  182. $this->assertCarbon(Carbon::make(new Carbon('2017-01-05')), 2017, 1, 5, 0, 0, 0);
  183. $this->assertNull(Carbon::make(3));
  184. }
  185. public function testCreateWithInvalidTimezoneOffset()
  186. {
  187. $this->expectExceptionObject(new InvalidTimeZoneException(
  188. 'Absolute timezone offset cannot be greater than 100.'
  189. ));
  190. Carbon::createFromDate(2000, 1, 1, -28236);
  191. }
  192. public function testCreateWithValidTimezoneOffset()
  193. {
  194. $dt = Carbon::createFromDate(2000, 1, 1, -4);
  195. $this->assertSame('America/New_York', $dt->tzName);
  196. $dt = Carbon::createFromDate(2000, 1, 1, '-4');
  197. $this->assertSame('-04:00', $dt->tzName);
  198. }
  199. public function testParseFromLocale()
  200. {
  201. $dateToday = Carbon::parseFromLocale('now', 'en');
  202. $dateTest = Carbon::parseFromLocale('à l\'instant', 'fr');
  203. $this->assertSame($dateToday->format('Y-m-d H:i:s'), $dateTest->format('Y-m-d H:i:s'));
  204. $dateToday = Carbon::parseFromLocale('today', 'en');
  205. $dateTest = Carbon::parseFromLocale('Aujourd\'hui', 'fr');
  206. $this->assertSame($dateToday->format('Y-m-d'), $dateTest->format('Y-m-d'));
  207. $dateTest = Carbon::parseFromLocale('Aujourd\'hui à 19:34', 'fr');
  208. $this->assertSame($dateToday->format('Y-m-d').' 19:34', $dateTest->format('Y-m-d H:i'));
  209. $dateTest = Carbon::parseFromLocale('Heute', 'de');
  210. $this->assertSame($dateToday->format('Y-m-d'), $dateTest->format('Y-m-d'));
  211. $dateTest = Carbon::parseFromLocale('Heute um 19:34', 'de');
  212. $this->assertSame($dateToday->format('Y-m-d').' 19:34', $dateTest->format('Y-m-d H:i'));
  213. $date = date('Y-m-d', strtotime($dateToday.' + 1 days'));
  214. $dateTest = Carbon::parseFromLocale('demain', 'fr');
  215. $this->assertSame($date, $dateTest->format('Y-m-d'));
  216. $date = date('Y-m-d', strtotime($dateToday.' + 2 days'));
  217. $dateTest = Carbon::parseFromLocale('après-demain', 'fr');
  218. $this->assertSame($date, $dateTest->format('Y-m-d'));
  219. $date = date('Y-m-d', strtotime($dateToday.' - 1 days'));
  220. $dateTest = Carbon::parseFromLocale('hier', 'fr');
  221. $this->assertSame($date, $dateTest->format('Y-m-d'));
  222. $date = date('Y-m-d', strtotime($dateToday.' - 2 days'));
  223. $dateTest = Carbon::parseFromLocale('avant-hier', 'fr');
  224. $this->assertSame($date, $dateTest->format('Y-m-d'));
  225. $date = Carbon::parseFromLocale('23 Okt 2019', 'de');
  226. $this->assertSame('Wednesday, October 23, 2019 12:00 AM America/Toronto', $date->isoFormat('LLLL zz'));
  227. $date = Carbon::parseFromLocale('23 Okt 2019', 'de', 'Europe/Berlin')->locale('de');
  228. $this->assertSame('Mittwoch, 23. Oktober 2019 00:00 Europe/Berlin', $date->isoFormat('LLLL zz'));
  229. $date = Carbon::parseFromLocale('23 červenec 2019', 'cs');
  230. $this->assertSame('2019-07-23', $date->format('Y-m-d'));
  231. $date = Carbon::parseFromLocale('23 červen 2019', 'cs');
  232. $this->assertSame('2019-06-23', $date->format('Y-m-d'));
  233. Carbon::setTestNow('2021-01-26 15:45:13');
  234. $date = Carbon::parseFromLocale('завтра', 'ru');
  235. $this->assertSame('2021-01-27 00:00:00', $date->format('Y-m-d H:i:s'));
  236. }
  237. /**
  238. * @dataProvider \Tests\Carbon\CreateTest::dataForLocales
  239. *
  240. * @group localization
  241. */
  242. public function testParseFromLocaleForEachLocale($locale)
  243. {
  244. $expectedDate = Carbon::parse('today 4:26');
  245. $date = Carbon::parseFromLocale($expectedDate->locale($locale)->calendar(), $locale);
  246. $this->assertSame($expectedDate->format('Y-m-d H:i'), $date->format('Y-m-d H:i'));
  247. }
  248. public function testParseFromLocaleWithDefaultLocale()
  249. {
  250. Carbon::setLocale('fr');
  251. $date = Carbon::parseFromLocale('Dimanche');
  252. $this->assertSame('dimanche', $date->dayName);
  253. $date = Carbon::parseFromLocale('Lundi');
  254. $this->assertSame('lundi', $date->dayName);
  255. $date = Carbon::parseFromLocale('à l’instant');
  256. $this->assertEquals(Carbon::now(), $date);
  257. $date = Carbon::parseFromLocale('après-demain');
  258. $this->assertEquals(Carbon::today()->addDays(2), $date);
  259. }
  260. public function testCreateFromLocaleFormat()
  261. {
  262. $date = Carbon::createFromLocaleFormat('Y M d H,i,s', 'zh_CN', '2019 四月 4 12,04,21');
  263. $this->assertSame('Thursday, April 4, 2019 12:04 PM America/Toronto', $date->isoFormat('LLLL zz'));
  264. $date = Carbon::createFromLocaleFormat('Y M d H,i,s', 'zh_TW', '2019 四月 4 12,04,21', 'Asia/Shanghai')->locale('zh');
  265. $this->assertSame('2019年4月4日星期四 中午 12点04分 Asia/Shanghai', $date->isoFormat('LLLL zz'));
  266. $this->assertSame(
  267. '2022-12-05 America/Mexico_City',
  268. Carbon::createFromLocaleFormat('d * F * Y', 'es', '05 de diciembre de 2022', 'America/Mexico_City')
  269. ->format('Y-m-d e')
  270. );
  271. $this->assertSame(
  272. '2022-12-05 America/Mexico_City',
  273. Carbon::createFromLocaleFormat('d \of F \of Y', 'es', '05 de diciembre de 2022', 'America/Mexico_City')
  274. ->format('Y-m-d e')
  275. );
  276. $this->assertSame(
  277. '2022-12-05 America/Mexico_City',
  278. Carbon::createFromLocaleFormat('d \o\f F \o\f Y', 'es', '05 de diciembre de 2022', 'America/Mexico_City')
  279. ->format('Y-m-d e')
  280. );
  281. $this->assertSame(
  282. '2022-12-05 America/Mexico_City',
  283. Carbon::createFromLocaleFormat('d \d\e F \d\e Y', 'es', '05 de diciembre de 2022', 'America/Mexico_City')
  284. ->format('Y-m-d e')
  285. );
  286. $this->assertSame(
  287. '2022-12-05 America/Mexico_City',
  288. Carbon::createFromLocaleFormat('d \n\o\t F \n\o\t Y', 'es', '05 not diciembre not 2022', 'America/Mexico_City')
  289. ->format('Y-m-d e')
  290. );
  291. }
  292. public function testCreateFromIsoFormat()
  293. {
  294. $date = Carbon::createFromIsoFormat('!YYYYY MMMM D', '2019 April 4');
  295. $this->assertSame('Thursday, April 4, 2019 12:00 AM America/Toronto', $date->isoFormat('LLLL zz'));
  296. }
  297. public function testCreateFromIsoFormatException()
  298. {
  299. $this->expectExceptionObject(new InvalidArgumentException(
  300. 'Format wo not supported for creation.'
  301. ));
  302. Carbon::createFromIsoFormat('YY D wo', '2019 April 4');
  303. }
  304. public function testCreateFromLocaleIsoFormat()
  305. {
  306. $date = Carbon::createFromLocaleIsoFormat('YYYY MMMM D HH,mm,ss', 'zh_TW', '2019 四月 4 12,04,21');
  307. $this->assertSame('Thursday, April 4, 2019 12:04 PM America/Toronto', $date->isoFormat('LLLL zz'));
  308. $date = Carbon::createFromLocaleIsoFormat('LLL zz', 'zh', '2019年4月4日 下午 2点04分 Asia/Shanghai');
  309. $this->assertSame('Thursday, April 4, 2019 2:04 PM Asia/Shanghai', $date->isoFormat('LLLL zz'));
  310. $this->assertSame('2019年4月4日星期四 下午 2点04分 Asia/Shanghai', $date->locale('zh')->isoFormat('LLLL zz'));
  311. $date = Carbon::createFromLocaleIsoFormat('llll', 'fr_CA', 'mar. 24 juil. 2018 08:34');
  312. $this->assertSame('2018-07-24 08:34', $date->format('Y-m-d H:i'));
  313. }
  314. public static function dataForLocales(): array
  315. {
  316. $locales = [
  317. 'aa_ER',
  318. 'aa_ER@saaho',
  319. 'aa_ET',
  320. 'af',
  321. 'af_NA',
  322. 'af_ZA',
  323. 'agq',
  324. 'agr',
  325. 'agr_PE',
  326. 'ak',
  327. 'ak_GH',
  328. 'am',
  329. 'am_ET',
  330. 'an',
  331. 'an_ES',
  332. 'anp',
  333. 'anp_IN',
  334. 'ar',
  335. 'ar_AE',
  336. 'ar_BH',
  337. 'ar_DJ',
  338. 'ar_DZ',
  339. 'ar_EG',
  340. 'ar_EH',
  341. 'ar_ER',
  342. 'ar_IL',
  343. 'ar_IN',
  344. 'ar_IQ',
  345. 'ar_JO',
  346. 'ar_KM',
  347. 'ar_KW',
  348. 'ar_LB',
  349. 'ar_LY',
  350. 'ar_MA',
  351. 'ar_MR',
  352. 'ar_OM',
  353. 'ar_PS',
  354. 'ar_QA',
  355. 'ar_SA',
  356. 'ar_SD',
  357. 'ar_SO',
  358. 'ar_SS',
  359. 'ar_SY',
  360. 'ar_Shakl',
  361. 'ar_TD',
  362. 'ar_TN',
  363. 'ar_YE',
  364. 'as',
  365. 'as_IN',
  366. 'asa',
  367. 'ast',
  368. 'ast_ES',
  369. 'ayc',
  370. 'ayc_PE',
  371. 'az',
  372. 'az_AZ',
  373. 'az_Cyrl',
  374. 'az_Latn',
  375. 'bas',
  376. 'be',
  377. 'be_BY',
  378. 'bem',
  379. 'bem_ZM',
  380. 'ber',
  381. 'ber_DZ',
  382. 'ber_MA',
  383. 'bez',
  384. 'bg',
  385. 'bg_BG',
  386. 'bhb',
  387. 'bhb_IN',
  388. 'bho',
  389. 'bho_IN',
  390. 'bi',
  391. 'bi_VU',
  392. 'bm',
  393. 'bo_IN',
  394. 'br',
  395. 'br_FR',
  396. 'brx',
  397. 'brx_IN',
  398. 'bs',
  399. 'bs_BA',
  400. 'bs_Cyrl',
  401. 'bs_Latn',
  402. 'ca',
  403. 'ca_AD',
  404. 'ca_ES',
  405. 'ca_ES_Valencia',
  406. 'ca_FR',
  407. 'ca_IT',
  408. 'ccp',
  409. 'ccp_IN',
  410. 'ce',
  411. 'ce_RU',
  412. 'cgg',
  413. 'chr',
  414. 'chr_US',
  415. 'cmn',
  416. 'cmn_TW',
  417. 'crh',
  418. 'crh_UA',
  419. 'cu',
  420. 'cy',
  421. 'cy_GB',
  422. 'da',
  423. 'da_DK',
  424. 'da_GL',
  425. 'dav',
  426. 'dje',
  427. 'doi',
  428. 'doi_IN',
  429. 'dsb',
  430. 'dsb_DE',
  431. 'dua',
  432. 'dv',
  433. 'dv_MV',
  434. 'dyo',
  435. 'dz',
  436. 'dz_BT',
  437. 'ebu',
  438. 'ee_TG',
  439. 'el',
  440. 'el_CY',
  441. 'el_GR',
  442. 'en',
  443. 'en_001',
  444. 'en_150',
  445. 'en_AG',
  446. 'en_AI',
  447. 'en_AS',
  448. 'en_AT',
  449. 'en_AU',
  450. 'en_BB',
  451. 'en_BE',
  452. 'en_BI',
  453. 'en_BM',
  454. 'en_BS',
  455. 'en_BW',
  456. 'en_BZ',
  457. 'en_CA',
  458. 'en_CC',
  459. 'en_CH',
  460. 'en_CK',
  461. 'en_CM',
  462. 'en_CX',
  463. 'en_CY',
  464. 'en_DE',
  465. 'en_DG',
  466. 'en_DK',
  467. 'en_DM',
  468. 'en_ER',
  469. 'en_FI',
  470. 'en_FJ',
  471. 'en_FK',
  472. 'en_FM',
  473. 'en_GB',
  474. 'en_GD',
  475. 'en_GG',
  476. 'en_GH',
  477. 'en_GI',
  478. 'en_GM',
  479. 'en_GU',
  480. 'en_GY',
  481. 'en_HK',
  482. 'en_IE',
  483. 'en_IL',
  484. 'en_IM',
  485. 'en_IN',
  486. 'en_IO',
  487. 'en_ISO',
  488. 'en_JE',
  489. 'en_JM',
  490. 'en_KE',
  491. 'en_KI',
  492. 'en_KN',
  493. 'en_KY',
  494. 'en_LC',
  495. 'en_LR',
  496. 'en_LS',
  497. 'en_MG',
  498. 'en_MH',
  499. 'en_MO',
  500. 'en_MP',
  501. 'en_MS',
  502. 'en_MT',
  503. 'en_MU',
  504. 'en_MW',
  505. 'en_MY',
  506. 'en_NA',
  507. 'en_NF',
  508. 'en_NG',
  509. 'en_NL',
  510. 'en_NR',
  511. 'en_NU',
  512. 'en_NZ',
  513. 'en_PG',
  514. 'en_PH',
  515. 'en_PK',
  516. 'en_PN',
  517. 'en_PR',
  518. 'en_PW',
  519. 'en_RW',
  520. 'en_SB',
  521. 'en_SC',
  522. 'en_SD',
  523. 'en_SE',
  524. 'en_SG',
  525. 'en_SH',
  526. 'en_SI',
  527. 'en_SL',
  528. 'en_SS',
  529. 'en_SX',
  530. 'en_SZ',
  531. 'en_TC',
  532. 'en_TK',
  533. 'en_TO',
  534. 'en_TT',
  535. 'en_TV',
  536. 'en_TZ',
  537. 'en_UG',
  538. 'en_UM',
  539. 'en_US',
  540. 'en_US_Posix',
  541. 'en_VC',
  542. 'en_VG',
  543. 'en_VI',
  544. 'en_VU',
  545. 'en_WS',
  546. 'en_ZA',
  547. 'en_ZM',
  548. 'en_ZW',
  549. 'eo',
  550. 'es',
  551. 'es_419',
  552. 'es_AR',
  553. 'es_BO',
  554. 'es_BR',
  555. 'es_BZ',
  556. 'es_CL',
  557. 'es_CO',
  558. 'es_CR',
  559. 'es_CU',
  560. 'es_DO',
  561. 'es_EA',
  562. 'es_EC',
  563. 'es_ES',
  564. 'es_GQ',
  565. 'es_GT',
  566. 'es_HN',
  567. 'es_IC',
  568. 'es_MX',
  569. 'es_NI',
  570. 'es_PA',
  571. 'es_PE',
  572. 'es_PH',
  573. 'es_PR',
  574. 'es_PY',
  575. 'es_SV',
  576. 'es_US',
  577. 'es_UY',
  578. 'es_VE',
  579. 'et',
  580. 'et_EE',
  581. 'ewo',
  582. 'ff',
  583. 'ff_CM',
  584. 'ff_GN',
  585. 'ff_MR',
  586. 'ff_SN',
  587. 'fil',
  588. 'fil_PH',
  589. 'fo',
  590. 'fo_DK',
  591. 'fo_FO',
  592. 'fr',
  593. 'fr_BE',
  594. 'fr_BF',
  595. 'fr_BI',
  596. 'fr_BJ',
  597. 'fr_BL',
  598. 'fr_CA',
  599. 'fr_CD',
  600. 'fr_CF',
  601. 'fr_CG',
  602. 'fr_CH',
  603. 'fr_CI',
  604. 'fr_CM',
  605. 'fr_DJ',
  606. 'fr_DZ',
  607. 'fr_FR',
  608. 'fr_GA',
  609. 'fr_GF',
  610. 'fr_GN',
  611. 'fr_GP',
  612. 'fr_GQ',
  613. 'fr_HT',
  614. 'fr_KM',
  615. 'fr_LU',
  616. 'fr_MA',
  617. 'fr_MC',
  618. 'fr_MF',
  619. 'fr_MG',
  620. 'fr_ML',
  621. 'fr_MQ',
  622. 'fr_MR',
  623. 'fr_MU',
  624. 'fr_NC',
  625. 'fr_NE',
  626. 'fr_PF',
  627. 'fr_PM',
  628. 'fr_RE',
  629. 'fr_RW',
  630. 'fr_SC',
  631. 'fr_SN',
  632. 'fr_SY',
  633. 'fr_TD',
  634. 'fr_TG',
  635. 'fr_TN',
  636. 'fr_VU',
  637. 'fr_WF',
  638. 'fr_YT',
  639. 'fy',
  640. 'fy_NL',
  641. 'ga',
  642. 'ga_IE',
  643. 'gd',
  644. 'gd_GB',
  645. 'gez',
  646. 'gez_ER',
  647. 'gez_ET',
  648. 'gl',
  649. 'gl_ES',
  650. 'guz',
  651. 'gv',
  652. 'gv_GB',
  653. 'ha',
  654. 'ha_GH',
  655. 'ha_NE',
  656. 'ha_NG',
  657. 'hak',
  658. 'hak_TW',
  659. 'haw',
  660. 'he',
  661. 'he_IL',
  662. 'hif',
  663. 'hif_FJ',
  664. 'hne',
  665. 'hne_IN',
  666. 'hr',
  667. 'hr_BA',
  668. 'hr_HR',
  669. 'hsb',
  670. 'hsb_DE',
  671. 'ht',
  672. 'ht_HT',
  673. 'hy',
  674. 'hy_AM',
  675. 'ia',
  676. 'ia_FR',
  677. 'id',
  678. 'id_ID',
  679. 'ig',
  680. 'ig_NG',
  681. 'ii',
  682. 'ik',
  683. 'ik_CA',
  684. 'in',
  685. 'it',
  686. 'it_CH',
  687. 'it_IT',
  688. 'it_SM',
  689. 'it_VA',
  690. 'iu',
  691. 'iu_CA',
  692. 'iw',
  693. 'ja',
  694. 'ja_JP',
  695. 'jgo',
  696. 'jmc',
  697. 'jv',
  698. 'kab',
  699. 'kab_DZ',
  700. 'kam',
  701. 'kde',
  702. 'kea',
  703. 'khq',
  704. 'ki',
  705. 'kk',
  706. 'kk_KZ',
  707. 'kkj',
  708. 'kl',
  709. 'kl_GL',
  710. 'kln',
  711. 'km',
  712. 'km_KH',
  713. 'kok',
  714. 'kok_IN',
  715. 'ks',
  716. 'ks_IN',
  717. 'ks_IN@devanagari',
  718. 'ksb',
  719. 'ksf',
  720. 'ksh',
  721. 'kw',
  722. 'kw_GB',
  723. 'ky',
  724. 'ky_KG',
  725. 'lag',
  726. 'lg',
  727. 'lg_UG',
  728. 'li',
  729. 'li_NL',
  730. 'lij',
  731. 'lij_IT',
  732. 'lkt',
  733. 'ln',
  734. 'ln_AO',
  735. 'ln_CD',
  736. 'ln_CF',
  737. 'ln_CG',
  738. 'lo',
  739. 'lo_LA',
  740. 'lrc',
  741. 'lrc_IQ',
  742. 'lt',
  743. 'lt_LT',
  744. 'lu',
  745. 'luo',
  746. 'luy',
  747. 'lzh',
  748. 'lzh_TW',
  749. 'mag',
  750. 'mag_IN',
  751. 'mai',
  752. 'mai_IN',
  753. 'mas',
  754. 'mas_TZ',
  755. 'mer',
  756. 'mfe',
  757. 'mfe_MU',
  758. 'mg',
  759. 'mg_MG',
  760. 'mgh',
  761. 'mgo',
  762. 'mhr',
  763. 'mhr_RU',
  764. 'mi',
  765. 'mi_NZ',
  766. 'miq',
  767. 'miq_NI',
  768. 'mjw',
  769. 'mjw_IN',
  770. 'mk',
  771. 'mk_MK',
  772. 'mni',
  773. 'mni_IN',
  774. 'mo',
  775. 'ms',
  776. 'ms_BN',
  777. 'ms_MY',
  778. 'ms_SG',
  779. 'mt',
  780. 'mt_MT',
  781. 'mua',
  782. 'mzn',
  783. 'nan',
  784. 'nan_TW',
  785. 'nan_TW@latin',
  786. 'naq',
  787. 'nb',
  788. 'nb_NO',
  789. 'nb_SJ',
  790. 'nd',
  791. 'nds',
  792. 'nds_DE',
  793. 'nds_NL',
  794. 'ne_IN',
  795. 'nhn',
  796. 'nhn_MX',
  797. 'niu',
  798. 'niu_NU',
  799. 'nl',
  800. 'nl_AW',
  801. 'nl_BE',
  802. 'nl_BQ',
  803. 'nl_CW',
  804. 'nl_NL',
  805. 'nl_SR',
  806. 'nl_SX',
  807. 'nmg',
  808. 'nn',
  809. 'nn_NO',
  810. 'nnh',
  811. 'no',
  812. 'nr',
  813. 'nr_ZA',
  814. 'nso',
  815. 'nso_ZA',
  816. 'nus',
  817. 'nyn',
  818. 'oc',
  819. 'oc_FR',
  820. 'om',
  821. 'om_ET',
  822. 'om_KE',
  823. 'os',
  824. 'os_RU',
  825. 'pa_Arab',
  826. 'pa_Guru',
  827. 'pl',
  828. 'pl_PL',
  829. 'prg',
  830. 'pt',
  831. 'pt_AO',
  832. 'pt_BR',
  833. 'pt_CH',
  834. 'pt_CV',
  835. 'pt_GQ',
  836. 'pt_GW',
  837. 'pt_LU',
  838. 'pt_MO',
  839. 'pt_MZ',
  840. 'pt_PT',
  841. 'pt_ST',
  842. 'pt_TL',
  843. 'qu',
  844. 'qu_BO',
  845. 'qu_EC',
  846. 'quz',
  847. 'quz_PE',
  848. 'raj',
  849. 'raj_IN',
  850. 'rm',
  851. 'rn',
  852. 'ro',
  853. 'ro_MD',
  854. 'ro_RO',
  855. 'rof',
  856. 'ru',
  857. 'ru_BY',
  858. 'ru_KG',
  859. 'ru_KZ',
  860. 'ru_MD',
  861. 'ru_RU',
  862. 'ru_UA',
  863. 'rw',
  864. 'rw_RW',
  865. 'rwk',
  866. 'sa',
  867. 'sa_IN',
  868. 'sah',
  869. 'sah_RU',
  870. 'saq',
  871. 'sat',
  872. 'sat_IN',
  873. 'sbp',
  874. 'sd',
  875. 'sd_IN',
  876. 'sd_IN@devanagari',
  877. 'se',
  878. 'se_FI',
  879. 'se_NO',
  880. 'se_SE',
  881. 'seh',
  882. 'ses',
  883. 'sg',
  884. 'sgs',
  885. 'sgs_LT',
  886. 'shi',
  887. 'shi_Latn',
  888. 'shi_Tfng',
  889. 'shn',
  890. 'shn_MM',
  891. 'shs',
  892. 'shs_CA',
  893. 'sid',
  894. 'sid_ET',
  895. 'sl',
  896. 'sl_SI',
  897. 'sm',
  898. 'sm_WS',
  899. 'smn',
  900. 'sn',
  901. 'so',
  902. 'so_DJ',
  903. 'so_ET',
  904. 'so_KE',
  905. 'so_SO',
  906. 'sq',
  907. 'sq_AL',
  908. 'sq_MK',
  909. 'sq_XK',
  910. 'sr',
  911. 'sr_Cyrl',
  912. 'sr_Cyrl_BA',
  913. 'sr_Cyrl_ME',
  914. 'sr_Cyrl_XK',
  915. 'sr_Latn',
  916. 'sr_Latn_BA',
  917. 'sr_Latn_ME',
  918. 'sr_Latn_XK',
  919. 'sr_ME',
  920. 'sr_RS',
  921. 'sr_RS@latin',
  922. 'ss',
  923. 'ss_ZA',
  924. 'st',
  925. 'st_ZA',
  926. 'sv',
  927. 'sv_AX',
  928. 'sv_FI',
  929. 'sv_SE',
  930. 'sw',
  931. 'sw_CD',
  932. 'sw_KE',
  933. 'sw_TZ',
  934. 'sw_UG',
  935. 'szl',
  936. 'szl_PL',
  937. 'ta',
  938. 'ta_IN',
  939. 'ta_LK',
  940. 'tcy',
  941. 'tcy_IN',
  942. 'teo',
  943. 'teo_KE',
  944. 'tet',
  945. 'tg',
  946. 'tg_TJ',
  947. 'th',
  948. 'th_TH',
  949. 'the',
  950. 'the_NP',
  951. 'ti',
  952. 'ti_ER',
  953. 'ti_ET',
  954. 'tk',
  955. 'tk_TM',
  956. 'tlh',
  957. 'tn',
  958. 'tn_ZA',
  959. 'to',
  960. 'to_TO',
  961. 'tpi',
  962. 'tpi_PG',
  963. 'tr',
  964. 'tr_TR',
  965. 'ts',
  966. 'ts_ZA',
  967. 'tt_RU@iqtelif',
  968. 'twq',
  969. 'tzl',
  970. 'tzm',
  971. 'tzm_Latn',
  972. 'ug',
  973. 'ug_CN',
  974. 'uk',
  975. 'uk_UA',
  976. 'unm',
  977. 'unm_US',
  978. 'ur',
  979. 'ur_IN',
  980. 'ur_PK',
  981. 'uz_Arab',
  982. 'vai',
  983. 'vai_Vaii',
  984. 've',
  985. 've_ZA',
  986. 'vi',
  987. 'vi_VN',
  988. 'vo',
  989. 'vun',
  990. 'wa',
  991. 'wa_BE',
  992. 'wae',
  993. 'wae_CH',
  994. 'wal',
  995. 'wal_ET',
  996. 'xh',
  997. 'xh_ZA',
  998. 'xog',
  999. 'yav',
  1000. 'yi',
  1001. 'yi_US',
  1002. 'yo',
  1003. 'yo_BJ',
  1004. 'yo_NG',
  1005. 'yue',
  1006. 'yue_HK',
  1007. 'yue_Hans',
  1008. 'yue_Hant',
  1009. 'yuw',
  1010. 'yuw_PG',
  1011. 'zh',
  1012. 'zh_CN',
  1013. 'zh_HK',
  1014. 'zh_Hans',
  1015. 'zh_Hans_HK',
  1016. 'zh_Hans_MO',
  1017. 'zh_Hans_SG',
  1018. 'zh_Hant',
  1019. 'zh_Hant_HK',
  1020. 'zh_Hant_MO',
  1021. 'zh_Hant_TW',
  1022. 'zh_MO',
  1023. 'zh_SG',
  1024. 'zh_TW',
  1025. 'zh_YUE',
  1026. 'zu',
  1027. 'zu_ZA',
  1028. ];
  1029. return array_combine(
  1030. $locales,
  1031. array_map(
  1032. static function (string $locale) {
  1033. return [$locale];
  1034. },
  1035. $locales
  1036. )
  1037. );
  1038. }
  1039. }