From 5450ef86a862c5316c39504ca8afaf9c10ab91a3 Mon Sep 17 00:00:00 2001 From: Henrique Moody Date: Sat, 6 Feb 2021 14:25:14 +0100 Subject: [PATCH] Use "sokil/php-isocodes" on LanguageCode Since we already have that library as a dependency of our repository, it makes sense to use it as a source of language codes instead of keeping a list of currencies ourselves. Signed-off-by: Henrique Moody --- .github/workflows/update-language-codes.yaml | 30 -- bin/update-language-codes | 29 - docs/rules/LanguageCode.md | 4 + library/Rules/LanguageCode.php | 528 +------------------ 4 files changed, 31 insertions(+), 560 deletions(-) delete mode 100644 .github/workflows/update-language-codes.yaml delete mode 100755 bin/update-language-codes diff --git a/.github/workflows/update-language-codes.yaml b/.github/workflows/update-language-codes.yaml deleted file mode 100644 index d89d776d..00000000 --- a/.github/workflows/update-language-codes.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: Update language codes - -on: - schedule: - - cron: '0 0 * * 0' - -jobs: - update-language-codes: - name: Update language codes - - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: ${{ secrets.LAST_MINOR_VERSION }} - - - name: Execute script - run: bin/update-language-codes - - - name: Create pull request - uses: peter-evans/create-pull-request@v2 - with: - committer: The Respect Panda - author: The Respect Panda - commit-message: Update list of language codes - title: Update list of language codes - base: ${{ secrets.LAST_MINOR_VERSION }} - branch: "workflows/update-language-codes" diff --git a/bin/update-language-codes b/bin/update-language-codes deleted file mode 100755 index b7bc1e33..00000000 --- a/bin/update-language-codes +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash -# Usage: {script} -# Update list of language codes (ISO-639-2) - -set -euo pipefail - -declare -r LIST_URL="http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt" -declare -r LIST_FILENAME=$(mktemp) - -declare -r RULE_FILENAME=$(dirname "${BASH_SOURCE}")/../library/Rules/LanguageCode.php -declare -r RULE_FILENAME_TEMPORARY=$(mktemp) - -echo "- Downloading list from" -curl --silent --location "${LIST_URL}" --output "${LIST_FILENAME}" - - -echo "- Creating temporary file" -{ - sed --silent '/^ "${RULE_FILENAME_TEMPORARY}" - -echo "- Updating content of '$(basename ${RULE_FILENAME})'" -mv "${RULE_FILENAME_TEMPORARY}" "${RULE_FILENAME}" diff --git a/docs/rules/LanguageCode.md b/docs/rules/LanguageCode.md index 557a52c1..e6c36a75 100644 --- a/docs/rules/LanguageCode.md +++ b/docs/rules/LanguageCode.md @@ -15,6 +15,8 @@ v::languageCode('alpha-3')->validate('eng'); // true You can choose between `alpha-2` and `alpha-3`; `alpha-2` is set by default set. +This rule uses data from [sokil/php-isocodes][]. + ## Categorization - ISO codes @@ -30,3 +32,5 @@ Version | Description See also: - [CountryCode](CountryCode.md) + +[sokil/php-isocodes]: https://github.com/sokil/php-isocodes diff --git a/library/Rules/LanguageCode.php b/library/Rules/LanguageCode.php index 31f8880d..0838c715 100644 --- a/library/Rules/LanguageCode.php +++ b/library/Rules/LanguageCode.php @@ -14,10 +14,11 @@ declare(strict_types=1); namespace Respect\Validation\Rules; use Respect\Validation\Exceptions\ComponentException; +use Sokil\IsoCodes\IsoCodesFactory; +use Sokil\IsoCodes\TranslationDriver\DummyDriver; -use function array_column; -use function array_filter; -use function array_search; +use function in_array; +use function is_string; use function sprintf; /** @@ -27,7 +28,7 @@ use function sprintf; * @author Emmerson Siqueira * @author Henrique Moody */ -final class LanguageCode extends AbstractEnvelope +final class LanguageCode extends AbstractRule { public const ALPHA2 = 'alpha-2'; public const ALPHA3 = 'alpha-3'; @@ -35,498 +36,14 @@ final class LanguageCode extends AbstractEnvelope public const AVAILABLE_SETS = [self::ALPHA2, self::ALPHA3]; /** - * @see http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt + * @var string */ - public const LANGUAGE_CODES = [ - // phpcs:disable Squiz.PHP.CommentedOutCode.Found - ['aa', 'aar'], // Afar - ['ab', 'abk'], // Abkhazian - ['', 'ace'], // Achinese - ['', 'ach'], // Acoli - ['', 'ada'], // Adangme - ['', 'ady'], // Adyghe; Adygei - ['', 'afa'], // Afro-Asiatic languages - ['', 'afh'], // Afrihili - ['af', 'afr'], // Afrikaans - ['', 'ain'], // Ainu - ['ak', 'aka'], // Akan - ['', 'akk'], // Akkadian - ['sq', 'alb'], // Albanian - ['', 'ale'], // Aleut - ['', 'alg'], // Algonquian languages - ['', 'alt'], // Southern Altai - ['am', 'amh'], // Amharic - ['', 'ang'], // English, Old (ca.450-1100) - ['', 'anp'], // Angika - ['', 'apa'], // Apache languages - ['ar', 'ara'], // Arabic - ['', 'arc'], // Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE) - ['an', 'arg'], // Aragonese - ['hy', 'arm'], // Armenian - ['', 'arn'], // Mapudungun; Mapuche - ['', 'arp'], // Arapaho - ['', 'art'], // Artificial languages - ['', 'arw'], // Arawak - ['as', 'asm'], // Assamese - ['', 'ast'], // Asturian; Bable; Leonese; Asturleonese - ['', 'ath'], // Athapascan languages - ['', 'aus'], // Australian languages - ['av', 'ava'], // Avaric - ['ae', 'ave'], // Avestan - ['', 'awa'], // Awadhi - ['ay', 'aym'], // Aymara - ['az', 'aze'], // Azerbaijani - ['', 'bad'], // Banda languages - ['', 'bai'], // Bamileke languages - ['ba', 'bak'], // Bashkir - ['', 'bal'], // Baluchi - ['bm', 'bam'], // Bambara - ['', 'ban'], // Balinese - ['eu', 'baq'], // Basque - ['', 'bas'], // Basa - ['', 'bat'], // Baltic languages - ['', 'bej'], // Beja; Bedawiyet - ['be', 'bel'], // Belarusian - ['', 'bem'], // Bemba - ['bn', 'ben'], // Bengali - ['', 'ber'], // Berber languages - ['', 'bho'], // Bhojpuri - ['bh', 'bih'], // Bihari languages - ['', 'bik'], // Bikol - ['', 'bin'], // Bini; Edo - ['bi', 'bis'], // Bislama - ['', 'bla'], // Siksika - ['', 'bnt'], // Bantu languages - ['bs', 'bos'], // Bosnian - ['', 'bra'], // Braj - ['br', 'bre'], // Breton - ['', 'btk'], // Batak languages - ['', 'bua'], // Buriat - ['', 'bug'], // Buginese - ['bg', 'bul'], // Bulgarian - ['my', 'bur'], // Burmese - ['', 'byn'], // Blin; Bilin - ['', 'cad'], // Caddo - ['', 'cai'], // Central American Indian languages - ['', 'car'], // Galibi Carib - ['ca', 'cat'], // Catalan; Valencian - ['', 'cau'], // Caucasian languages - ['', 'ceb'], // Cebuano - ['', 'cel'], // Celtic languages - ['ch', 'cha'], // Chamorro - ['', 'chb'], // Chibcha - ['ce', 'che'], // Chechen - ['', 'chg'], // Chagatai - ['zh', 'chi'], // Chinese - ['', 'chk'], // Chuukese - ['', 'chm'], // Mari - ['', 'chn'], // Chinook jargon - ['', 'cho'], // Choctaw - ['', 'chp'], // Chipewyan; Dene Suline - ['', 'chr'], // Cherokee - ['cu', 'chu'], // Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic - ['cv', 'chv'], // Chuvash - ['', 'chy'], // Cheyenne - ['', 'cmc'], // Chamic languages - ['', 'cnr'], // Montenegrin - ['', 'cop'], // Coptic - ['kw', 'cor'], // Cornish - ['co', 'cos'], // Corsican - ['', 'cpe'], // Creoles and pidgins, English based - ['', 'cpf'], // Creoles and pidgins, French-based - ['', 'cpp'], // Creoles and pidgins, Portuguese-based - ['cr', 'cre'], // Cree - ['', 'crh'], // Crimean Tatar; Crimean Turkish - ['', 'crp'], // Creoles and pidgins - ['', 'csb'], // Kashubian - ['', 'cus'], // Cushitic languages - ['cs', 'cze'], // Czech - ['', 'dak'], // Dakota - ['da', 'dan'], // Danish - ['', 'dar'], // Dargwa - ['', 'day'], // Land Dayak languages - ['', 'del'], // Delaware - ['', 'den'], // Slave (Athapascan) - ['', 'dgr'], // Dogrib - ['', 'din'], // Dinka - ['dv', 'div'], // Divehi; Dhivehi; Maldivian - ['', 'doi'], // Dogri - ['', 'dra'], // Dravidian languages - ['', 'dsb'], // Lower Sorbian - ['', 'dua'], // Duala - ['', 'dum'], // Dutch, Middle (ca.1050-1350) - ['nl', 'dut'], // Dutch; Flemish - ['', 'dyu'], // Dyula - ['dz', 'dzo'], // Dzongkha - ['', 'efi'], // Efik - ['', 'egy'], // Egyptian (Ancient) - ['', 'eka'], // Ekajuk - ['', 'elx'], // Elamite - ['en', 'eng'], // English - ['', 'enm'], // English, Middle (1100-1500) - ['eo', 'epo'], // Esperanto - ['et', 'est'], // Estonian - ['ee', 'ewe'], // Ewe - ['', 'ewo'], // Ewondo - ['', 'fan'], // Fang - ['fo', 'fao'], // Faroese - ['', 'fat'], // Fanti - ['fj', 'fij'], // Fijian - ['', 'fil'], // Filipino; Pilipino - ['fi', 'fin'], // Finnish - ['', 'fiu'], // Finno-Ugrian languages - ['', 'fon'], // Fon - ['fr', 'fre'], // French - ['', 'frm'], // French, Middle (ca.1400-1600) - ['', 'fro'], // French, Old (842-ca.1400) - ['', 'frr'], // Northern Frisian - ['', 'frs'], // Eastern Frisian - ['fy', 'fry'], // Western Frisian - ['ff', 'ful'], // Fulah - ['', 'fur'], // Friulian - ['', 'gaa'], // Ga - ['', 'gay'], // Gayo - ['', 'gba'], // Gbaya - ['', 'gem'], // Germanic languages - ['ka', 'geo'], // Georgian - ['de', 'ger'], // German - ['', 'gez'], // Geez - ['', 'gil'], // Gilbertese - ['gd', 'gla'], // Gaelic; Scottish Gaelic - ['ga', 'gle'], // Irish - ['gl', 'glg'], // Galician - ['gv', 'glv'], // Manx - ['', 'gmh'], // German, Middle High (ca.1050-1500) - ['', 'goh'], // German, Old High (ca.750-1050) - ['', 'gon'], // Gondi - ['', 'gor'], // Gorontalo - ['', 'got'], // Gothic - ['', 'grb'], // Grebo - ['', 'grc'], // Greek, Ancient (to 1453) - ['el', 'gre'], // Greek, Modern (1453-) - ['gn', 'grn'], // Guarani - ['', 'gsw'], // Swiss German; Alemannic; Alsatian - ['gu', 'guj'], // Gujarati - ['', 'gwi'], // Gwich'in - ['', 'hai'], // Haida - ['ht', 'hat'], // Haitian; Haitian Creole - ['ha', 'hau'], // Hausa - ['', 'haw'], // Hawaiian - ['he', 'heb'], // Hebrew - ['hz', 'her'], // Herero - ['', 'hil'], // Hiligaynon - ['', 'him'], // Himachali languages; Western Pahari languages - ['hi', 'hin'], // Hindi - ['', 'hit'], // Hittite - ['', 'hmn'], // Hmong; Mong - ['ho', 'hmo'], // Hiri Motu - ['hr', 'hrv'], // Croatian - ['', 'hsb'], // Upper Sorbian - ['hu', 'hun'], // Hungarian - ['', 'hup'], // Hupa - ['', 'iba'], // Iban - ['ig', 'ibo'], // Igbo - ['is', 'ice'], // Icelandic - ['io', 'ido'], // Ido - ['ii', 'iii'], // Sichuan Yi; Nuosu - ['', 'ijo'], // Ijo languages - ['iu', 'iku'], // Inuktitut - ['ie', 'ile'], // Interlingue; Occidental - ['', 'ilo'], // Iloko - ['ia', 'ina'], // Interlingua (International Auxiliary Language Association) - ['', 'inc'], // Indic languages - ['id', 'ind'], // Indonesian - ['', 'ine'], // Indo-European languages - ['', 'inh'], // Ingush - ['ik', 'ipk'], // Inupiaq - ['', 'ira'], // Iranian languages - ['', 'iro'], // Iroquoian languages - ['it', 'ita'], // Italian - ['jv', 'jav'], // Javanese - ['', 'jbo'], // Lojban - ['ja', 'jpn'], // Japanese - ['', 'jpr'], // Judeo-Persian - ['', 'jrb'], // Judeo-Arabic - ['', 'kaa'], // Kara-Kalpak - ['', 'kab'], // Kabyle - ['', 'kac'], // Kachin; Jingpho - ['kl', 'kal'], // Kalaallisut; Greenlandic - ['', 'kam'], // Kamba - ['kn', 'kan'], // Kannada - ['', 'kar'], // Karen languages - ['ks', 'kas'], // Kashmiri - ['kr', 'kau'], // Kanuri - ['', 'kaw'], // Kawi - ['kk', 'kaz'], // Kazakh - ['', 'kbd'], // Kabardian - ['', 'kha'], // Khasi - ['', 'khi'], // Khoisan languages - ['km', 'khm'], // Central Khmer - ['', 'kho'], // Khotanese; Sakan - ['ki', 'kik'], // Kikuyu; Gikuyu - ['rw', 'kin'], // Kinyarwanda - ['ky', 'kir'], // Kirghiz; Kyrgyz - ['', 'kmb'], // Kimbundu - ['', 'kok'], // Konkani - ['kv', 'kom'], // Komi - ['kg', 'kon'], // Kongo - ['ko', 'kor'], // Korean - ['', 'kos'], // Kosraean - ['', 'kpe'], // Kpelle - ['', 'krc'], // Karachay-Balkar - ['', 'krl'], // Karelian - ['', 'kro'], // Kru languages - ['', 'kru'], // Kurukh - ['kj', 'kua'], // Kuanyama; Kwanyama - ['', 'kum'], // Kumyk - ['ku', 'kur'], // Kurdish - ['', 'kut'], // Kutenai - ['', 'lad'], // Ladino - ['', 'lah'], // Lahnda - ['', 'lam'], // Lamba - ['lo', 'lao'], // Lao - ['la', 'lat'], // Latin - ['lv', 'lav'], // Latvian - ['', 'lez'], // Lezghian - ['li', 'lim'], // Limburgan; Limburger; Limburgish - ['ln', 'lin'], // Lingala - ['lt', 'lit'], // Lithuanian - ['', 'lol'], // Mongo - ['', 'loz'], // Lozi - ['lb', 'ltz'], // Luxembourgish; Letzeburgesch - ['', 'lua'], // Luba-Lulua - ['lu', 'lub'], // Luba-Katanga - ['lg', 'lug'], // Ganda - ['', 'lui'], // Luiseno - ['', 'lun'], // Lunda - ['', 'luo'], // Luo (Kenya and Tanzania) - ['', 'lus'], // Lushai - ['mk', 'mac'], // Macedonian - ['', 'mad'], // Madurese - ['', 'mag'], // Magahi - ['mh', 'mah'], // Marshallese - ['', 'mai'], // Maithili - ['', 'mak'], // Makasar - ['ml', 'mal'], // Malayalam - ['', 'man'], // Mandingo - ['mi', 'mao'], // Maori - ['', 'map'], // Austronesian languages - ['mr', 'mar'], // Marathi - ['', 'mas'], // Masai - ['ms', 'may'], // Malay - ['', 'mdf'], // Moksha - ['', 'mdr'], // Mandar - ['', 'men'], // Mende - ['', 'mga'], // Irish, Middle (900-1200) - ['', 'mic'], // Mi'kmaq; Micmac - ['', 'min'], // Minangkabau - ['', 'mis'], // Uncoded languages - ['', 'mkh'], // Mon-Khmer languages - ['mg', 'mlg'], // Malagasy - ['mt', 'mlt'], // Maltese - ['', 'mnc'], // Manchu - ['', 'mni'], // Manipuri - ['', 'mno'], // Manobo languages - ['', 'moh'], // Mohawk - ['mn', 'mon'], // Mongolian - ['', 'mos'], // Mossi - ['', 'mul'], // Multiple languages - ['', 'mun'], // Munda languages - ['', 'mus'], // Creek - ['', 'mwl'], // Mirandese - ['', 'mwr'], // Marwari - ['', 'myn'], // Mayan languages - ['', 'myv'], // Erzya - ['', 'nah'], // Nahuatl languages - ['', 'nai'], // North American Indian languages - ['', 'nap'], // Neapolitan - ['na', 'nau'], // Nauru - ['nv', 'nav'], // Navajo; Navaho - ['nr', 'nbl'], // Ndebele, South; South Ndebele - ['nd', 'nde'], // Ndebele, North; North Ndebele - ['ng', 'ndo'], // Ndonga - ['', 'nds'], // Low German; Low Saxon; German, Low; Saxon, Low - ['ne', 'nep'], // Nepali - ['', 'new'], // Nepal Bhasa; Newari - ['', 'nia'], // Nias - ['', 'nic'], // Niger-Kordofanian languages - ['', 'niu'], // Niuean - ['nn', 'nno'], // Norwegian Nynorsk; Nynorsk, Norwegian - ['nb', 'nob'], // Bokmål, Norwegian; Norwegian Bokmål - ['', 'nog'], // Nogai - ['', 'non'], // Norse, Old - ['no', 'nor'], // Norwegian - ['', 'nqo'], // N'Ko - ['', 'nso'], // Pedi; Sepedi; Northern Sotho - ['', 'nub'], // Nubian languages - ['', 'nwc'], // Classical Newari; Old Newari; Classical Nepal Bhasa - ['ny', 'nya'], // Chichewa; Chewa; Nyanja - ['', 'nym'], // Nyamwezi - ['', 'nyn'], // Nyankole - ['', 'nyo'], // Nyoro - ['', 'nzi'], // Nzima - ['oc', 'oci'], // Occitan (post 1500) - ['oj', 'oji'], // Ojibwa - ['or', 'ori'], // Oriya - ['om', 'orm'], // Oromo - ['', 'osa'], // Osage - ['os', 'oss'], // Ossetian; Ossetic - ['', 'ota'], // Turkish, Ottoman (1500-1928) - ['', 'oto'], // Otomian languages - ['', 'paa'], // Papuan languages - ['', 'pag'], // Pangasinan - ['', 'pal'], // Pahlavi - ['', 'pam'], // Pampanga; Kapampangan - ['pa', 'pan'], // Panjabi; Punjabi - ['', 'pap'], // Papiamento - ['', 'pau'], // Palauan - ['', 'peo'], // Persian, Old (ca.600-400 B.C.) - ['fa', 'per'], // Persian - ['', 'phi'], // Philippine languages - ['', 'phn'], // Phoenician - ['pi', 'pli'], // Pali - ['pl', 'pol'], // Polish - ['', 'pon'], // Pohnpeian - ['pt', 'por'], // Portuguese - ['', 'pra'], // Prakrit languages - ['', 'pro'], // Provençal, Old (to 1500); Occitan, Old (to 1500) - ['ps', 'pus'], // Pushto; Pashto - ['', 'qaaqtz'], // Reserved for local use - ['qu', 'que'], // Quechua - ['', 'raj'], // Rajasthani - ['', 'rap'], // Rapanui - ['', 'rar'], // Rarotongan; Cook Islands Maori - ['', 'roa'], // Romance languages - ['rm', 'roh'], // Romansh - ['', 'rom'], // Romany - ['ro', 'rum'], // Romanian; Moldavian; Moldovan - ['rn', 'run'], // Rundi - ['', 'rup'], // Aromanian; Arumanian; Macedo-Romanian - ['ru', 'rus'], // Russian - ['', 'sad'], // Sandawe - ['sg', 'sag'], // Sango - ['', 'sah'], // Yakut - ['', 'sai'], // South American Indian languages - ['', 'sal'], // Salishan languages - ['', 'sam'], // Samaritan Aramaic - ['sa', 'san'], // Sanskrit - ['', 'sas'], // Sasak - ['', 'sat'], // Santali - ['', 'scn'], // Sicilian - ['', 'sco'], // Scots - ['', 'sel'], // Selkup - ['', 'sem'], // Semitic languages - ['', 'sga'], // Irish, Old (to 900) - ['', 'sgn'], // Sign Languages - ['', 'shn'], // Shan - ['', 'sid'], // Sidamo - ['si', 'sin'], // Sinhala; Sinhalese - ['', 'sio'], // Siouan languages - ['', 'sit'], // Sino-Tibetan languages - ['', 'sla'], // Slavic languages - ['sk', 'slo'], // Slovak - ['sl', 'slv'], // Slovenian - ['', 'sma'], // Southern Sami - ['se', 'sme'], // Northern Sami - ['', 'smi'], // Sami languages - ['', 'smj'], // Lule Sami - ['', 'smn'], // Inari Sami - ['sm', 'smo'], // Samoan - ['', 'sms'], // Skolt Sami - ['sn', 'sna'], // Shona - ['sd', 'snd'], // Sindhi - ['', 'snk'], // Soninke - ['', 'sog'], // Sogdian - ['so', 'som'], // Somali - ['', 'son'], // Songhai languages - ['st', 'sot'], // Sotho, Southern - ['es', 'spa'], // Spanish; Castilian - ['sc', 'srd'], // Sardinian - ['', 'srn'], // Sranan Tongo - ['sr', 'srp'], // Serbian - ['', 'srr'], // Serer - ['', 'ssa'], // Nilo-Saharan languages - ['ss', 'ssw'], // Swati - ['', 'suk'], // Sukuma - ['su', 'sun'], // Sundanese - ['', 'sus'], // Susu - ['', 'sux'], // Sumerian - ['sw', 'swa'], // Swahili - ['sv', 'swe'], // Swedish - ['', 'syc'], // Classical Syriac - ['', 'syr'], // Syriac - ['ty', 'tah'], // Tahitian - ['', 'tai'], // Tai languages - ['ta', 'tam'], // Tamil - ['tt', 'tat'], // Tatar - ['te', 'tel'], // Telugu - ['', 'tem'], // Timne - ['', 'ter'], // Tereno - ['', 'tet'], // Tetum - ['tg', 'tgk'], // Tajik - ['tl', 'tgl'], // Tagalog - ['th', 'tha'], // Thai - ['bo', 'tib'], // Tibetan - ['', 'tig'], // Tigre - ['ti', 'tir'], // Tigrinya - ['', 'tiv'], // Tiv - ['', 'tkl'], // Tokelau - ['', 'tlh'], // Klingon; tlhIngan-Hol - ['', 'tli'], // Tlingit - ['', 'tmh'], // Tamashek - ['', 'tog'], // Tonga (Nyasa) - ['to', 'ton'], // Tonga (Tonga Islands) - ['', 'tpi'], // Tok Pisin - ['', 'tsi'], // Tsimshian - ['tn', 'tsn'], // Tswana - ['ts', 'tso'], // Tsonga - ['tk', 'tuk'], // Turkmen - ['', 'tum'], // Tumbuka - ['', 'tup'], // Tupi languages - ['tr', 'tur'], // Turkish - ['', 'tut'], // Altaic languages - ['', 'tvl'], // Tuvalu - ['tw', 'twi'], // Twi - ['', 'tyv'], // Tuvinian - ['', 'udm'], // Udmurt - ['', 'uga'], // Ugaritic - ['ug', 'uig'], // Uighur; Uyghur - ['uk', 'ukr'], // Ukrainian - ['', 'umb'], // Umbundu - ['', 'und'], // Undetermined - ['ur', 'urd'], // Urdu - ['uz', 'uzb'], // Uzbek - ['', 'vai'], // Vai - ['ve', 'ven'], // Venda - ['vi', 'vie'], // Vietnamese - ['vo', 'vol'], // Volapük - ['', 'vot'], // Votic - ['', 'wak'], // Wakashan languages - ['', 'wal'], // Wolaitta; Wolaytta - ['', 'war'], // Waray - ['', 'was'], // Washo - ['cy', 'wel'], // Welsh - ['', 'wen'], // Sorbian languages - ['wa', 'wln'], // Walloon - ['wo', 'wol'], // Wolof - ['', 'xal'], // Kalmyk; Oirat - ['xh', 'xho'], // Xhosa - ['', 'yao'], // Yao - ['', 'yap'], // Yapese - ['yi', 'yid'], // Yiddish - ['yo', 'yor'], // Yoruba - ['', 'ypk'], // Yupik languages - ['', 'zap'], // Zapotec - ['', 'zbl'], // Blissymbols; Blissymbolics; Bliss - ['', 'zen'], // Zenaga - ['', 'zgh'], // Standard Moroccan Tamazight - ['za', 'zha'], // Zhuang; Chuang - ['', 'znd'], // Zande languages - ['zu', 'zul'], // Zulu - ['', 'zun'], // Zuni - ['', 'zxx'], // No linguistic content; Not applicable - // phpcs:enable Squiz.PHP.CommentedOutCode.Found - ]; + private $set; + + /** + * @var IsoCodesFactory + */ + private $factory; /** * Initializes the rule defining the ISO 639 set. @@ -535,19 +52,28 @@ final class LanguageCode extends AbstractEnvelope */ public function __construct(string $set = self::ALPHA2) { - $index = array_search($set, self::AVAILABLE_SETS, true); - if ($index === false) { + if (!in_array($set, self::AVAILABLE_SETS)) { throw new ComponentException(sprintf('"%s" is not a valid language set for ISO 639', $set)); } - parent::__construct(new In($this->getHaystack($index), true), ['set' => $set]); + $this->set = $set; + $this->factory = new IsoCodesFactory(null, new DummyDriver()); } /** - * @return string[] + * {@inheritDoc} */ - private function getHaystack(int $index): array + public function validate($input): bool { - return array_filter(array_column(self::LANGUAGE_CODES, $index)); + if (!is_string($input) || $input === '') { + return false; + } + + $languages = $this->factory->getLanguages(); + if ($this->set === self::ALPHA2) { + return $languages->getByAlpha2($input) !== null; + } + + return $languages->getByAlpha3($input) !== null; } }