LanguageCode.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. <?php
  2. /*
  3. * Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
  4. * SPDX-License-Identifier: MIT
  5. */
  6. declare(strict_types=1);
  7. namespace Respect\Validation\Rules;
  8. use Respect\Validation\Exceptions\ComponentException;
  9. use function array_column;
  10. use function array_filter;
  11. use function array_search;
  12. use function sprintf;
  13. /**
  14. * Validates whether the input is language code based on ISO 639.
  15. *
  16. * @author Danilo Benevides <danilobenevides01@gmail.com>
  17. * @author Emmerson Siqueira <emmersonsiqueira@gmail.com>
  18. * @author Henrique Moody <henriquemoody@gmail.com>
  19. */
  20. final class LanguageCode extends AbstractEnvelope
  21. {
  22. public const ALPHA2 = 'alpha-2';
  23. public const ALPHA3 = 'alpha-3';
  24. public const AVAILABLE_SETS = [self::ALPHA2, self::ALPHA3];
  25. /**
  26. * @see http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt
  27. */
  28. public const LANGUAGE_CODES = [
  29. // phpcs:disable Squiz.PHP.CommentedOutCode.Found
  30. ['aa', 'aar'], // Afar
  31. ['ab', 'abk'], // Abkhazian
  32. ['', 'ace'], // Achinese
  33. ['', 'ach'], // Acoli
  34. ['', 'ada'], // Adangme
  35. ['', 'ady'], // Adyghe; Adygei
  36. ['', 'afa'], // Afro-Asiatic languages
  37. ['', 'afh'], // Afrihili
  38. ['af', 'afr'], // Afrikaans
  39. ['', 'ain'], // Ainu
  40. ['ak', 'aka'], // Akan
  41. ['', 'akk'], // Akkadian
  42. ['sq', 'alb'], // Albanian
  43. ['', 'ale'], // Aleut
  44. ['', 'alg'], // Algonquian languages
  45. ['', 'alt'], // Southern Altai
  46. ['am', 'amh'], // Amharic
  47. ['', 'ang'], // English, Old (ca.450-1100)
  48. ['', 'anp'], // Angika
  49. ['', 'apa'], // Apache languages
  50. ['ar', 'ara'], // Arabic
  51. ['', 'arc'], // Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)
  52. ['an', 'arg'], // Aragonese
  53. ['hy', 'arm'], // Armenian
  54. ['', 'arn'], // Mapudungun; Mapuche
  55. ['', 'arp'], // Arapaho
  56. ['', 'art'], // Artificial languages
  57. ['', 'arw'], // Arawak
  58. ['as', 'asm'], // Assamese
  59. ['', 'ast'], // Asturian; Bable; Leonese; Asturleonese
  60. ['', 'ath'], // Athapascan languages
  61. ['', 'aus'], // Australian languages
  62. ['av', 'ava'], // Avaric
  63. ['ae', 'ave'], // Avestan
  64. ['', 'awa'], // Awadhi
  65. ['ay', 'aym'], // Aymara
  66. ['az', 'aze'], // Azerbaijani
  67. ['', 'bad'], // Banda languages
  68. ['', 'bai'], // Bamileke languages
  69. ['ba', 'bak'], // Bashkir
  70. ['', 'bal'], // Baluchi
  71. ['bm', 'bam'], // Bambara
  72. ['', 'ban'], // Balinese
  73. ['eu', 'baq'], // Basque
  74. ['', 'bas'], // Basa
  75. ['', 'bat'], // Baltic languages
  76. ['', 'bej'], // Beja; Bedawiyet
  77. ['be', 'bel'], // Belarusian
  78. ['', 'bem'], // Bemba
  79. ['bn', 'ben'], // Bengali
  80. ['', 'ber'], // Berber languages
  81. ['', 'bho'], // Bhojpuri
  82. ['bh', 'bih'], // Bihari languages
  83. ['', 'bik'], // Bikol
  84. ['', 'bin'], // Bini; Edo
  85. ['bi', 'bis'], // Bislama
  86. ['', 'bla'], // Siksika
  87. ['', 'bnt'], // Bantu languages
  88. ['bs', 'bos'], // Bosnian
  89. ['', 'bra'], // Braj
  90. ['br', 'bre'], // Breton
  91. ['', 'btk'], // Batak languages
  92. ['', 'bua'], // Buriat
  93. ['', 'bug'], // Buginese
  94. ['bg', 'bul'], // Bulgarian
  95. ['my', 'bur'], // Burmese
  96. ['', 'byn'], // Blin; Bilin
  97. ['', 'cad'], // Caddo
  98. ['', 'cai'], // Central American Indian languages
  99. ['', 'car'], // Galibi Carib
  100. ['ca', 'cat'], // Catalan; Valencian
  101. ['', 'cau'], // Caucasian languages
  102. ['', 'ceb'], // Cebuano
  103. ['', 'cel'], // Celtic languages
  104. ['ch', 'cha'], // Chamorro
  105. ['', 'chb'], // Chibcha
  106. ['ce', 'che'], // Chechen
  107. ['', 'chg'], // Chagatai
  108. ['zh', 'chi'], // Chinese
  109. ['', 'chk'], // Chuukese
  110. ['', 'chm'], // Mari
  111. ['', 'chn'], // Chinook jargon
  112. ['', 'cho'], // Choctaw
  113. ['', 'chp'], // Chipewyan; Dene Suline
  114. ['', 'chr'], // Cherokee
  115. ['cu', 'chu'], // Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic
  116. ['cv', 'chv'], // Chuvash
  117. ['', 'chy'], // Cheyenne
  118. ['', 'cmc'], // Chamic languages
  119. ['', 'cnr'], // Montenegrin
  120. ['', 'cop'], // Coptic
  121. ['kw', 'cor'], // Cornish
  122. ['co', 'cos'], // Corsican
  123. ['', 'cpe'], // Creoles and pidgins, English based
  124. ['', 'cpf'], // Creoles and pidgins, French-based
  125. ['', 'cpp'], // Creoles and pidgins, Portuguese-based
  126. ['cr', 'cre'], // Cree
  127. ['', 'crh'], // Crimean Tatar; Crimean Turkish
  128. ['', 'crp'], // Creoles and pidgins
  129. ['', 'csb'], // Kashubian
  130. ['', 'cus'], // Cushitic languages
  131. ['cs', 'cze'], // Czech
  132. ['', 'dak'], // Dakota
  133. ['da', 'dan'], // Danish
  134. ['', 'dar'], // Dargwa
  135. ['', 'day'], // Land Dayak languages
  136. ['', 'del'], // Delaware
  137. ['', 'den'], // Slave (Athapascan)
  138. ['', 'dgr'], // Dogrib
  139. ['', 'din'], // Dinka
  140. ['dv', 'div'], // Divehi; Dhivehi; Maldivian
  141. ['', 'doi'], // Dogri
  142. ['', 'dra'], // Dravidian languages
  143. ['', 'dsb'], // Lower Sorbian
  144. ['', 'dua'], // Duala
  145. ['', 'dum'], // Dutch, Middle (ca.1050-1350)
  146. ['nl', 'dut'], // Dutch; Flemish
  147. ['', 'dyu'], // Dyula
  148. ['dz', 'dzo'], // Dzongkha
  149. ['', 'efi'], // Efik
  150. ['', 'egy'], // Egyptian (Ancient)
  151. ['', 'eka'], // Ekajuk
  152. ['', 'elx'], // Elamite
  153. ['en', 'eng'], // English
  154. ['', 'enm'], // English, Middle (1100-1500)
  155. ['eo', 'epo'], // Esperanto
  156. ['et', 'est'], // Estonian
  157. ['ee', 'ewe'], // Ewe
  158. ['', 'ewo'], // Ewondo
  159. ['', 'fan'], // Fang
  160. ['fo', 'fao'], // Faroese
  161. ['', 'fat'], // Fanti
  162. ['fj', 'fij'], // Fijian
  163. ['', 'fil'], // Filipino; Pilipino
  164. ['fi', 'fin'], // Finnish
  165. ['', 'fiu'], // Finno-Ugrian languages
  166. ['', 'fon'], // Fon
  167. ['fr', 'fre'], // French
  168. ['', 'frm'], // French, Middle (ca.1400-1600)
  169. ['', 'fro'], // French, Old (842-ca.1400)
  170. ['', 'frr'], // Northern Frisian
  171. ['', 'frs'], // Eastern Frisian
  172. ['fy', 'fry'], // Western Frisian
  173. ['ff', 'ful'], // Fulah
  174. ['', 'fur'], // Friulian
  175. ['', 'gaa'], // Ga
  176. ['', 'gay'], // Gayo
  177. ['', 'gba'], // Gbaya
  178. ['', 'gem'], // Germanic languages
  179. ['ka', 'geo'], // Georgian
  180. ['de', 'ger'], // German
  181. ['', 'gez'], // Geez
  182. ['', 'gil'], // Gilbertese
  183. ['gd', 'gla'], // Gaelic; Scottish Gaelic
  184. ['ga', 'gle'], // Irish
  185. ['gl', 'glg'], // Galician
  186. ['gv', 'glv'], // Manx
  187. ['', 'gmh'], // German, Middle High (ca.1050-1500)
  188. ['', 'goh'], // German, Old High (ca.750-1050)
  189. ['', 'gon'], // Gondi
  190. ['', 'gor'], // Gorontalo
  191. ['', 'got'], // Gothic
  192. ['', 'grb'], // Grebo
  193. ['', 'grc'], // Greek, Ancient (to 1453)
  194. ['el', 'gre'], // Greek, Modern (1453-)
  195. ['gn', 'grn'], // Guarani
  196. ['', 'gsw'], // Swiss German; Alemannic; Alsatian
  197. ['gu', 'guj'], // Gujarati
  198. ['', 'gwi'], // Gwich'in
  199. ['', 'hai'], // Haida
  200. ['ht', 'hat'], // Haitian; Haitian Creole
  201. ['ha', 'hau'], // Hausa
  202. ['', 'haw'], // Hawaiian
  203. ['he', 'heb'], // Hebrew
  204. ['hz', 'her'], // Herero
  205. ['', 'hil'], // Hiligaynon
  206. ['', 'him'], // Himachali languages; Western Pahari languages
  207. ['hi', 'hin'], // Hindi
  208. ['', 'hit'], // Hittite
  209. ['', 'hmn'], // Hmong; Mong
  210. ['ho', 'hmo'], // Hiri Motu
  211. ['hr', 'hrv'], // Croatian
  212. ['', 'hsb'], // Upper Sorbian
  213. ['hu', 'hun'], // Hungarian
  214. ['', 'hup'], // Hupa
  215. ['', 'iba'], // Iban
  216. ['ig', 'ibo'], // Igbo
  217. ['is', 'ice'], // Icelandic
  218. ['io', 'ido'], // Ido
  219. ['ii', 'iii'], // Sichuan Yi; Nuosu
  220. ['', 'ijo'], // Ijo languages
  221. ['iu', 'iku'], // Inuktitut
  222. ['ie', 'ile'], // Interlingue; Occidental
  223. ['', 'ilo'], // Iloko
  224. ['ia', 'ina'], // Interlingua (International Auxiliary Language Association)
  225. ['', 'inc'], // Indic languages
  226. ['id', 'ind'], // Indonesian
  227. ['', 'ine'], // Indo-European languages
  228. ['', 'inh'], // Ingush
  229. ['ik', 'ipk'], // Inupiaq
  230. ['', 'ira'], // Iranian languages
  231. ['', 'iro'], // Iroquoian languages
  232. ['it', 'ita'], // Italian
  233. ['jv', 'jav'], // Javanese
  234. ['', 'jbo'], // Lojban
  235. ['ja', 'jpn'], // Japanese
  236. ['', 'jpr'], // Judeo-Persian
  237. ['', 'jrb'], // Judeo-Arabic
  238. ['', 'kaa'], // Kara-Kalpak
  239. ['', 'kab'], // Kabyle
  240. ['', 'kac'], // Kachin; Jingpho
  241. ['kl', 'kal'], // Kalaallisut; Greenlandic
  242. ['', 'kam'], // Kamba
  243. ['kn', 'kan'], // Kannada
  244. ['', 'kar'], // Karen languages
  245. ['ks', 'kas'], // Kashmiri
  246. ['kr', 'kau'], // Kanuri
  247. ['', 'kaw'], // Kawi
  248. ['kk', 'kaz'], // Kazakh
  249. ['', 'kbd'], // Kabardian
  250. ['', 'kha'], // Khasi
  251. ['', 'khi'], // Khoisan languages
  252. ['km', 'khm'], // Central Khmer
  253. ['', 'kho'], // Khotanese; Sakan
  254. ['ki', 'kik'], // Kikuyu; Gikuyu
  255. ['rw', 'kin'], // Kinyarwanda
  256. ['ky', 'kir'], // Kirghiz; Kyrgyz
  257. ['', 'kmb'], // Kimbundu
  258. ['', 'kok'], // Konkani
  259. ['kv', 'kom'], // Komi
  260. ['kg', 'kon'], // Kongo
  261. ['ko', 'kor'], // Korean
  262. ['', 'kos'], // Kosraean
  263. ['', 'kpe'], // Kpelle
  264. ['', 'krc'], // Karachay-Balkar
  265. ['', 'krl'], // Karelian
  266. ['', 'kro'], // Kru languages
  267. ['', 'kru'], // Kurukh
  268. ['kj', 'kua'], // Kuanyama; Kwanyama
  269. ['', 'kum'], // Kumyk
  270. ['ku', 'kur'], // Kurdish
  271. ['', 'kut'], // Kutenai
  272. ['', 'lad'], // Ladino
  273. ['', 'lah'], // Lahnda
  274. ['', 'lam'], // Lamba
  275. ['lo', 'lao'], // Lao
  276. ['la', 'lat'], // Latin
  277. ['lv', 'lav'], // Latvian
  278. ['', 'lez'], // Lezghian
  279. ['li', 'lim'], // Limburgan; Limburger; Limburgish
  280. ['ln', 'lin'], // Lingala
  281. ['lt', 'lit'], // Lithuanian
  282. ['', 'lol'], // Mongo
  283. ['', 'loz'], // Lozi
  284. ['lb', 'ltz'], // Luxembourgish; Letzeburgesch
  285. ['', 'lua'], // Luba-Lulua
  286. ['lu', 'lub'], // Luba-Katanga
  287. ['lg', 'lug'], // Ganda
  288. ['', 'lui'], // Luiseno
  289. ['', 'lun'], // Lunda
  290. ['', 'luo'], // Luo (Kenya and Tanzania)
  291. ['', 'lus'], // Lushai
  292. ['mk', 'mac'], // Macedonian
  293. ['', 'mad'], // Madurese
  294. ['', 'mag'], // Magahi
  295. ['mh', 'mah'], // Marshallese
  296. ['', 'mai'], // Maithili
  297. ['', 'mak'], // Makasar
  298. ['ml', 'mal'], // Malayalam
  299. ['', 'man'], // Mandingo
  300. ['mi', 'mao'], // Maori
  301. ['', 'map'], // Austronesian languages
  302. ['mr', 'mar'], // Marathi
  303. ['', 'mas'], // Masai
  304. ['ms', 'may'], // Malay
  305. ['', 'mdf'], // Moksha
  306. ['', 'mdr'], // Mandar
  307. ['', 'men'], // Mende
  308. ['', 'mga'], // Irish, Middle (900-1200)
  309. ['', 'mic'], // Mi'kmaq; Micmac
  310. ['', 'min'], // Minangkabau
  311. ['', 'mis'], // Uncoded languages
  312. ['', 'mkh'], // Mon-Khmer languages
  313. ['mg', 'mlg'], // Malagasy
  314. ['mt', 'mlt'], // Maltese
  315. ['', 'mnc'], // Manchu
  316. ['', 'mni'], // Manipuri
  317. ['', 'mno'], // Manobo languages
  318. ['', 'moh'], // Mohawk
  319. ['mn', 'mon'], // Mongolian
  320. ['', 'mos'], // Mossi
  321. ['', 'mul'], // Multiple languages
  322. ['', 'mun'], // Munda languages
  323. ['', 'mus'], // Creek
  324. ['', 'mwl'], // Mirandese
  325. ['', 'mwr'], // Marwari
  326. ['', 'myn'], // Mayan languages
  327. ['', 'myv'], // Erzya
  328. ['', 'nah'], // Nahuatl languages
  329. ['', 'nai'], // North American Indian languages
  330. ['', 'nap'], // Neapolitan
  331. ['na', 'nau'], // Nauru
  332. ['nv', 'nav'], // Navajo; Navaho
  333. ['nr', 'nbl'], // Ndebele, South; South Ndebele
  334. ['nd', 'nde'], // Ndebele, North; North Ndebele
  335. ['ng', 'ndo'], // Ndonga
  336. ['', 'nds'], // Low German; Low Saxon; German, Low; Saxon, Low
  337. ['ne', 'nep'], // Nepali
  338. ['', 'new'], // Nepal Bhasa; Newari
  339. ['', 'nia'], // Nias
  340. ['', 'nic'], // Niger-Kordofanian languages
  341. ['', 'niu'], // Niuean
  342. ['nn', 'nno'], // Norwegian Nynorsk; Nynorsk, Norwegian
  343. ['nb', 'nob'], // Bokmål, Norwegian; Norwegian Bokmål
  344. ['', 'nog'], // Nogai
  345. ['', 'non'], // Norse, Old
  346. ['no', 'nor'], // Norwegian
  347. ['', 'nqo'], // N'Ko
  348. ['', 'nso'], // Pedi; Sepedi; Northern Sotho
  349. ['', 'nub'], // Nubian languages
  350. ['', 'nwc'], // Classical Newari; Old Newari; Classical Nepal Bhasa
  351. ['ny', 'nya'], // Chichewa; Chewa; Nyanja
  352. ['', 'nym'], // Nyamwezi
  353. ['', 'nyn'], // Nyankole
  354. ['', 'nyo'], // Nyoro
  355. ['', 'nzi'], // Nzima
  356. ['oc', 'oci'], // Occitan (post 1500)
  357. ['oj', 'oji'], // Ojibwa
  358. ['or', 'ori'], // Oriya
  359. ['om', 'orm'], // Oromo
  360. ['', 'osa'], // Osage
  361. ['os', 'oss'], // Ossetian; Ossetic
  362. ['', 'ota'], // Turkish, Ottoman (1500-1928)
  363. ['', 'oto'], // Otomian languages
  364. ['', 'paa'], // Papuan languages
  365. ['', 'pag'], // Pangasinan
  366. ['', 'pal'], // Pahlavi
  367. ['', 'pam'], // Pampanga; Kapampangan
  368. ['pa', 'pan'], // Panjabi; Punjabi
  369. ['', 'pap'], // Papiamento
  370. ['', 'pau'], // Palauan
  371. ['', 'peo'], // Persian, Old (ca.600-400 B.C.)
  372. ['fa', 'per'], // Persian
  373. ['', 'phi'], // Philippine languages
  374. ['', 'phn'], // Phoenician
  375. ['pi', 'pli'], // Pali
  376. ['pl', 'pol'], // Polish
  377. ['', 'pon'], // Pohnpeian
  378. ['pt', 'por'], // Portuguese
  379. ['', 'pra'], // Prakrit languages
  380. ['', 'pro'], // Provençal, Old (to 1500); Occitan, Old (to 1500)
  381. ['ps', 'pus'], // Pushto; Pashto
  382. ['', 'qaaqtz'], // Reserved for local use
  383. ['qu', 'que'], // Quechua
  384. ['', 'raj'], // Rajasthani
  385. ['', 'rap'], // Rapanui
  386. ['', 'rar'], // Rarotongan; Cook Islands Maori
  387. ['', 'roa'], // Romance languages
  388. ['rm', 'roh'], // Romansh
  389. ['', 'rom'], // Romany
  390. ['ro', 'rum'], // Romanian; Moldavian; Moldovan
  391. ['rn', 'run'], // Rundi
  392. ['', 'rup'], // Aromanian; Arumanian; Macedo-Romanian
  393. ['ru', 'rus'], // Russian
  394. ['', 'sad'], // Sandawe
  395. ['sg', 'sag'], // Sango
  396. ['', 'sah'], // Yakut
  397. ['', 'sai'], // South American Indian languages
  398. ['', 'sal'], // Salishan languages
  399. ['', 'sam'], // Samaritan Aramaic
  400. ['sa', 'san'], // Sanskrit
  401. ['', 'sas'], // Sasak
  402. ['', 'sat'], // Santali
  403. ['', 'scn'], // Sicilian
  404. ['', 'sco'], // Scots
  405. ['', 'sel'], // Selkup
  406. ['', 'sem'], // Semitic languages
  407. ['', 'sga'], // Irish, Old (to 900)
  408. ['', 'sgn'], // Sign Languages
  409. ['', 'shn'], // Shan
  410. ['', 'sid'], // Sidamo
  411. ['si', 'sin'], // Sinhala; Sinhalese
  412. ['', 'sio'], // Siouan languages
  413. ['', 'sit'], // Sino-Tibetan languages
  414. ['', 'sla'], // Slavic languages
  415. ['sk', 'slo'], // Slovak
  416. ['sl', 'slv'], // Slovenian
  417. ['', 'sma'], // Southern Sami
  418. ['se', 'sme'], // Northern Sami
  419. ['', 'smi'], // Sami languages
  420. ['', 'smj'], // Lule Sami
  421. ['', 'smn'], // Inari Sami
  422. ['sm', 'smo'], // Samoan
  423. ['', 'sms'], // Skolt Sami
  424. ['sn', 'sna'], // Shona
  425. ['sd', 'snd'], // Sindhi
  426. ['', 'snk'], // Soninke
  427. ['', 'sog'], // Sogdian
  428. ['so', 'som'], // Somali
  429. ['', 'son'], // Songhai languages
  430. ['st', 'sot'], // Sotho, Southern
  431. ['es', 'spa'], // Spanish; Castilian
  432. ['sc', 'srd'], // Sardinian
  433. ['', 'srn'], // Sranan Tongo
  434. ['sr', 'srp'], // Serbian
  435. ['', 'srr'], // Serer
  436. ['', 'ssa'], // Nilo-Saharan languages
  437. ['ss', 'ssw'], // Swati
  438. ['', 'suk'], // Sukuma
  439. ['su', 'sun'], // Sundanese
  440. ['', 'sus'], // Susu
  441. ['', 'sux'], // Sumerian
  442. ['sw', 'swa'], // Swahili
  443. ['sv', 'swe'], // Swedish
  444. ['', 'syc'], // Classical Syriac
  445. ['', 'syr'], // Syriac
  446. ['ty', 'tah'], // Tahitian
  447. ['', 'tai'], // Tai languages
  448. ['ta', 'tam'], // Tamil
  449. ['tt', 'tat'], // Tatar
  450. ['te', 'tel'], // Telugu
  451. ['', 'tem'], // Timne
  452. ['', 'ter'], // Tereno
  453. ['', 'tet'], // Tetum
  454. ['tg', 'tgk'], // Tajik
  455. ['tl', 'tgl'], // Tagalog
  456. ['th', 'tha'], // Thai
  457. ['bo', 'tib'], // Tibetan
  458. ['', 'tig'], // Tigre
  459. ['ti', 'tir'], // Tigrinya
  460. ['', 'tiv'], // Tiv
  461. ['', 'tkl'], // Tokelau
  462. ['', 'tlh'], // Klingon; tlhIngan-Hol
  463. ['', 'tli'], // Tlingit
  464. ['', 'tmh'], // Tamashek
  465. ['', 'tog'], // Tonga (Nyasa)
  466. ['to', 'ton'], // Tonga (Tonga Islands)
  467. ['', 'tpi'], // Tok Pisin
  468. ['', 'tsi'], // Tsimshian
  469. ['tn', 'tsn'], // Tswana
  470. ['ts', 'tso'], // Tsonga
  471. ['tk', 'tuk'], // Turkmen
  472. ['', 'tum'], // Tumbuka
  473. ['', 'tup'], // Tupi languages
  474. ['tr', 'tur'], // Turkish
  475. ['', 'tut'], // Altaic languages
  476. ['', 'tvl'], // Tuvalu
  477. ['tw', 'twi'], // Twi
  478. ['', 'tyv'], // Tuvinian
  479. ['', 'udm'], // Udmurt
  480. ['', 'uga'], // Ugaritic
  481. ['ug', 'uig'], // Uighur; Uyghur
  482. ['uk', 'ukr'], // Ukrainian
  483. ['', 'umb'], // Umbundu
  484. ['', 'und'], // Undetermined
  485. ['ur', 'urd'], // Urdu
  486. ['uz', 'uzb'], // Uzbek
  487. ['', 'vai'], // Vai
  488. ['ve', 'ven'], // Venda
  489. ['vi', 'vie'], // Vietnamese
  490. ['vo', 'vol'], // Volapük
  491. ['', 'vot'], // Votic
  492. ['', 'wak'], // Wakashan languages
  493. ['', 'wal'], // Wolaitta; Wolaytta
  494. ['', 'war'], // Waray
  495. ['', 'was'], // Washo
  496. ['cy', 'wel'], // Welsh
  497. ['', 'wen'], // Sorbian languages
  498. ['wa', 'wln'], // Walloon
  499. ['wo', 'wol'], // Wolof
  500. ['', 'xal'], // Kalmyk; Oirat
  501. ['xh', 'xho'], // Xhosa
  502. ['', 'yao'], // Yao
  503. ['', 'yap'], // Yapese
  504. ['yi', 'yid'], // Yiddish
  505. ['yo', 'yor'], // Yoruba
  506. ['', 'ypk'], // Yupik languages
  507. ['', 'zap'], // Zapotec
  508. ['', 'zbl'], // Blissymbols; Blissymbolics; Bliss
  509. ['', 'zen'], // Zenaga
  510. ['', 'zgh'], // Standard Moroccan Tamazight
  511. ['za', 'zha'], // Zhuang; Chuang
  512. ['', 'znd'], // Zande languages
  513. ['zu', 'zul'], // Zulu
  514. ['', 'zun'], // Zuni
  515. ['', 'zxx'], // No linguistic content; Not applicable
  516. // phpcs:enable Squiz.PHP.CommentedOutCode.Found
  517. ];
  518. /**
  519. * Initializes the rule defining the ISO 639 set.
  520. *
  521. * @throws ComponentException
  522. */
  523. public function __construct(string $set = self::ALPHA2)
  524. {
  525. $index = array_search($set, self::AVAILABLE_SETS, true);
  526. if ($index === false) {
  527. throw new ComponentException(sprintf('"%s" is not a valid language set for ISO 639', $set));
  528. }
  529. parent::__construct(new In($this->getHaystack($index), true), ['set' => $set]);
  530. }
  531. /**
  532. * @return string[]
  533. */
  534. private function getHaystack(int $index): array
  535. {
  536. return array_filter(array_column(self::LANGUAGE_CODES, $index));
  537. }
  538. }