[Intl] Full alpha3 language support

This commit is contained in:
Roland Franssen 2019-08-13 16:30:57 +02:00
parent 0bdf10a886
commit 29aee2ddf2
5 changed files with 1503 additions and 32 deletions

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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",

View File

@ -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'));
}

View File

@ -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));
}
}