static LANGUAGE_CODES: &[(&str, &str)] = &[
("aar", "Afar"),
("abk", "Abkhazian"),
("ace", "Achinese"),
("ach", "Acoli"),
("ada", "Adangme"),
("afa", "Afro-Asiatic (Other)"),
("afh", "Afrihili"),
("afr", "Afrikaans"),
("aka", "Akan"),
("akk", "Akkadian"),
("alb", "Albanian"),
("ale", "Aleut"),
("alg", "Algonquian languages"),
("amh", "Amharic"),
("ang", "English, Old (ca.450-1100)"),
("apa", "Apache languages"),
("ara", "Arabic"),
("arc", "Aramaic"),
("arm", "Armenian"),
("arn", "Araucanian"),
("arp", "Arapaho"),
("art", "Artificial (Other)"),
("arw", "Arawak"),
("asm", "Assamese"),
("ath", "Athapascan languages"),
("aus", "Australian languages"),
("ava", "Avaric"),
("ave", "Avestan"),
("awa", "Awadhi"),
("aym", "Aymara"),
("aze", "Azerbaijani"),
("bad", "Banda"),
("bai", "Bamileke languages"),
("bak", "Bashkir"),
("bal", "Baluchi"),
("bam", "Bambara"),
("ban", "Balinese"),
("baq", "Basque"),
("bas", "Basa"),
("bat", "Baltic (Other)"),
("bej", "Beja"),
("bel", "Belarusian"),
("bem", "Bemba"),
("ben", "Bengali"),
("ber", "Berber (Other)"),
("bho", "Bhojpuri"),
("bih", "Bihari"),
("bik", "Bikol"),
("bin", "Bini"),
("bis", "Bislama"),
("bla", "Siksika"),
("bnt", "Bantu (Other)"),
("bod", "Tibetan"),
("bos", "Bosnian"),
("bra", "Braj"),
("bre", "Breton"),
("btk", "Batak (Indonesia)"),
("bua", "Buriat"),
("bug", "Buginese"),
("bul", "Bulgarian"),
("bur", "Burmese"),
("cad", "Caddo"),
("cai", "Central American Indian (Other)"),
("car", "Carib"),
("cat", "Catalan"),
("cau", "Caucasian (Other)"),
("ceb", "Cebuano"),
("cel", "Celtic (Other)"),
("ces", "Czech"),
("cha", "Chamorro"),
("chb", "Chibcha"),
("che", "Chechen"),
("chg", "Chagatai"),
("chi", "Chinese"),
("chk", "Chuukese"),
("chm", "Mari"),
("chn", "Chinook jargon"),
("cho", "Choctaw"),
("chp", "Chipewyan"),
("chr", "Cherokee"),
("chu", "Church Slavic"),
("chv", "Chuvash"),
("chy", "Cheyenne"),
("cmc", "Chamic languages"),
("cop", "Coptic"),
("cor", "Cornish"),
("cos", "Corsican"),
("cpe", "Creoles and pidgins,"),
("cpf", "Creoles and pidgins,"),
("cpp", "Creoles and pidgins,"),
("cre", "Cree"),
("crp", "Creoles and pidgins (Other)"),
("cus", "Cushitic (Other)"),
("cym", "Welsh"),
("cze", "Czech"),
("dak", "Dakota"),
("dan", "Danish"),
("day", "Dayak"),
("del", "Delaware"),
("den", "Slave (Athapascan)"),
("deu", "German"),
("dgr", "Dogrib"),
("din", "Dinka"),
("div", "Divehi"),
("doi", "Dogri"),
("dra", "Dravidian (Other)"),
("dua", "Duala"),
("dum", "Dutch, Middle (ca. 1050-1350)"),
("dut", "Dutch"),
("dyu", "Dyula"),
("dzo", "Dzongkha"),
("efi", "Efik"),
("egy", "Egyptian (Ancient)"),
("eka", "Ekajuk"),
("ell", "Greek"),
("elx", "Elamite"),
("eng", "English"),
("enm", "English, Middle (1100-1500)"),
("epo", "Esperanto"),
("est", "Estonian"),
("eus", "Basque"),
("ewe", "Ewe"),
("ewo", "Ewondo"),
("fan", "Fang"),
("fao", "Faroese"),
("fas", "Persian"),
("fat", "Fanti"),
("fij", "Fijian"),
("fin", "Finnish"),
("fiu", "Finno-Ugrian (Other)"),
("fon", "Fon"),
("fra", "French"),
("fre", "French"),
("frm", "French, Middle (ca.1400-1600)"),
("fro", "French, Old (842-ca.1400)"),
("fry", "Frisian"),
("ful", "Fulah"),
("fur", "Friulian"),
("gaa", "Ga"),
("gay", "Gayo"),
("gba", "Gbaya"),
("gem", "Germanic (Other)"),
("geo", "Georgian"),
("ger", "German"),
("gez", "Geez"),
("gil", "Gilbertese"),
("gla", "Gaelic"),
("gle", "Irish"),
("glg", "Gallegan"),
("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)"),
("gre", "Greek"),
("grn", "Guarani"),
("guj", "Gujarati"),
("gwi", "Gwich´in"),
("hai", "Haida"),
("hau", "Hausa"),
("haw", "Hawaiian"),
("heb", "Hebrew"),
("her", "Herero"),
("hil", "Hiligaynon"),
("him", "Himachali"),
("hin", "Hindi"),
("hit", "Hittite"),
("hmn", "Hmong"),
("hmo", "Hiri Motu"),
("hrv", "Croatian"),
("hun", "Hungarian"),
("hup", "Hupa"),
("hye", "Armenian"),
("iba", "Iban"),
("ibo", "Igbo"),
("ice", "Icelandic"),
("ijo", "Ijo"),
("iku", "Inuktitut"),
("ile", "Interlingue"),
("ilo", "Iloko"),
("ina", "Interlingua (International"),
("inc", "Indic (Other)"),
("ind", "Indonesian"),
("ine", "Indo-European (Other)"),
("ipk", "Inupiaq"),
("ira", "Iranian (Other)"),
("iro", "Iroquoian languages"),
("isl", "Icelandic"),
("ita", "Italian"),
("jav", "Javanese"),
("jpn", "Japanese"),
("jpr", "Judeo-Persian"),
("jrb", "Judeo-Arabic"),
("kaa", "Kara-Kalpak"),
("kab", "Kabyle"),
("kac", "Kachin"),
("kal", "Kalaallisut"),
("kam", "Kamba"),
("kan", "Kannada"),
("kar", "Karen"),
("kas", "Kashmiri"),
("kat", "Georgian"),
("kau", "Kanuri"),
("kaw", "Kawi"),
("kaz", "Kazakh"),
("kha", "Khasi"),
("khi", "Khoisan (Other)"),
("khm", "Khmer"),
("kho", "Khotanese"),
("kik", "Kikuyu"),
("kin", "Kinyarwanda"),
("kir", "Kirghiz"),
("kmb", "Kimbundu"),
("kok", "Konkani"),
("kom", "Komi"),
("kon", "Kongo"),
("kor", "Korean"),
("kos", "Kosraean"),
("kpe", "Kpelle"),
("kro", "Kru"),
("kru", "Kurukh"),
("kua", "Kuanyama"),
("kum", "Kumyk"),
("kur", "Kurdish"),
("kut", "Kutenai"),
("lad", "Ladino"),
("lah", "Lahnda"),
("lam", "Lamba"),
("lao", "Lao"),
("lat", "Latin"),
("lav", "Latvian"),
("lez", "Lezghian"),
("lin", "Lingala"),
("lit", "Lithuanian"),
("lol", "Mongo"),
("loz", "Lozi"),
("ltz", "Letzeburgesch"),
("lua", "Luba-Lulua"),
("lub", "Luba-Katanga"),
("lug", "Ganda"),
("lui", "Luiseno"),
("lun", "Lunda"),
("luo", "Luo (Kenya and Tanzania)"),
("lus", "Lushai"),
("mac", "Macedonian"),
("mad", "Madurese"),
("mag", "Magahi"),
("mah", "Marshall"),
("mai", "Maithili"),
("mak", "Makasar"),
("mal", "Malayalam"),
("man", "Mandingo"),
("mao", "Maori"),
("map", "Austronesian (Other)"),
("mar", "Marathi"),
("mas", "Masai"),
("may", "Malay"),
("mdr", "Mandar"),
("men", "Mende"),
("mga", "Irish, Middle (900-1200)"),
("mic", "Micmac"),
("min", "Minangkabau"),
("mis", "Miscellaneous languages"),
("mkd", "Macedonian"),
("mkh", "Mon-Khmer (Other)"),
("mlg", "Malagasy"),
("mlt", "Maltese"),
("mnc", "Manchu"),
("mni", "Manipuri"),
("mno", "Manobo languages"),
("moh", "Mohawk"),
("mol", "Moldavian"),
("mon", "Mongolian"),
("mos", "Mossi"),
("mri", "Maori"),
("msa", "Malay"),
("mul", "Multiple languages"),
("mun", "Munda languages"),
("mus", "Creek"),
("mwr", "Marwari"),
("mya", "Burmese"),
("myn", "Mayan languages"),
("nah", "Nahuatl"),
("nai", "North American Indian (Other)"),
("nau", "Nauru"),
("nav", "Navajo"),
("nbl", "Ndebele, South"),
("nde", "Ndebele, North"),
("ndo", "Ndonga"),
("nds", "Saxon"),
("nep", "Nepali"),
("new", "Newari"),
("nia", "Nias"),
("nic", "Niger-Kordofanian (Other)"),
("niu", "Niuean"),
("nld", "Dutch"),
("nno", "Norwegian Nynorsk"),
("nob", "Norwegian Bokmål"),
("non", "Norse, Old"),
("nor", "Norwegian"),
("nso", "Sotho, Northern"),
("nub", "Nubian languages"),
("nya", "Nyanja"),
("nym", "Nyamwezi"),
("nyn", "Nyankole"),
("nyo", "Nyoro"),
("nzi", "Nzima"),
("oci", "Occitan"),
("oji", "Ojibwa"),
("ori", "Oriya"),
("orm", "Oromo"),
("osa", "Osage"),
("oss", "Ossetian"),
("ota", "Turkish, Ottoman (1500-1928)"),
("oto", "Otomian languages"),
("paa", "Papuan (Other)"),
("pag", "Pangasinan"),
("pal", "Pahlavi"),
("pam", "Pampanga"),
("pan", "Panjabi"),
("pap", "Papiamento"),
("pau", "Palauan"),
("peo", "Persian, Old (ca.600-400 B.C.)"),
("per", "Persian"),
("phi", "Philippine (Other)"),
("phn", "Phoenician"),
("pli", "Pali"),
("pol", "Polish"),
("pon", "Pohnpeian"),
("por", "Portuguese"),
("pra", "Prakrit languages"),
("pro", "Provençal"),
("pus", "Pushto"),
("que", "Quechua"),
("raj", "Rajasthani"),
("rap", "Rapanui"),
("rar", "Rarotongan"),
("roa", "Romance (Other)"),
("roh", "Raeto-Romance"),
("rom", "Romany"),
("ron", "Romanian"),
("rum", "Romanian"),
("run", "Rundi"),
("rus", "Russian"),
("sad", "Sandawe"),
("sag", "Sango"),
("sah", "Yakut"),
("sai", "South American Indian (Other)"),
("sal", "Salishan languages"),
("sam", "Samaritan Aramaic"),
("san", "Sanskrit"),
("sas", "Sasak"),
("sat", "Santali"),
("scc", "Serbian"),
("sco", "Scots"),
("scr", "Croatian"),
("sel", "Selkup"),
("sem", "Semitic (Other)"),
("sga", "Irish, Old (to 900)"),
("sgn", "Sign languages"),
("shn", "Shan"),
("sid", "Sidamo"),
("sin", "Sinhalese"),
("sio", "Siouan languages"),
("sit", "Sino-Tibetan (Other)"),
("sla", "Slavic (Other)"),
("slk", "Slovak"),
("slo", "Slovak"),
("slv", "Slovenian"),
("sme", "Northern Sami"),
("smi", "Sami languages (Other)"),
("smo", "Samoan"),
("sna", "Shona"),
("snd", "Sindhi"),
("snk", "Soninke"),
("sog", "Sogdian"),
("som", "Somali"),
("son", "Songhai"),
("sot", "Sotho, Southern"),
("spa", "Spanish"),
("sqi", "Albanian"),
("srd", "Sardinian"),
("srp", "Serbian"),
("srr", "Serer"),
("ssa", "Nilo-Saharan (Other)"),
("ssw", "Swati"),
("suk", "Sukuma"),
("sun", "Sundanese"),
("sus", "Susu"),
("sux", "Sumerian"),
("swa", "Swahili"),
("swe", "Swedish"),
("syr", "Syriac"),
("tah", "Tahitian"),
("tai", "Tai (Other)"),
("tam", "Tamil"),
("tat", "Tatar"),
("tel", "Telugu"),
("tem", "Timne"),
("ter", "Tereno"),
("tet", "Tetum"),
("tgk", "Tajik"),
("tgl", "Tagalog"),
("tha", "Thai"),
("tib", "Tibetan"),
("tig", "Tigre"),
("tir", "Tigrinya"),
("tiv", "Tiv"),
("tkl", "Tokelau"),
("tli", "Tlingit"),
("tmh", "Tamashek"),
("tog", "Tonga (Nyasa)"),
("ton", "Tonga (Tonga Islands)"),
("tpi", "Tok Pisin"),
("tsi", "Tsimshian"),
("tsn", "Tswana"),
("tso", "Tsonga"),
("tuk", "Turkmen"),
("tum", "Tumbuka"),
("tur", "Turkish"),
("tut", "Altaic (Other)"),
("tvl", "Tuvalu"),
("twi", "Twi"),
("tyv", "Tuvinian"),
("uga", "Ugaritic"),
("uig", "Uighur"),
("ukr", "Ukrainian"),
("umb", "Umbundu"),
("und", "Undetermined"),
("urd", "Urdu"),
("uzb", "Uzbek"),
("vai", "Vai"),
("ven", "Venda"),
("vie", "Vietnamese"),
("vol", "Volapük"),
("vot", "Votic"),
("wak", "Wakashan languages"),
("wal", "Walamo"),
("war", "Waray"),
("was", "Washo"),
("wel", "Welsh"),
("wen", "Sorbian languages"),
("wol", "Wolof"),
("xho", "Xhosa"),
("yao", "Yao"),
("yap", "Yapese"),
("yid", "Yiddish"),
("yor", "Yoruba"),
("ypk", "Yupik languages"),
("zap", "Zapotec"),
("zen", "Zenaga"),
("zha", "Zhuang"),
("zho", "Chinese"),
("znd", "Zande"),
("zul", "Zulu"),
("zun", "Zuni"),
];
#[must_use]
pub fn get_name(code: &str) -> String {
LANGUAGE_CODES
.iter()
.find(|&&(candidate, _)| candidate == code)
.map_or_else(|| code.to_owned(), |&(_, name)| name.to_owned())
}
#[cfg(test)]
mod tests {
use proptest::prelude::{prop_assert_eq, proptest};
use super::{LANGUAGE_CODES, get_name};
#[test]
fn known_codes_map_to_their_names() {
assert_eq!(get_name("eng"), "English");
assert_eq!(get_name("jpn"), "Japanese");
assert_eq!(get_name("fra"), "French");
assert_eq!(get_name("aar"), "Afar"); assert_eq!(get_name("zun"), "Zuni"); }
#[test]
fn iso_639_b_and_t_aliases_share_a_name() {
assert_eq!(get_name("ger"), "German");
assert_eq!(get_name("deu"), "German");
assert_eq!(get_name("alb"), "Albanian");
assert_eq!(get_name("sqi"), "Albanian");
}
#[test]
fn non_ascii_names_are_preserved_verbatim() {
assert_eq!(get_name("gwi"), "Gwich\u{00B4}in");
assert_eq!(get_name("nob"), "Norwegian Bokm\u{00E5}l");
assert_eq!(get_name("pro"), "Proven\u{00E7}al");
assert_eq!(get_name("vol"), "Volap\u{00FC}k");
}
#[test]
fn unknown_code_returns_itself() {
assert_eq!(get_name("xyz"), "xyz");
assert_eq!(get_name(""), "");
}
#[test]
fn lookup_is_case_sensitive() {
assert_eq!(get_name("ENG"), "ENG");
assert_eq!(get_name("Eng"), "Eng");
}
#[test]
fn table_is_sorted_by_code_without_duplicates() {
assert!(LANGUAGE_CODES.is_sorted_by(|a, b| a.0 < b.0));
}
#[test]
fn every_table_entry_round_trips() {
for &(code, name) in LANGUAGE_CODES {
assert_eq!(get_name(code), name);
}
}
proptest! {
#[test]
fn uppercase_codes_are_never_found(code in "[A-Z]{3}") {
prop_assert_eq!(get_name(&code), code);
}
}
}