From 29aee2ddf2ff7dd0bfa96c1dbb56467673a533a2 Mon Sep 17 00:00:00 2001 From: Roland Franssen Date: Tue, 13 Aug 2019 16:30:57 +0200 Subject: [PATCH] [Intl] Full alpha3 language support --- .../Data/Generator/LanguageDataGenerator.php | 42 +- src/Symfony/Component/Intl/Languages.php | 23 +- .../Intl/Resources/data/languages/meta.json | 602 ++++++++++++ .../Component/Intl/Tests/CountriesTest.php | 1 + .../Component/Intl/Tests/LanguagesTest.php | 867 +++++++++++++++++- 5 files changed, 1503 insertions(+), 32 deletions(-) diff --git a/src/Symfony/Component/Intl/Data/Generator/LanguageDataGenerator.php b/src/Symfony/Component/Intl/Data/Generator/LanguageDataGenerator.php index 77f647099b..2341ceb995 100644 --- a/src/Symfony/Component/Intl/Data/Generator/LanguageDataGenerator.php +++ b/src/Symfony/Component/Intl/Data/Generator/LanguageDataGenerator.php @@ -162,15 +162,12 @@ class LanguageDataGenerator extends AbstractDataGenerator sort($this->languageCodes); - $alpha2ToAlpha3 = $this->generateAlpha2ToAlpha3Mapping($metadataBundle); - $alpha3ToAlpha2 = array_flip($alpha2ToAlpha3); - asort($alpha3ToAlpha2); - return [ 'Version' => $rootBundle['Version'], 'Languages' => $this->languageCodes, - 'Alpha2ToAlpha3' => $alpha2ToAlpha3, - 'Alpha3ToAlpha2' => $alpha3ToAlpha2, + 'Alpha3Languages' => $this->generateAlpha3Codes($this->languageCodes, $metadataBundle), + 'Alpha2ToAlpha3' => $this->generateAlpha2ToAlpha3Mapping($metadataBundle), + 'Alpha3ToAlpha2' => $this->generateAlpha3ToAlpha2Mapping($metadataBundle), ]; } @@ -179,6 +176,23 @@ class LanguageDataGenerator extends AbstractDataGenerator return array_diff_key(iterator_to_array($localeBundle['Languages']), self::$blacklist); } + private function generateAlpha3Codes(array $languageCodes, ArrayAccessibleResourceBundle $metadataBundle): array + { + $alpha3Codes = array_flip(array_filter($languageCodes, static function (string $language): bool { + return 3 === \strlen($language); + })); + + foreach ($metadataBundle['alias']['language'] as $alias => $data) { + if (3 === \strlen($alias) && 'overlong' === $data['reason']) { + $alpha3Codes[$alias] = true; + } + } + + ksort($alpha3Codes); + + return array_keys($alpha3Codes); + } + private function generateAlpha2ToAlpha3Mapping(ArrayAccessibleResourceBundle $metadataBundle) { $aliases = iterator_to_array($metadataBundle['alias']['language']); @@ -213,4 +227,20 @@ class LanguageDataGenerator extends AbstractDataGenerator return $alpha2ToAlpha3; } + + private function generateAlpha3ToAlpha2Mapping(ArrayAccessibleResourceBundle $metadataBundle): array + { + $alpha3ToAlpha2 = []; + + foreach ($metadataBundle['alias']['language'] as $alias => $data) { + $language = $data['replacement']; + if (2 === \strlen($language) && 3 === \strlen($alias) && 'overlong' === $data['reason']) { + $alpha3ToAlpha2[$alias] = $language; + } + } + + asort($alpha3ToAlpha2); + + return $alpha3ToAlpha2; + } } diff --git a/src/Symfony/Component/Intl/Languages.php b/src/Symfony/Component/Intl/Languages.php index 437295b821..235ddea8bf 100644 --- a/src/Symfony/Component/Intl/Languages.php +++ b/src/Symfony/Component/Intl/Languages.php @@ -98,7 +98,7 @@ final class Languages extends ResourceBundle */ public static function getAlpha3Codes(): array { - return self::readEntry(['Alpha2ToAlpha3'], 'meta'); + return self::readEntry(['Alpha3Languages'], 'meta'); } /** @@ -111,7 +111,12 @@ final class Languages extends ResourceBundle return true; } catch (MissingResourceException $e) { - return false; + static $cache; + if (null === $cache) { + $cache = array_flip(self::getAlpha3Codes()); + } + + return isset($cache[$language]); } } @@ -122,7 +127,15 @@ final class Languages extends ResourceBundle */ public static function getAlpha3Name(string $language, string $displayLocale = null): string { - return self::getName(self::getAlpha2Code($language), $displayLocale); + try { + return self::getName(self::getAlpha2Code($language), $displayLocale); + } catch (MissingResourceException $e) { + if (3 === \strlen($language)) { + return self::getName($language, $displayLocale); + } + + throw $e; + } } /** @@ -137,6 +150,10 @@ final class Languages extends ResourceBundle $alpha2Names = self::getNames($displayLocale); $alpha3Names = []; foreach ($alpha2Names as $alpha2Code => $name) { + if (3 === \strlen($alpha2Code)) { + $alpha3Names[$alpha2Code] = $name; + continue; + } try { $alpha3Names[self::getAlpha3Code($alpha2Code)] = $name; } catch (MissingResourceException $e) { diff --git a/src/Symfony/Component/Intl/Resources/data/languages/meta.json b/src/Symfony/Component/Intl/Resources/data/languages/meta.json index 5229da4191..b6a3980eb9 100644 --- a/src/Symfony/Component/Intl/Resources/data/languages/meta.json +++ b/src/Symfony/Component/Intl/Resources/data/languages/meta.json @@ -618,6 +618,605 @@ "zun", "zza" ], + "Alpha3Languages": [ + "aar", + "abk", + "ace", + "ach", + "ada", + "ady", + "aeb", + "afh", + "afr", + "agq", + "ain", + "aka", + "akk", + "akz", + "ale", + "aln", + "alt", + "amh", + "ang", + "anp", + "ara", + "arc", + "arg", + "arn", + "aro", + "arp", + "arq", + "ars", + "arw", + "ary", + "arz", + "asa", + "ase", + "asm", + "ast", + "ava", + "ave", + "avk", + "awa", + "aym", + "aze", + "bak", + "bal", + "bam", + "ban", + "bar", + "bas", + "bax", + "bbc", + "bbj", + "bej", + "bel", + "bem", + "ben", + "bew", + "bez", + "bfd", + "bfq", + "bgn", + "bho", + "bih", + "bik", + "bin", + "bis", + "bjn", + "bkm", + "bla", + "bod", + "bos", + "bpy", + "bqi", + "bra", + "bre", + "brh", + "brx", + "bss", + "bua", + "bug", + "bul", + "bum", + "byn", + "byv", + "cad", + "car", + "cat", + "cay", + "cch", + "ccp", + "ceb", + "ces", + "cgg", + "cha", + "chb", + "che", + "chg", + "chk", + "chm", + "chn", + "cho", + "chp", + "chr", + "chu", + "chv", + "chy", + "ckb", + "cop", + "cor", + "cos", + "cps", + "cre", + "crh", + "crs", + "csb", + "cym", + "dak", + "dan", + "dar", + "dav", + "del", + "den", + "deu", + "dgr", + "din", + "div", + "dje", + "doi", + "dsb", + "dtp", + "dua", + "dum", + "dyo", + "dyu", + "dzg", + "dzo", + "ebu", + "efi", + "egl", + "egy", + "eka", + "ell", + "elx", + "eng", + "enm", + "epo", + "est", + "esu", + "eus", + "ewe", + "ewo", + "ext", + "fan", + "fao", + "fas", + "fat", + "fij", + "fil", + "fin", + "fit", + "fon", + "fra", + "frc", + "frm", + "fro", + "frp", + "frr", + "frs", + "fry", + "ful", + "fur", + "gaa", + "gag", + "gan", + "gay", + "gba", + "gbz", + "gez", + "gil", + "gla", + "gle", + "glg", + "glk", + "glv", + "gmh", + "goh", + "gom", + "gon", + "gor", + "got", + "grb", + "grc", + "grn", + "gsw", + "guc", + "guj", + "gur", + "guz", + "gwi", + "hai", + "hak", + "hat", + "hau", + "haw", + "hbs", + "heb", + "her", + "hif", + "hil", + "hin", + "hit", + "hmn", + "hmo", + "hrv", + "hsb", + "hsn", + "hun", + "hup", + "hye", + "iba", + "ibb", + "ibo", + "ido", + "iii", + "iku", + "ile", + "ilo", + "ina", + "ind", + "inh", + "ipk", + "isl", + "ita", + "izh", + "jam", + "jav", + "jbo", + "jgo", + "jmc", + "jpn", + "jpr", + "jrb", + "jut", + "kaa", + "kab", + "kac", + "kaj", + "kal", + "kam", + "kan", + "kas", + "kat", + "kau", + "kaw", + "kaz", + "kbd", + "kbl", + "kcg", + "kde", + "kea", + "ken", + "kfo", + "kgp", + "kha", + "khm", + "kho", + "khq", + "khw", + "kik", + "kin", + "kir", + "kiu", + "kkj", + "kln", + "kmb", + "koi", + "kok", + "kom", + "kon", + "kor", + "kos", + "kpe", + "krc", + "kri", + "krj", + "krl", + "kru", + "ksb", + "ksf", + "ksh", + "kua", + "kum", + "kur", + "kut", + "lad", + "lag", + "lah", + "lam", + "lao", + "lat", + "lav", + "lez", + "lfn", + "lij", + "lim", + "lin", + "lit", + "liv", + "lkt", + "lmo", + "lol", + "lou", + "loz", + "lrc", + "ltg", + "ltz", + "lua", + "lub", + "lug", + "lui", + "lun", + "luo", + "lus", + "luy", + "lzh", + "lzz", + "mad", + "maf", + "mag", + "mah", + "mai", + "mak", + "mal", + "man", + "mar", + "mas", + "mde", + "mdf", + "mdr", + "men", + "mer", + "mfe", + "mga", + "mgh", + "mgo", + "mic", + "min", + "mkd", + "mlg", + "mlt", + "mnc", + "mni", + "moh", + "mol", + "mon", + "mos", + "mri", + "mrj", + "msa", + "mua", + "mus", + "mwl", + "mwr", + "mwv", + "mya", + "mye", + "myv", + "mzn", + "nan", + "nap", + "naq", + "nau", + "nav", + "nbl", + "nde", + "ndo", + "nds", + "nep", + "new", + "nia", + "niu", + "njo", + "nld", + "nmg", + "nnh", + "nno", + "nob", + "nog", + "non", + "nor", + "nov", + "nqo", + "nso", + "nus", + "nwc", + "nya", + "nym", + "nyn", + "nyo", + "nzi", + "oci", + "oji", + "ori", + "orm", + "osa", + "oss", + "ota", + "pag", + "pal", + "pam", + "pan", + "pap", + "pau", + "pcd", + "pcm", + "pdc", + "pdt", + "peo", + "pfl", + "phn", + "pli", + "pms", + "pnt", + "pol", + "pon", + "por", + "prg", + "pro", + "prs", + "pus", + "quc", + "que", + "qug", + "raj", + "rap", + "rar", + "rgn", + "rif", + "rof", + "roh", + "rom", + "ron", + "rtm", + "rue", + "rug", + "run", + "rup", + "rus", + "rwk", + "sad", + "sag", + "sah", + "sam", + "san", + "saq", + "sas", + "sat", + "saz", + "sba", + "sbp", + "scn", + "sco", + "sdc", + "sdh", + "see", + "seh", + "sei", + "sel", + "ses", + "sga", + "sgs", + "shi", + "shn", + "shu", + "sid", + "sin", + "sli", + "slk", + "slv", + "sly", + "sma", + "sme", + "smj", + "smn", + "smo", + "sms", + "sna", + "snd", + "snk", + "sog", + "som", + "sot", + "spa", + "sqi", + "srd", + "srn", + "srp", + "srr", + "ssw", + "ssy", + "stq", + "suk", + "sun", + "sus", + "sux", + "swa", + "swb", + "swc", + "swe", + "syc", + "syr", + "szl", + "tah", + "tam", + "tat", + "tcy", + "tel", + "tem", + "teo", + "ter", + "tet", + "tgk", + "tgl", + "tha", + "tig", + "tir", + "tiv", + "tkl", + "tkr", + "tlh", + "tli", + "tly", + "tmh", + "tog", + "ton", + "tpi", + "tru", + "trv", + "tsd", + "tsi", + "tsn", + "tso", + "ttt", + "tuk", + "tum", + "tur", + "tvl", + "twi", + "twq", + "tyv", + "tzm", + "udm", + "uga", + "uig", + "ukr", + "umb", + "urd", + "uzb", + "vai", + "vec", + "ven", + "vep", + "vie", + "vls", + "vmf", + "vol", + "vot", + "vro", + "vun", + "wae", + "wal", + "war", + "was", + "wbp", + "wln", + "wol", + "wuu", + "xal", + "xho", + "xmf", + "xog", + "yao", + "yap", + "yav", + "ybb", + "yid", + "yor", + "yrl", + "yue", + "zap", + "zbl", + "zea", + "zen", + "zgh", + "zha", + "zho", + "zul", + "zun", + "zza" + ], "Alpha2ToAlpha3": { "aa": "aar", "ab": "abk", @@ -806,6 +1405,7 @@ "ave": "ae", "afr": "af", "aka": "ak", + "twi": "ak", "amh": "am", "arg": "an", "ara": "ar", @@ -912,6 +1512,7 @@ "mya": "my", "nau": "na", "nob": "nb", + "nor": "nb", "nde": "nd", "nep": "ne", "ndo": "ng", @@ -933,6 +1534,7 @@ "que": "qu", "roh": "rm", "run": "rn", + "mol": "ro", "ron": "ro", "rus": "ru", "kin": "rw", diff --git a/src/Symfony/Component/Intl/Tests/CountriesTest.php b/src/Symfony/Component/Intl/Tests/CountriesTest.php index c8aab74494..a6d38c7c8a 100644 --- a/src/Symfony/Component/Intl/Tests/CountriesTest.php +++ b/src/Symfony/Component/Intl/Tests/CountriesTest.php @@ -626,6 +626,7 @@ class CountriesTest extends ResourceBundleTestCase { $this->assertTrue(Countries::alpha3CodeExists('NOR')); $this->assertTrue(Countries::alpha3CodeExists('NLD')); + $this->assertFalse(Countries::alpha3CodeExists('NL')); $this->assertFalse(Countries::alpha3CodeExists('NIO')); $this->assertFalse(Countries::alpha3CodeExists('ZZZ')); } diff --git a/src/Symfony/Component/Intl/Tests/LanguagesTest.php b/src/Symfony/Component/Intl/Tests/LanguagesTest.php index 224a5172c4..589bfddf45 100644 --- a/src/Symfony/Component/Intl/Tests/LanguagesTest.php +++ b/src/Symfony/Component/Intl/Tests/LanguagesTest.php @@ -640,6 +640,606 @@ class LanguagesTest extends ResourceBundleTestCase 'zza', ]; + private static $alpha3Codes = [ + 'aar', + 'abk', + 'ace', + 'ach', + 'ada', + 'ady', + 'aeb', + 'afh', + 'afr', + 'agq', + 'ain', + 'aka', + 'akk', + 'akz', + 'ale', + 'aln', + 'alt', + 'amh', + 'ang', + 'anp', + 'ara', + 'arc', + 'arg', + 'arn', + 'aro', + 'arp', + 'arq', + 'ars', + 'arw', + 'ary', + 'arz', + 'asa', + 'ase', + 'asm', + 'ast', + 'ava', + 'ave', + 'avk', + 'awa', + 'aym', + 'aze', + 'bak', + 'bal', + 'bam', + 'ban', + 'bar', + 'bas', + 'bax', + 'bbc', + 'bbj', + 'bej', + 'bel', + 'bem', + 'ben', + 'bew', + 'bez', + 'bfd', + 'bfq', + 'bgn', + 'bho', + 'bih', + 'bik', + 'bin', + 'bis', + 'bjn', + 'bkm', + 'bla', + 'bod', + 'bos', + 'bpy', + 'bqi', + 'bra', + 'bre', + 'brh', + 'brx', + 'bss', + 'bua', + 'bug', + 'bul', + 'bum', + 'byn', + 'byv', + 'cad', + 'car', + 'cat', + 'cay', + 'cch', + 'ccp', + 'ceb', + 'ces', + 'cgg', + 'cha', + 'chb', + 'che', + 'chg', + 'chk', + 'chm', + 'chn', + 'cho', + 'chp', + 'chr', + 'chu', + 'chv', + 'chy', + 'ckb', + 'cop', + 'cor', + 'cos', + 'cps', + 'cre', + 'crh', + 'crs', + 'csb', + 'cym', + 'dak', + 'dan', + 'dar', + 'dav', + 'del', + 'den', + 'deu', + 'dgr', + 'din', + 'div', + 'dje', + 'doi', + 'dsb', + 'dtp', + 'dua', + 'dum', + 'dyo', + 'dyu', + 'dzg', + 'dzo', + 'ebu', + 'efi', + 'egl', + 'egy', + 'eka', + 'ell', + 'elx', + 'eng', + 'enm', + 'epo', + 'est', + 'esu', + 'eus', + 'ewe', + 'ewo', + 'ext', + 'fan', + 'fao', + 'fas', + 'fat', + 'fij', + 'fil', + 'fin', + 'fit', + 'fon', + 'fra', + 'frc', + 'frm', + 'fro', + 'frp', + 'frr', + 'frs', + 'fry', + 'ful', + 'fur', + 'gaa', + 'gag', + 'gan', + 'gay', + 'gba', + 'gbz', + 'gez', + 'gil', + 'gla', + 'gle', + 'glg', + 'glk', + 'glv', + 'gmh', + 'goh', + 'gom', + 'gon', + 'gor', + 'got', + 'grb', + 'grc', + 'grn', + 'gsw', + 'guc', + 'guj', + 'gur', + 'guz', + 'gwi', + 'hai', + 'hak', + 'hat', + 'hau', + 'haw', + 'hbs', + 'heb', + 'her', + 'hif', + 'hil', + 'hin', + 'hit', + 'hmn', + 'hmo', + 'hrv', + 'hsb', + 'hsn', + 'hun', + 'hup', + 'hye', + 'iba', + 'ibb', + 'ibo', + 'ido', + 'iii', + 'iku', + 'ile', + 'ilo', + 'ina', + 'ind', + 'inh', + 'ipk', + 'isl', + 'ita', + 'izh', + 'jam', + 'jav', + 'jbo', + 'jgo', + 'jmc', + 'jpn', + 'jpr', + 'jrb', + 'jut', + 'kaa', + 'kab', + 'kac', + 'kaj', + 'kal', + 'kam', + 'kan', + 'kas', + 'kat', + 'kau', + 'kaw', + 'kaz', + 'kbd', + 'kbl', + 'kcg', + 'kde', + 'kea', + 'ken', + 'kfo', + 'kgp', + 'kha', + 'khm', + 'kho', + 'khq', + 'khw', + 'kik', + 'kin', + 'kir', + 'kiu', + 'kkj', + 'kln', + 'kmb', + 'koi', + 'kok', + 'kom', + 'kon', + 'kor', + 'kos', + 'kpe', + 'krc', + 'kri', + 'krj', + 'krl', + 'kru', + 'ksb', + 'ksf', + 'ksh', + 'kua', + 'kum', + 'kur', + 'kut', + 'lad', + 'lag', + 'lah', + 'lam', + 'lao', + 'lat', + 'lav', + 'lez', + 'lfn', + 'lij', + 'lim', + 'lin', + 'lit', + 'liv', + 'lkt', + 'lmo', + 'lol', + 'lou', + 'loz', + 'lrc', + 'ltg', + 'ltz', + 'lua', + 'lub', + 'lug', + 'lui', + 'lun', + 'luo', + 'lus', + 'luy', + 'lzh', + 'lzz', + 'mad', + 'maf', + 'mag', + 'mah', + 'mai', + 'mak', + 'mal', + 'man', + 'mar', + 'mas', + 'mde', + 'mdf', + 'mdr', + 'men', + 'mer', + 'mfe', + 'mga', + 'mgh', + 'mgo', + 'mic', + 'min', + 'mkd', + 'mlg', + 'mlt', + 'mnc', + 'mni', + 'moh', + 'mol', + 'mon', + 'mos', + 'mri', + 'mrj', + 'msa', + 'mua', + 'mus', + 'mwl', + 'mwr', + 'mwv', + 'mya', + 'mye', + 'myv', + 'mzn', + 'nan', + 'nap', + 'naq', + 'nau', + 'nav', + 'nbl', + 'nde', + 'ndo', + 'nds', + 'nep', + 'new', + 'nia', + 'niu', + 'njo', + 'nld', + 'nmg', + 'nnh', + 'nno', + 'nob', + 'nog', + 'non', + 'nor', + 'nov', + 'nqo', + 'nso', + 'nus', + 'nwc', + 'nya', + 'nym', + 'nyn', + 'nyo', + 'nzi', + 'oci', + 'oji', + 'ori', + 'orm', + 'osa', + 'oss', + 'ota', + 'pag', + 'pal', + 'pam', + 'pan', + 'pap', + 'pau', + 'pcd', + 'pcm', + 'pdc', + 'pdt', + 'peo', + 'pfl', + 'phn', + 'pli', + 'pms', + 'pnt', + 'pol', + 'pon', + 'por', + 'prg', + 'pro', + 'prs', + 'pus', + 'quc', + 'que', + 'qug', + 'raj', + 'rap', + 'rar', + 'rgn', + 'rif', + 'rof', + 'roh', + 'rom', + 'ron', + 'rtm', + 'rue', + 'rug', + 'run', + 'rup', + 'rus', + 'rwk', + 'sad', + 'sag', + 'sah', + 'sam', + 'san', + 'saq', + 'sas', + 'sat', + 'saz', + 'sba', + 'sbp', + 'scn', + 'sco', + 'sdc', + 'sdh', + 'see', + 'seh', + 'sei', + 'sel', + 'ses', + 'sga', + 'sgs', + 'shi', + 'shn', + 'shu', + 'sid', + 'sin', + 'sli', + 'slk', + 'slv', + 'sly', + 'sma', + 'sme', + 'smj', + 'smn', + 'smo', + 'sms', + 'sna', + 'snd', + 'snk', + 'sog', + 'som', + 'sot', + 'spa', + 'sqi', + 'srd', + 'srn', + 'srp', + 'srr', + 'ssw', + 'ssy', + 'stq', + 'suk', + 'sun', + 'sus', + 'sux', + 'swa', + 'swb', + 'swc', + 'swe', + 'syc', + 'syr', + 'szl', + 'tah', + 'tam', + 'tat', + 'tcy', + 'tel', + 'tem', + 'teo', + 'ter', + 'tet', + 'tgk', + 'tgl', + 'tha', + 'tig', + 'tir', + 'tiv', + 'tkl', + 'tkr', + 'tlh', + 'tli', + 'tly', + 'tmh', + 'tog', + 'ton', + 'tpi', + 'tru', + 'trv', + 'tsd', + 'tsi', + 'tsn', + 'tso', + 'ttt', + 'tuk', + 'tum', + 'tur', + 'tvl', + 'twi', + 'twq', + 'tyv', + 'tzm', + 'udm', + 'uga', + 'uig', + 'ukr', + 'umb', + 'urd', + 'uzb', + 'vai', + 'vec', + 'ven', + 'vep', + 'vie', + 'vls', + 'vmf', + 'vol', + 'vot', + 'vro', + 'vun', + 'wae', + 'wal', + 'war', + 'was', + 'wbp', + 'wln', + 'wol', + 'wuu', + 'xal', + 'xho', + 'xmf', + 'xog', + 'yao', + 'yap', + 'yav', + 'ybb', + 'yid', + 'yor', + 'yrl', + 'yue', + 'zap', + 'zbl', + 'zea', + 'zen', + 'zgh', + 'zha', + 'zho', + 'zul', + 'zun', + 'zza', + ]; + private static $alpha2ToAlpha3 = [ 'aa' => 'aar', 'ab' => 'abk', @@ -823,6 +1423,192 @@ class LanguagesTest extends ResourceBundleTestCase 'zu' => 'zul', ]; + private static $alpha3ToAlpha2 = [ + 'aar' => 'aa', + 'abk' => 'ab', + 'ave' => 'ae', + 'afr' => 'af', + 'aka' => 'ak', + 'twi' => 'ak', + 'amh' => 'am', + 'arg' => 'an', + 'ara' => 'ar', + 'asm' => 'as', + 'ava' => 'av', + 'aym' => 'ay', + 'aze' => 'az', + 'bak' => 'ba', + 'bel' => 'be', + 'bul' => 'bg', + 'bis' => 'bi', + 'bam' => 'bm', + 'ben' => 'bn', + 'bod' => 'bo', + 'bre' => 'br', + 'bos' => 'bs', + 'cat' => 'ca', + 'che' => 'ce', + 'cha' => 'ch', + 'cos' => 'co', + 'cre' => 'cr', + 'ces' => 'cs', + 'chu' => 'cu', + 'chv' => 'cv', + 'cym' => 'cy', + 'dan' => 'da', + 'deu' => 'de', + 'div' => 'dv', + 'dzo' => 'dz', + 'ewe' => 'ee', + 'ell' => 'el', + 'eng' => 'en', + 'epo' => 'eo', + 'spa' => 'es', + 'est' => 'et', + 'eus' => 'eu', + 'fas' => 'fa', + 'ful' => 'ff', + 'fin' => 'fi', + 'fij' => 'fj', + 'fao' => 'fo', + 'fra' => 'fr', + 'fry' => 'fy', + 'gle' => 'ga', + 'gla' => 'gd', + 'glg' => 'gl', + 'grn' => 'gn', + 'guj' => 'gu', + 'glv' => 'gv', + 'hau' => 'ha', + 'heb' => 'he', + 'hin' => 'hi', + 'hmo' => 'ho', + 'hrv' => 'hr', + 'hat' => 'ht', + 'hun' => 'hu', + 'hye' => 'hy', + 'her' => 'hz', + 'ina' => 'ia', + 'ind' => 'id', + 'ile' => 'ie', + 'ibo' => 'ig', + 'iii' => 'ii', + 'ipk' => 'ik', + 'ido' => 'io', + 'isl' => 'is', + 'ita' => 'it', + 'iku' => 'iu', + 'jpn' => 'ja', + 'jav' => 'jv', + 'kat' => 'ka', + 'kon' => 'kg', + 'kik' => 'ki', + 'kua' => 'kj', + 'kaz' => 'kk', + 'kal' => 'kl', + 'khm' => 'km', + 'kan' => 'kn', + 'kor' => 'ko', + 'kau' => 'kr', + 'kas' => 'ks', + 'kur' => 'ku', + 'kom' => 'kv', + 'cor' => 'kw', + 'kir' => 'ky', + 'lat' => 'la', + 'ltz' => 'lb', + 'lug' => 'lg', + 'lim' => 'li', + 'lin' => 'ln', + 'lao' => 'lo', + 'lit' => 'lt', + 'lub' => 'lu', + 'lav' => 'lv', + 'mlg' => 'mg', + 'mah' => 'mh', + 'mri' => 'mi', + 'mkd' => 'mk', + 'mal' => 'ml', + 'mon' => 'mn', + 'mar' => 'mr', + 'msa' => 'ms', + 'mlt' => 'mt', + 'mya' => 'my', + 'nau' => 'na', + 'nob' => 'nb', + 'nor' => 'nb', + 'nde' => 'nd', + 'nep' => 'ne', + 'ndo' => 'ng', + 'nld' => 'nl', + 'nno' => 'nn', + 'nbl' => 'nr', + 'nav' => 'nv', + 'nya' => 'ny', + 'oci' => 'oc', + 'oji' => 'oj', + 'orm' => 'om', + 'ori' => 'or', + 'oss' => 'os', + 'pan' => 'pa', + 'pli' => 'pi', + 'pol' => 'pl', + 'pus' => 'ps', + 'por' => 'pt', + 'que' => 'qu', + 'roh' => 'rm', + 'run' => 'rn', + 'mol' => 'ro', + 'ron' => 'ro', + 'rus' => 'ru', + 'kin' => 'rw', + 'san' => 'sa', + 'srd' => 'sc', + 'snd' => 'sd', + 'sme' => 'se', + 'sag' => 'sg', + 'sin' => 'si', + 'slk' => 'sk', + 'slv' => 'sl', + 'smo' => 'sm', + 'sna' => 'sn', + 'som' => 'so', + 'sqi' => 'sq', + 'srp' => 'sr', + 'ssw' => 'ss', + 'sot' => 'st', + 'sun' => 'su', + 'swe' => 'sv', + 'swa' => 'sw', + 'tam' => 'ta', + 'tel' => 'te', + 'tgk' => 'tg', + 'tha' => 'th', + 'tir' => 'ti', + 'tuk' => 'tk', + 'tsn' => 'tn', + 'ton' => 'to', + 'tur' => 'tr', + 'tso' => 'ts', + 'tat' => 'tt', + 'tah' => 'ty', + 'uig' => 'ug', + 'ukr' => 'uk', + 'urd' => 'ur', + 'uzb' => 'uz', + 'ven' => 've', + 'vie' => 'vi', + 'vol' => 'vo', + 'wln' => 'wa', + 'wol' => 'wo', + 'xho' => 'xh', + 'yid' => 'yi', + 'yor' => 'yo', + 'zha' => 'za', + 'zho' => 'zh', + 'zul' => 'zu', + ]; + public function testGetLanguageCodes() { $this->assertEquals(self::$languages, Languages::getLanguageCodes()); @@ -833,12 +1619,19 @@ class LanguagesTest extends ResourceBundleTestCase */ public function testGetNames($displayLocale) { - $languages = array_keys(Languages::getNames($displayLocale)); + $languages = array_keys($names = Languages::getNames($displayLocale)); sort($languages); $this->assertNotEmpty($languages); $this->assertEmpty(array_diff($languages, self::$languages)); + + foreach (Languages::getAlpha3Names($displayLocale) as $alpha3Code => $name) { + $alpha2Code = self::$alpha3ToAlpha2[$alpha3Code] ?? null; + if (null !== $alpha2Code) { + $this->assertSame($name, $names[$alpha2Code]); + } + } } public function testGetNamesDefaultLocale() @@ -929,20 +1722,51 @@ class LanguagesTest extends ResourceBundleTestCase public function testGetAlpha3Codes() { - $this->assertSame(self::$alpha2ToAlpha3, Languages::getAlpha3Codes()); + $this->assertSame(self::$alpha3Codes, Languages::getAlpha3Codes()); } - public function testGetAlpha2Code() + public function provideLanguagesWithAlpha2Equivalent() { - foreach (self::$alpha2ToAlpha3 as $alpha2Code => $alpha3Code) { - $this->assertSame($alpha2Code, Languages::getAlpha2Code($alpha3Code)); - } + return array_map( + function ($value) { return [$value]; }, + array_keys(self::$alpha3ToAlpha2) + ); + } + + /** + * @dataProvider provideLanguagesWithAlpha2Equivalent + */ + public function testGetAlpha2Code($language) + { + $this->assertSame(self::$alpha3ToAlpha2[$language], Languages::getAlpha2Code($language)); + } + + public function provideLanguagesWithoutAlpha2Equivalent() + { + return array_map( + function ($value) { return [$value]; }, + array_diff(self::$alpha3Codes, array_keys(self::$alpha3ToAlpha2)) + ); + } + + /** + * @dataProvider provideLanguagesWithoutAlpha2Equivalent + */ + public function testGetAlpha2CodeFailsIfNoAlpha2Equivalent($language) + { + $this->expectException('Symfony\Component\Intl\Exception\MissingResourceException'); + Languages::getAlpha2Code($language); } public function testAlpha3CodeExists() { $this->assertTrue(Languages::alpha3CodeExists('nob')); $this->assertTrue(Languages::alpha3CodeExists('nld')); + $this->assertTrue(Languages::alpha3CodeExists('ace')); + $this->assertTrue(Languages::alpha3CodeExists('nor')); + $this->assertTrue(Languages::alpha3CodeExists('twi')); + $this->assertTrue(Languages::alpha3CodeExists('tgl')); + $this->assertFalse(Languages::alpha3CodeExists('en')); $this->assertFalse(Languages::alpha3CodeExists('foo')); $this->assertFalse(Languages::alpha3CodeExists('zzz')); } @@ -952,21 +1776,18 @@ class LanguagesTest extends ResourceBundleTestCase */ public function testGetAlpha3Name($displayLocale) { - $names = Languages::getNames($displayLocale); + $names = Languages::getAlpha3Names($displayLocale); - foreach ($names as $alpha2 => $name) { - $alpha3 = self::$alpha2ToAlpha3[$alpha2] ?? false; - if ($alpha3) { - $this->assertSame($name, Languages::getAlpha3Name($alpha3, $displayLocale)); - } + foreach ($names as $language => $name) { + $this->assertSame($name, Languages::getAlpha3Name($language, $displayLocale)); } } - public function testGetAlpha3NameWithInvalidCountryCode() + public function testGetAlpha3NameWithInvalidLanguageCode() { $this->expectException(MissingResourceException::class); - Languages::getAlpha3Name('ZZZ'); + Languages::getAlpha3Name('zzz'); } /** @@ -974,18 +1795,18 @@ class LanguagesTest extends ResourceBundleTestCase */ public function testGetAlpha3Names($displayLocale) { - $names = Languages::getAlpha3Names($displayLocale); + $languages = array_keys($names = Languages::getAlpha3Names($displayLocale)); - $alpha3Codes = array_keys($names); - sort($alpha3Codes); - $this->assertSame(array_values(self::$alpha2ToAlpha3), $alpha3Codes); + sort($languages); - $alpha2Names = Languages::getNames($displayLocale); - foreach ($alpha2Names as $alpha2Code => $name) { - if (!isset(self::$alpha2ToAlpha3[$alpha2Code])) { - unset($alpha2Names[$alpha2Code]); + $this->assertNotEmpty($languages); + $this->assertEmpty(array_diff($languages, self::$alpha3Codes)); + + foreach (Languages::getNames($displayLocale) as $alpha2Code => $name) { + $alpha3Code = self::$alpha2ToAlpha3[$alpha2Code] ?? (3 === \strlen($alpha2Code) ? $alpha2Code : null); + if (null !== $alpha3Code) { + $this->assertSame($name, $names[$alpha3Code]); } } - $this->assertSame(array_values($alpha2Names), array_values($names)); } }