This module checks the validity and internal consistency of the language, language family, and script data used on Wiktionary: the modules in en:Category:Language data modules as well as Module:scripts/data.

Discrepancies detected:

  • Code: EL.. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: LL.. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: LL.. Saw name: Late Latin. Expected name: လပ်တေန်လဇုဲ.
  • Code: ML.. Saw name: Medieval Latin. Expected name: လပ်တေန် ခေတ်လဒေါဝ်.
  • Code: ML.. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: VL.. Saw name: Vulgar Latin. Expected name: လပ်တေန်အရိုင်.
  • Code: VL.. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: aa. Saw name: Afar. Expected name: အဖှာင်.
  • Code: aag. Saw name: Ambrak. Expected name: အာန်ဗရေတ်ခ်.
  • Code: aak. Saw name: Ankave. Expected name: အာန်ခါဝေ.
  • Code: aan. Saw name: Anambé. Expected name: အာန္နာမ်ဗေ.
  • Code: aau. Saw name: Abau. Expected name: အာၜေဴ.
  • Code: aav. Saw name: Austroasiatic. Expected name: အဝ်သတြေဨဃှဳယျာတေတ်.
  • Code: aav-khs-pro. Saw name: Proto-Khasian. Expected name: ခါရှေန်-အခိုက်ကၞာ.
  • Code: aav-pro. Saw name: Proto-Austroasiatic. Expected name: အဝ်သတြေဨချေန်တေတ်-အခိုက်ကၞာ.
  • Code: aaz. Saw name: Amarasi. Expected name: အာန်မာရသဳ.
  • Code: ab. Saw name: Abkhaz. Expected name: အာပ်ဟန်.
  • Code: abe. Saw name: Abenaki. Expected name: အေတ်ဗဒ်နာကဳ.
  • Code: abs. Saw name: Ambonese Malay. Expected name: မလေဝ် အာန်ဗဝ်နေတ်.
  • Code: ace. Saw name: Acehnese. Expected name: အာသံနဳစ်.
  • Code: acw. Saw name: Hijazi Arabic. Expected name: အာရဗဳဟဳဂျာဇြဳ.
  • Code: acy. Saw name: Cypriot Arabic. Expected name: အာရဗဳ သာဲပရေက်.
  • Code: ady. Saw name: Adyghe. Expected name: အာက်ဒေါတ်ကာယ်.
  • Code: ae. Saw name: Avestan. Expected name: အဗါတ်သတေန်.
  • Code: aeb. Saw name: Tunisian Arabic. Expected name: အာရဗဳ တူနဳယှေန်.
  • Code: aem. Saw name: Arem. Expected name: အါန်.
  • Code: af. Saw name: Afrikaans. Expected name: အေက်ဖရိကာန်.
  • Code: afa-pro. Saw name: Proto-Afroasiatic. Expected name: အာက်ပရဝ်အဳသဳယာတေတ်-အခိုက်ကၞာ.
  • Code: afb. Saw name: Gulf Arabic. Expected name: အာရဗဳအထံက်ဂင်.
  • Code: agv. Saw name: Remontado Agta. Expected name: ရောမါန်ဒါဒဝ် အာက်ဂါ.
  • Code: aho. Saw name: Ahom. Expected name: အဟုမ်.
  • Code: aii. Saw name: Assyrian Neo-Aramaic. Expected name: အာက်သဳရိ နဳအဝ်-အာရာမေဣ.
  • Code: ain. Saw name: Ainu. Expected name: အာဲနု.
  • Code: aio. Saw name: Aiton. Expected name: အာဲတောန်.
  • Code: aji. Saw name: Ajië. Expected name: အဂျဳ.
  • Code: ajp. Saw name: South Levantine Arabic. Expected name: အာရဗဳလပ်ဗေန်ထေန်သမၠုင်ကျာ.
  • Code: ak. Saw name: Akan. Expected name: အကာန်.
  • Code: akk. Saw name: Akkadian. Expected name: အခါဒဳယာန်.
  • Code: akl. Saw name: Aklanon. Expected name: အာက်ခလာန်.
  • Code: alc. Saw name: Kawésqar. Expected name: ခါဝေတ်သကာ.
  • Code: alj. Saw name: Alangan. Expected name: အလံင်ဂံင်.
  • Code: als. Saw name: Albanian. Expected name: အလ်ဗနဳယာန်.
  • Code: alt. Saw name: Southern Altai. Expected name: အာန်တာဲ ဒိုဟ်သမၠုင်ကျာ.
  • Code: alu. Saw name: 'Are'are. Expected name: 'အာရေဝ်'အာရာ.
  • Code: ami. Saw name: Amis. Expected name: ဨမေတ်.
  • Code: amm. Saw name: Ama. Expected name: အာမာ.
  • Code: ams. Saw name: Southern Amami Ōshima. Expected name: အမာမဳ-အဝ်ဃှဳမာ လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • Code: amu. Saw name: Guerrero Amuzgo. Expected name: ဂေရေရဝ် အာမတ်သဂဝ်.
  • Code: an. Saw name: Aragonese. Expected name: အာဒါဂေန်.
  • Code: ane. Saw name: Xârâcùù. Expected name: သာရခူ.
  • Code: ang. Saw name: Old English. Expected name: အင်္ဂလိက်တြေံ.
  • Code: anq. Saw name: Jarawa. Expected name: ဂျရာဝါ.
  • Code: aot. Saw name: Atong (India). Expected name: အိန္ဒိ အာတုံ.
  • Code: apc. Saw name: North Levantine Arabic. Expected name: အာရဗဳလပ်ဗေန်ထေန်သၟဝ်ကျာ.
  • Code: apw. Saw name: Western Apache. Expected name: အာဖေန်ချဳ လ္ပာ်ပလိုတ်.
  • Code: ar. Saw name: Arabic. Expected name: အာရဗဳ.
  • Code: arc. Saw name: Aramaic. Expected name: အာရမေအဳ.
  • Code: arn. Saw name: Mapudungun. Expected name: မာၜေအ်ဓုန်ကာန်.
  • Code: ary. Saw name: Moroccan Arabic. Expected name: အာရဗဳ မဝ်ရဝ်ကာန်.
  • Code: arz. Saw name: Egyptian Arabic. Expected name: အာရဗဳ အဳဇေတ်.
  • Code: as. Saw name: Assamese. Expected name: အိသ်ဇြာံမဳ.
  • Code: ask. Saw name: Ashkun. Expected name: အာပ်သကေန်.
  • Code: ast. Saw name: Asturian. Expected name: အေက်သတဝ်ရေန်.
  • Code: ath-pro. Saw name: Proto-Athabaskan. Expected name: အာက်တၜေတ်သကေင်-အခိုက်ကၞာ.
  • Code: avu. Saw name: Avokaya. Expected name: အာတ်ဝါဝ်ခါယျ.
  • Code: awg. Saw name: Anguthimri. Expected name: အာန်ဂူတဳမဳရဳ.
  • Code: ay. Saw name: Aymara. Expected name: အိုင်မာရ.
  • Code: ayl. Saw name: Libyan Arabic. Expected name: အာရဗဳလေတ်ဗျာ.
  • Code: az. Saw name: Azerbaijani. Expected name: အာက်သေတ်ဗါဲဇြေနဳ.
  • Code: azc-nah-pro. Saw name: Proto-Nahuan. Expected name: နာဟာမ်-အခိုက်ကၞာ.
  • Code: azc-pro. Saw name: Proto-Uto-Aztecan. Expected name: ယူတဝ်-အာက်သတေကာန်-အခိုက်ကၞာ.
  • Code: ba. Saw name: Bashkir. Expected name: ဗေတ်ခဳ.
  • Code: ban. Saw name: Balinese. Expected name: ပါလဳနဳ.
  • Code: bar. Saw name: Bavarian. Expected name: ဗာဝါရဳယာန်.
  • Code: bat-pro. Saw name: Proto-Baltic. Expected name: ဗေါဝ်တေတ်-အခိုက်ကၞာ.
  • Code: bat-pro. Saw name: Proto-Balto-Slavic. Expected name: ဗဴတဝ်-သလာဗေတ်-အခိုက်ကၞာ.
  • Code: bbn. Saw name: Uneapa. Expected name: အာန်နဳပါန်.
  • Code: bbr. Saw name: Girawa. Expected name: ဂဳရာဝါ.
  • Code: bcl. Saw name: Bikol Central. Expected name: ၜေဲလ်ဂဝ်လဝ်အဒေါဝ်.
  • Code: bdq. Saw name: Bahnar. Expected name: ဗာနာ.
  • Code: be. Saw name: Belarusian. Expected name: ဗါလာရုဇ်.
  • Code: bej. Saw name: Beja. Expected name: ဗဳဂျာ.
  • Code: ber-pro. Saw name: Proto-Berber. Expected name: ဗေအ်ဗေအ်-အခိုက်ကၞာ.
  • Code: beu. Saw name: Blagar. Expected name: ဗလာဂါ.
  • Code: bft. Saw name: Balti. Expected name: ဗဝ်လ်တဳ.
  • Code: bg. Saw name: Bulgarian. Expected name: ဗူလ်ဂရဳယာန်.
  • Code: bi. Saw name: Bislama. Expected name: ဗဳသလာမာ.
  • Code: bkd. Saw name: Binukid. Expected name: ဗေန်နူကာဒ်.
  • Code: bla. Saw name: Blackfoot. Expected name: ဗလပ်ဖှေက်.
  • Code: blr. Saw name: Blang. Expected name: ဗလင်.
  • Code: blt. Saw name: Tai Dam. Expected name: သေံဓီု.
  • Code: bm. Saw name: Bambara. Expected name: ဗီုဗရာ.
  • Code: bmr. Saw name: Muinane. Expected name: မူအဳနာန်.
  • Code: bn. Saw name: Bengali. Expected name: ဘင်္ဂါလဳ.
  • Code: bnn. Saw name: Bunun. Expected name: ဗုန်ရနာန်.
  • Code: bno. Saw name: Asi. Expected name: အာသဳ.
  • Code: bnq. Saw name: Bantik. Expected name: ဗါန်တေတ်.
  • Code: bnt-phu. Saw name: Phuthi. Expected name: ဖူတ်တဳ.
  • Code: bnt-pro. Saw name: Proto-Bantu. Expected name: ဗာန်တူ-အခိုက်ကၞာ.
  • Code: bo. Saw name: Tibetan. Expected name: တဳဗဝ်.
  • Code: bor. Saw name: Borôro. Expected name: ဗဝ်ဝေဝ်ရဝ်.
  • Code: br. Saw name: Breton. Expected name: ဗရဳတေန်.
  • Code: brg. Saw name: Baure. Expected name: ဗါတ်ရာတ်.
  • Code: brh. Saw name: Brahui. Expected name: ဗရာဝဳ.
  • Code: brx. Saw name: Bodo (India). Expected name: ဗဝ်ဒဝ် (အိန္ဒိယ).
  • Code: bsh. Saw name: Kamkata-viri. Expected name: ကမ်ကတ-ဝဳရိ.
  • Code: bsq. Saw name: Bassa. Expected name: ဗါတ်သာ.
  • Code: bug. Saw name: Buginese. Expected name: ၜေါအ်ဂဳနဳ.
  • Code: byn. Saw name: Blin. Expected name: ဗလေန်.
  • Code: bzj. Saw name: Belizean Creole. Expected name: ဗဳလဳဇေန်ခရဳအဝ်လ် .
  • Code: ca. Saw name: Catalan. Expected name: ကတလာန်.
  • Code: car. Saw name: Kari'na. Expected name: ဂါလဳဗဳကာရေတ်.
  • Code: cbk. Saw name: Chavacano. Expected name: ချာဗာကာနဝ်.
  • Code: ccs-pro. Saw name: Proto-Kartvelian. Expected name: ကောတ်ဗေလဳယာန်-အခိုက်ကၞာ.
  • Code: cdm. Saw name: Chepang. Expected name: ချက်ခ်ဖံင်.
  • Code: ce. Saw name: Chechen. Expected name: ချက်ခ်ချေင်.
  • Code: ceb. Saw name: Cebuano. Expected name: သဲၜေါအ်အာနဝ်.
  • Code: cel. Saw name: Celtic. Expected name: သဲလ်တေတ်.
  • Code: cel-bry-pro. Saw name: Proto-Brythonic. Expected name: ပရေတ်တိုန်နေတ်-အခိုက်ကၞာ.
  • Code: cel-gau. Saw name: Gaulish. Expected name: ဂါလေတ်.
  • Code: cel-pro. Saw name: Proto-Celtic. Expected name: သဲလ်တေတ်-အခိုက်ကၞာ.
  • Code: ch. Saw name: Chamorro. Expected name: ချာမဝ်ရဝ်.
  • Code: chg. Saw name: Chagatai. Expected name: ချာကထိုင်.
  • Code: chk. Saw name: Chuukese. Expected name: ချေူခဳ.
  • Code: chl. Saw name: Cahuilla. Expected name: ခဝ်ဝဳယျာ.
  • Code: chn. Saw name: Chinook Jargon. Expected name: ဃှသ်နေဝ် ဂျာတ်ကေါမ်.
  • Code: cho. Saw name: Choctaw. Expected name: ချံက်ထံက်.
  • Code: chp. Saw name: Chipewyan. Expected name: ချေပ်ပါယ်ဝဳယွာန်.
  • Code: chy. Saw name: Cheyenne. Expected name: သျှေန်အာန်.
  • Code: cic. Saw name: Chickasaw. Expected name: ချဳကာသော.
  • Code: cim. Saw name: Cimbrian. Expected name: သေန်ဗရေန်.
  • Code: cja. Saw name: Western Cham. Expected name: ကျေန်လ္ပာ်ဖာပလိုတ်.
  • Code: cjm. Saw name: Eastern Cham. Expected name: ကျေန်လ္ပာ်ဖာဗၟံက်.
  • Code: cjs. Saw name: Shor. Expected name: သျှိ.
  • Code: ckb. Saw name: Central Kurdish. Expected name: ခဝ်ဒေတ် ဗဟဵု.
  • Code: ckv. Saw name: Kavalan. Expected name: ခါဝါလာန်.
  • Code: cmc-pro. Saw name: Proto-Chamic. Expected name: ချေန်မါတ်-အခိုက်ကၞာ.
  • Code: cmn. Saw name: Mandarin. Expected name: မာန်ဒါရေဝ်.
  • Code: cmn-ear. Saw name: Mandarin. Expected name: မာန်ဒါရေဝ်.
  • Code: cnk. Saw name: Khumi Chin. Expected name: ခူမဳချေင်.
  • Code: cnx. Saw name: Middle Cornish. Expected name: ခမ်နေတ် အဒေါဝ်.
  • Code: co. Saw name: Corsican. Expected name: ခဝ်သဳကာန်.
  • Code: crh. Saw name: Crimean Tatar. Expected name: ခရိုင်မာင်တတာ.
  • Code: cro. Saw name: Crow. Expected name: ခရဝ်.
  • Code: cs. Saw name: Czech. Expected name: ချက်ခ်.
  • Code: csb. Saw name: Kashubian. Expected name: ကသှုဗဳယာန်.
  • Code: ctd. Saw name: Tedim Chin. Expected name: ချေင်တဳတိန်.
  • Code: cu. Saw name: Old Church Slavonic. Expected name: ခရေတ်သလာဗဝ်နေတ်တြေံ.
  • Code: cus-pro. Saw name: Proto-Cushitic. Expected name: ကူဃှဳတေတ်-အခိုက်ကၞာ.
  • Code: cv. Saw name: Chuvash. Expected name: ချူဝါတ်.
  • Code: cy. Saw name: Welsh. Expected name: ဝေလ.
  • Code: da. Saw name: Danish. Expected name: ဒိန်နေတ်.
  • Code: dag. Saw name: Dagbani. Expected name: ဒါဂ်ဗါန်နဳ.
  • Code: dak. Saw name: Dakota. Expected name: ဒါဂဝ်တာ.
  • Code: dcr. Saw name: Negerhollands. Expected name: နောတ်ဂေါတ်ဟဝ်လာန်.
  • Code: de. Saw name: German. Expected name: ဂျာမာန်.
  • Code: dhv. Saw name: Drehu. Expected name: ဒရေဟူ.
  • Code: dje. Saw name: Zarma. Expected name: သာမာ.
  • Code: djk. Saw name: Aukan. Expected name: အဝ်ကာန်.
  • Code: dlm. Saw name: Dalmatian. Expected name: ဒေါန်မေဃှေန်.
  • Code: dng. Saw name: Dungan. Expected name: ဒုန်ကာန်.
  • Code: dra-okn. Saw name: Old Kannada. Expected name: ကာန်နာဒါတြေံ.
  • Code: dsb. Saw name: Lower Sorbian. Expected name: သာဘဳယျာမသဝ်.
  • Code: dum. Saw name: Middle Dutch. Expected name: ဒါတ်အဒေါဝ်.
  • Code: duu. Saw name: Drung. Expected name: ဒျောန်.
  • Code: dv. Saw name: Dhivehi. Expected name: ဒိဝေဟဳ.
  • Code: dz. Saw name: Dzongkha. Expected name: သောင်ခါ.
  • Code: ebk. Saw name: Eastern Bontoc. Expected name: ဗေုန်တေံက် လ္ပာ်ဖာဗၟံက်.
  • Code: ee. Saw name: Ewe. Expected name: အဳဝါ.
  • Code: egl. Saw name: Emilian. Expected name: အဳမဳလဳယာန်.
  • Code: egy. Saw name: Egyptian. Expected name: အဳဂျေပ်.
  • Code: el. Saw name: Greek. Expected name: ဂရေတ်.
  • Code: en. Saw name: English. Expected name: အင်္ဂလိက်.
  • Code: enm. Saw name: Middle English. Expected name: အင်္ဂလိက် အဒေါဝ်.
  • Code: eo. Saw name: Esperanto. Expected name: အေက်သပရေန်တဝ်.
  • Code: es. Saw name: Spanish. Expected name: သပုင်.
  • Code: esx-esk-pro. Saw name: Proto-Eskimo. Expected name: အာက်သကဳမဝ်-အခိုက်ကၞာ.
  • Code: esx-inu-pro. Saw name: Proto-Inuit. Expected name: အိန်ယူအေတ်-အခိုက်ကၞာ.
  • Code: et. Saw name: Estonian. Expected name: အေက်သတဝ်နဳယာန်.
  • Code: ett. Saw name: Etruscan. Expected name: အဳထရေတ်သကာန်.
  • Code: eu. Saw name: Basque. Expected name: ဗက်ခ်.
  • Code: euq-pro. Saw name: Proto-Basque. Expected name: ဗက်ခ်-အခိုက်ကၞာ.
  • Code: evn. Saw name: Evenki. Expected name: အဳပေန်ကဳ.
  • Code: ext. Saw name: Extremaduran. Expected name: အေက်သတရေမဒါဝ်ရာန်.
  • Code: fa. Saw name: Persian. Expected name: ပါရှေန်.
  • Code: fab. Saw name: Annobonese. Expected name: အာန်နဝ်ဗဝ်နေတ်.
  • Code: fax. Saw name: Fala. Expected name: ဖှာင်လာ.
  • Code: ff. Saw name: Fula. Expected name: ဖှောတ်လာ.
  • Code: fi. Saw name: Finnish. Expected name: ဖေန်လာန်.
  • Code: fit. Saw name: Meänkieli. Expected name: မေန်ခဳအာလဳ.
  • Code: fiu-pro. Saw name: Proto-Finno-Ugric. Expected name: ဖေန်နဝ်-ဥူဂရေတ်-အခိုက်ကၞာ.
  • Code: fiu-pro. Saw name: Proto-Uralic. Expected name: ယူရာလေတ်-အခိုက်ကၞာ.
  • Code: fj. Saw name: Fijian. Expected name: ဖရဳဂျိ.
  • Code: fkv. Saw name: Kven. Expected name: ခေဗေါန်.
  • Code: fo. Saw name: Faroese. Expected name: ဖာရဝ်သဳ.
  • Code: fr. Saw name: French. Expected name: ပြင်သေတ်.
  • Code: fr-CA. Saw name: French. Expected name: ပြင်သေတ်.
  • Code: frd. Saw name: Fordata. Expected name: ဖှေန်ဒါတာ.
  • Code: frk. Saw name: Proto-West Germanic. Expected name: ဂျာမာန်နေတ်လက္ကရဴ-အခိုက်ကၞာ.
  • Code: frk. Saw name: Frankish. Expected name: ပြင်ဂေတ်.
  • Code: frm. Saw name: Middle French. Expected name: ပြင်သေတ်အဒေါဝ်.
  • Code: fro. Saw name: Old French. Expected name: ပြင်သေတ်တြေံ.
  • Code: fro-nor. Saw name: Old Northern French. Expected name: ပြင်သေတ်တြေံလ္ပာ်သၟဝ်ကျာ.
  • Code: fro-nor. Saw name: Old French. Expected name: ပြင်သေတ်တြေံ.
  • Code: frp. Saw name: Franco-Provençal. Expected name: ဖပြင်ဂဝ်-ဖရဝ်ပေါန်သာဝ်.
  • Code: frr. Saw name: North Frisian. Expected name: ဖရဳယှေန် သၟဝ်ကျာ.
  • Code: fur. Saw name: Friulian. Expected name: ပရိဥူလဳယာန်.
  • Code: fy. Saw name: West Frisian. Expected name: ဖရေဝ်သဳယာန်လက္ကရဴ.
  • Code: ga. Saw name: Irish. Expected name: အာဲယျာလာန်.
  • Code: gag. Saw name: Gagauz. Expected name: ကာဒ်အာက်.
  • Code: gcf. Saw name: Antillean Creole. Expected name: အာန်တဳလဳယာန် ခရဳအဝ်လ်.
  • Code: gd. Saw name: Scottish Gaelic. Expected name: သကတ်ဂဴလိစ်.
  • Code: gem. Saw name: Germanic. Expected name: ဂျာမာန်နေတ်.
  • Code: gem-pro. Saw name: Proto-Germanic. Expected name: ဂျာမာန်-အခိုက်ကၞာ.
  • Code: gil. Saw name: Gilbertese. Expected name: ဂဳလ်ပါတဳ.
  • Code: gkm. Saw name: Ancient Greek. Expected name: ဂရေတ်တြေံ.
  • Code: gkm. Saw name: Byzantine Greek. Expected name: ဂရေတ် ၜါန်သေန်တိုင်.
  • Code: gl. Saw name: Galician. Expected name: ဂလဳသဳယာန်.
  • Code: gmh. Saw name: Middle High German. Expected name: ဂျာမာန်လဒေါဝ်သၠုင်.
  • Code: gml. Saw name: Middle Low German. Expected name: ဂျာမာန်အဒေါဝ်မသဝ်.
  • Code: gmq. Saw name: North Germanic. Expected name: ဂျာမာန်နေတ် သၟဝ်ကျာ.
  • Code: gmq-mno. Saw name: Middle Norwegian. Expected name: နဝ်ဝေ လဒေါဝ်.
  • Code: gmq-oda. Saw name: Old Danish. Expected name: ဒိန်နေတ်တြေံ.
  • Code: gmq-osw. Saw name: Old Swedish. Expected name: သွဳဒေန်တြေံ.
  • Code: gmq-pro. Saw name: Proto-Norse. Expected name: နဳနိုတ်-အခိုက်ကၞာ.
  • Code: gmw-cfr. Saw name: Central Franconian. Expected name: ဖပြၚ်ကိုဝ်နဳယာန် ဗဟဵု.
  • Code: gmw-ecg. Saw name: East Central German. Expected name: ဂျာမာန် လ္ပာ်ဗၟံက်ဗဟဵု.
  • Code: gmw-jdt. Saw name: Jersey Dutch. Expected name: ဒါတ် ဂျာဇြဳ.
  • Code: gmw-pro. Saw name: Proto-West Germanic. Expected name: ဂျာမာန်နေတ်လက္ကရဴ-အခိုက်ကၞာ.
  • Code: gmy. Saw name: Mycenaean Greek. Expected name: ဂရိမာဲသဳနဳယာန်.
  • Code: gn. Saw name: Guaraní. Expected name: ဂူရာန်နဳ.
  • Code: goh. Saw name: Old High German. Expected name: ဂျာမာန်သၠုင်တြေံ.
  • Code: got. Saw name: Gothic. Expected name: ကာဒ်တေတ်.
  • Code: grc. Saw name: Ancient Greek. Expected name: ဂရေတ်တြေံ.
  • Code: grk-mar. Saw name: Mariupol Greek. Expected name: ဂရိ မာရိအုဖန်.
  • Code: grk-pro. Saw name: Proto-Hellenic. Expected name: ဟေဲလာန်နေတ်-အခိုက်ကၞာ.
  • Code: grt. Saw name: Garo. Expected name: ဂရဝ်.
  • Code: gsw. Saw name: Alemannic German. Expected name: အလဳမာန်နေတ် ဂျာမာန်.
  • Code: gtu. Saw name: Aghu Tharrnggala. Expected name: အဂူ တာရိင်ဂါဠာ.
  • Code: gu. Saw name: Gujarati. Expected name: ဂုဂျာရတဳ.
  • Code: gug. Saw name: Paraguayan Guaraní. Expected name: ပါရာကွာင် ကူရာန်နဳ.
  • Code: gul. Saw name: Gullah. Expected name: ဂုန်လာ.
  • Code: gur. Saw name: Farefare. Expected name: ဟူလာဟူလာ.
  • Code: guw. Saw name: Gun. Expected name: ဂါန်.
  • Code: gv. Saw name: Manx. Expected name: မာက်.
  • Code: ha. Saw name: Hausa. Expected name: ဟဴသာ.
  • Code: haa. Saw name: Hän. Expected name: ဟာန်.
  • Code: hai. Saw name: Haida. Expected name: ဟာဲဒါ.
  • Code: hal. Saw name: Halang. Expected name: ဟာလာန်.
  • Code: haw. Saw name: Hawaiian. Expected name: ဟာဝါဲအဳ.
  • Code: hch. Saw name: Huichol. Expected name: ဟုဲဆျဴ.
  • Code: he. Saw name: Hebrew. Expected name: ဟဳဘရဝ်.
  • Code: hi. Saw name: Hindi. Expected name: ဟိန္ဒဳ.
  • Code: hid. Saw name: Hidatsa. Expected name: ဟဳဒေါတ်သ.
  • Code: hil. Saw name: Hiligaynon. Expected name: ဟဳလဳဂါနန်.
  • Code: hit. Saw name: Hittite. Expected name: ဟေတ်ထိုၚ်.
  • Code: hmx-pro. Saw name: Proto-Hmong-Mien. Expected name: မေန်-မဳယာန်-အခိုက်ကၞာ.
  • Code: ho. Saw name: Hiri Motu. Expected name: ဟဳရဳမိုတု.
  • Code: hop. Saw name: Hopi. Expected name: ဟဝ်ပဳ.
  • Code: hrx. Saw name: Hunsrik. Expected name: ဟာန်သဝေတ်.
  • Code: hsb. Saw name: Upper Sorbian. Expected name: သဝ်ဗဳယျာ လ္ပာ်သၠုင်ကျာ.
  • Code: ht. Saw name: Haitian Creole. Expected name: ဟေဲယှေန် ခရေဝ်အဝ်လ်.
  • Code: hu. Saw name: Hungarian. Expected name: ဟာန်ဂါရေဝ်.
  • Code: hy. Saw name: Armenian. Expected name: အာမေနဳယျာ.
  • Code: ia. Saw name: Interlingua. Expected name: အေန်တာလိင်ဂဝ်.
  • Code: iba. Saw name: Iban. Expected name: အဳဗါန်.
  • Code: id. Saw name: Indonesian. Expected name: အိန်ဒဝ်နဳသဳယျာ.
  • Code: ie. Saw name: Interlingue. Expected name: အေန်တာလိင်ဂဝေ.
  • Code: ifu. Saw name: Mayoyao Ifugao. Expected name: မယောယောန် အဖူကာဝ်.
  • Code: ig. Saw name: Igbo. Expected name: အေတ်ဗါဝ်.
  • Code: igl. Saw name: Igala. Expected name: အဳဂါလာ.
  • Code: ii. Saw name: Nuosu. Expected name: သေဲဆိုန်ယဳ.
  • Code: iir-pro. Saw name: Proto-Indo-Iranian. Expected name: အိန်ဒဝ်-အဳရာန်-အခိုက်ကၞာ.
  • Code: ik. Saw name: Inupiaq. Expected name: အဳနုဗဳယာတ်.
  • Code: ilo. Saw name: Ilocano. Expected name: အဳလဝ်ကာနဝ်.
  • Code: inc-ash. Saw name: Ashokan Prakrit. Expected name: အခါန်ကာန် ပရာကရေတ်.
  • Code: inc-kho. Saw name: Kholosi. Expected name: ခိုဝ်လဝ်သဳ.
  • Code: inc-oas. Saw name: Early Assamese. Expected name: အိသ်ဇြာံမဳကၠာအိုတ်.
  • Code: ine-bsl-pro. Saw name: Proto-Balto-Slavic. Expected name: ဗဴတဝ်-သလာဗေတ်-အခိုက်ကၞာ.
  • Code: ine-pro. Saw name: Proto-Indo-European. Expected name: အိန်ဒဝ်-ယူရဝ်ပဳယာန်-အခိုက်ကၞာ.
  • Code: ine-toc-pro. Saw name: Proto-Tocharian. Expected name: ထေဝ်ခါမ်ရေဝ်ယာန်-အခိုက်ကၞာ.
  • Code: io. Saw name: Ido. Expected name: ဣဒဝ်.
  • Code: ira-pro. Saw name: Proto-Iranian. Expected name: အဳရာန်-အခိုက်ကၞာ.
  • Code: is. Saw name: Icelandic. Expected name: အာက်သလာန်.
  • Code: ist. Saw name: Istriot. Expected name: အေတ်သထရဳအိုတ်.
  • Code: it. Saw name: Italian. Expected name: အဳတခ်လဳ.
  • Code: itc-ola. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: itc-pro. Saw name: Proto-Italic. Expected name: အခိုက်ကၞာ-မလိက်ဒစေင်.
  • Code: iu. Saw name: Inuktitut. Expected name: ဣနုက်တိတုတ်.
  • Code: ivb. Saw name: Ibatan. Expected name: အဳဗါတေန်.
  • Code: izh. Saw name: Ingrian. Expected name: အင်္ဂရေဝ်ယာန်.
  • Code: ja. Saw name: Japanese. Expected name: ဂျပါန်.
  • Code: jct. Saw name: Krymchak. Expected name: ခရေန်သျှောတ်.
  • Code: jje. Saw name: Jeju. Expected name: ချဲဇူ.
  • Code: jpx-pro. Saw name: Proto-Japonic. Expected name: ဂျဖါန်နေတ်-အခိုက်ကၞာ.
  • Code: jpx-ryu-pro. Saw name: Proto-Ryukyuan. Expected name: ရေဝ်ကယူ-အခိုက်ကၞာ.
  • Code: jra. Saw name: Jarai. Expected name: ဂျာရိုင်.
  • Code: juc. Saw name: Jurchen. Expected name: ဂျေန်ချေန်.
  • Code: jv. Saw name: Javanese. Expected name: ဂျာဗာ.
  • Code: ka. Saw name: Georgian. Expected name: ဂျဝ်ဂျဳယျာ.
  • Code: kaa. Saw name: Karakalpak. Expected name: ကာရာကာလပက်.
  • Code: kab. Saw name: Kabyle. Expected name: ကာဗေန်အဝ်.
  • Code: kac. Saw name: Jingpho. Expected name: ကချေင်.
  • Code: kam. Saw name: Kamba. Expected name: ကေန်ဗာ.
  • Code: kar-pro. Saw name: Proto-Karen. Expected name: ကရေင်-အခိုက်ကၞာ.
  • Code: kaw. Saw name: Old Javanese. Expected name: ဂျာဗာတြေံ.
  • Code: kbd. Saw name: Kabardian. Expected name: ခါပါဒဳယာန်.
  • Code: kcg. Saw name: Tyap. Expected name: ထိုင်အာက်.
  • Code: kdr. Saw name: Karaim. Expected name: ကာရေန်.
  • Code: kea. Saw name: Kabuverdianu. Expected name: ခါၜေါအ်အဝ်ဒဳယဴနူ.
  • Code: kek. Saw name: Q'eqchi. Expected name: ခဳ'ချဳ.
  • Code: ket. Saw name: Ket. Expected name: ခေပ်.
  • Code: kha. Saw name: Khasi. Expected name: ခါသဳ.
  • Code: khb. Saw name: Lü. Expected name: သေံလု.
  • Code: khi-kun. Saw name: ǃKung. Expected name: ခါမ်.
  • Code: kht. Saw name: Khamti. Expected name: သေံခဂၞဳ.
  • Code: ki. Saw name: Kikuyu. Expected name: ခဳခူယူ.
  • Code: kim. Saw name: Tofa. Expected name: တဝ်ဖှာ.
  • Code: kjh. Saw name: Khakas. Expected name: ခါခေတ်.
  • Code: kk. Saw name: Kazakh. Expected name: ကဇက်.
  • Code: kl. Saw name: Greenlandic. Expected name: ဂရိန်လာန်.
  • Code: kls. Saw name: Kalasha. Expected name: ကလာချာ.
  • Code: klv. Saw name: Maskelynes. Expected name: မာတ်သခေလေါန်.
  • Code: klw. Saw name: Lindu. Expected name: လေန်ဒူ.
  • Code: km. Saw name: Khmer. Expected name: ခမေန်.
  • Code: kmb. Saw name: Kimbundu. Expected name: ခေင်ဗွိုန်ဒူန်.
  • Code: kmc. Saw name: Southern Kam. Expected name: ကါမ် လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • Code: kmk. Saw name: Limos Kalinga. Expected name: လေန်မဝ်သေန် ကလေန်ဂါ.
  • Code: kmr. Saw name: Northern Kurdish. Expected name: ကာဒ် လ္ပာ်သၟဝ်ကျာ.
  • Code: knf. Saw name: Mankanya. Expected name: မေန်ခမ်ယျာ.
  • Code: ko. Saw name: Korean. Expected name: ကိုဝ်ရဳယျာ.
  • Code: kok. Saw name: Konkani. Expected name: ခေန်ကနဳ.
  • Code: kpm. Saw name: Koho. Expected name: ကိုဝ်ဟဝ်.
  • Code: kpv. Saw name: Komi-Zyrian. Expected name: ခဝ်မဳ-သဳရေဝ်ယာန်.
  • Code: kpw. Saw name: Kobon. Expected name: ကဝ်ဗေန်.
  • Code: kr. Saw name: Kanuri. Expected name: ကနူရဳ.
  • Code: kri. Saw name: Krio. Expected name: ခရိအဝ်.
  • Code: krj. Saw name: Kinaray-a. Expected name: ခဳနာရော-အာ.
  • Code: krl. Saw name: Karelian. Expected name: ခါရေဝ်လဳယာန်.
  • Code: ks. Saw name: Kashmiri. Expected name: ကာဒ်ရှ်မဳယျာ.
  • Code: ksd. Saw name: Tolai. Expected name: တဝ်လာၚ်.
  • Code: ksi. Saw name: Krisa. Expected name: ခရေတ်သ.
  • Code: ksw. Saw name: S'gaw Karen. Expected name: ကရေင်သကဵု.
  • Code: kum. Saw name: Kumyk. Expected name: ခူမာတ်.
  • Code: kus. Saw name: Kusaal. Expected name: ကူသာလ်.
  • Code: kw. Saw name: Cornish. Expected name: ခမ်နေတ်.
  • Code: kwk. Saw name: Kwak'wala. Expected name: ခွါကွာ'ဝလာ.
  • Code: kxd. Saw name: Brunei Malay. Expected name: မလေဝ် ဗရုနာဲ.
  • Code: ky. Saw name: Kyrgyz. Expected name: ကာဇေတ်.
  • Code: kzg. Saw name: Kikai. Expected name: ခဳခါဲ.
  • Code: la. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: la-ecc. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: la-lat. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: la-lat. Saw name: Late Latin. Expected name: လပ်တေန်လဇုဲ.
  • Code: la-med. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: la-med. Saw name: Medieval Latin. Expected name: လပ်တေန် ခေတ်လဒေါဝ်.
  • Code: la-vul. Saw name: Vulgar Latin. Expected name: လပ်တေန်အရိုင်.
  • Code: la-vul. Saw name: Latin. Expected name: လပ်တေန်.
  • Code: lac. Saw name: Lacandon. Expected name: လပ်ခေန်ဒေါန်.
  • Code: lad. Saw name: Ladino. Expected name: လာဒဳနဝ်.
  • Code: lb. Saw name: Luxembourgish. Expected name: လူဇေန်ဘာဂျ်.
  • Code: lg. Saw name: Luganda. Expected name: လုဂန်ဒါ.
  • Code: lhu. Saw name: Lahu. Expected name: လာဟူ.
  • Code: li. Saw name: Limburgish. Expected name: လိမ်ဗူရ်ဂိသ်.
  • Code: lic. Saw name: Hlai. Expected name: လာဲ.
  • Code: lif. Saw name: Limbu. Expected name: လေန်ၜေါအ်.
  • Code: lij. Saw name: Ligurian. Expected name: လဳဂူရေဝ်ယာန်.
  • Code: liv. Saw name: Livonian. Expected name: လဳၜိုနဳယာန်.
  • Code: lkt. Saw name: Lakota. Expected name: လာဂဝ်တ.
  • Code: lld. Saw name: Ladin. Expected name: လာဒေန်.
  • Code: lmo. Saw name: Lombard. Expected name: လံဗာတ်.
  • Code: ln. Saw name: Lingala. Expected name: လေန်ဂါလာ.
  • Code: lng. Saw name: Old High German. Expected name: ဂျာမာန်သၠုင်တြေံ.
  • Code: lng. Saw name: Lombardic. Expected name: လီုဗါဒေါတ်.
  • Code: lo. Saw name: Lao. Expected name: သေံလဴ.
  • Code: loj. Saw name: Lou. Expected name: ဠူ.
  • Code: lou. Saw name: Louisiana Creole. Expected name: ပြင်သေတ် လူဝဳသဳယျာနာ ခရေဝ်အဝ်.
  • Code: lsi. Saw name: Lashi. Expected name: လာယှဳ.
  • Code: lt. Saw name: Lithuanian. Expected name: လေတ်တူယဵုနဳယျာ.
  • Code: ltc. Saw name: Middle Chinese. Expected name: ကြုက်လဒေါဝ်.
  • Code: ltg. Saw name: Latgalian. Expected name: လပ်ဂါလဳယာန်.
  • Code: lud. Saw name: Ludian. Expected name: ဠူဒဳယာန်.
  • Code: lus. Saw name: Mizo. Expected name: မဳသုဝ်.
  • Code: lut. Saw name: Lushootseed. Expected name: ဠူသၠာ်သဳ.
  • Code: lv. Saw name: Latvian. Expected name: လပ်ဗဳယာ.
  • Code: lzz. Saw name: Laz. Expected name: လာတ်.
  • Code: mad. Saw name: Madurese. Expected name: မာဒူရေတ်.
  • Code: mag. Saw name: Magahi. Expected name: မာဂါဟဳ.
  • Code: mak. Saw name: Makasar. Expected name: မကာသာ.
  • Code: map-pro. Saw name: Proto-Austronesian. Expected name: အဝ်သတြေနဳယှေန်-အခိုက်ကၞာ.
  • Code: maw. Saw name: Mampruli. Expected name: မာံပရဝ်လဳ.
  • Code: mba. Saw name: Higaonon. Expected name: ဟဳကာအောန်နန်.
  • Code: mbd. Saw name: Dibabawon Manobo. Expected name: ဒိဗာဗာဝေန် မာနဝ်ဗဝ်.
  • Code: mch. Saw name: Ye'kwana. Expected name: ယျေကွာနာ.
  • Code: mdf. Saw name: Moksha. Expected name: မောက္ခ.
  • Code: mdh. Saw name: Maguindanao. Expected name: မဂေါန်ဒါနာနှဴ.
  • Code: mel. Saw name: Central Melanau. Expected name: မာလာနၞဴ ဗဟဵု.
  • Code: men. Saw name: Mende. Expected name: မါန်ဒဳ.
  • Code: mfe. Saw name: Mauritian Creole. Expected name: မဝ်ရေတ်ဃှေန် ခရဳအဝ်.
  • Code: mfh. Saw name: Matal. Expected name: မာက်ထေန်.
  • Code: mg. Saw name: Malagasy. Expected name: မာလာဂါသဳ.
  • Code: mga. Saw name: Middle Irish. Expected name: အာဲရိစ်အဒေါဝ်.
  • Code: mh. Saw name: Marshallese. Expected name: မာချဲလဳ.
  • Code: mhn. Saw name: Mòcheno. Expected name: မဝ်ချေန်နဝ်.
  • Code: mhr. Saw name: Eastern Mari. Expected name: မာရေဝ် လ္ပာ်ဖာဗၟံက်.
  • Code: mhx. Saw name: Lhao Vo. Expected name: လဴဝါဝ်.
  • Code: mi. Saw name: Maori. Expected name: မဝ်ရဳ.
  • Code: mih. Saw name: Chayuco Mixtec. Expected name: ချာဲယူကိုဝ် မေတ်သတာတ်.
  • Code: min. Saw name: Minangkabau. Expected name: မဳနင်ကာဗေဴ.
  • Code: mk. Saw name: Macedonian. Expected name: မက်သဳဒဝ်နဳယျာ.
  • Code: mkh-ban-pro. Saw name: Proto-Bahnaric. Expected name: ဗာနာရေတ်-အခိုက်ကၞာ.
  • Code: mkh-pro. Saw name: Proto-Mon-Khmer. Expected name: မန်-ခမေန်-အခိုက်ကၞာ.
  • Code: mkh-vie-pro. Saw name: Proto-Vietic. Expected name: ဗဳယေတ်ဒါသ်-အခိုက်ကၞာ.
  • Code: ml. Saw name: Malayalam. Expected name: မလေဝ်ယျလာမ်.
  • Code: mn. Saw name: Mongolian. Expected name: မန်ဂဝ်လဳယျာ.
  • Code: mnc. Saw name: Manchu. Expected name: မာန်ချူ.
  • Code: mnk. Saw name: Mandinka. Expected name: မာန်ဒေန်ကာ.
  • Code: mnw. Saw name: Mon. Expected name: မန်.
  • Code: moa. Saw name: Mwan. Expected name: မးဝါန်.
  • Code: moh. Saw name: Mohawk. Expected name: မဝ်ဟေတ်.
  • Code: mop. Saw name: Mopan Maya. Expected name: မဝ်ပါန် မာယျာ.
  • Code: mos. Saw name: Moore. Expected name: မွယ်.
  • Code: mpg. Saw name: Marba. Expected name: မာဗ.
  • Code: mqs. Saw name: West Makian. Expected name: မခဳယာန် လ္ပာ်ပလိုတ်.
  • Code: mr. Saw name: Marathi. Expected name: မာရဒဳ.
  • Code: mrc. Saw name: Maricopa. Expected name: မာရိခဝ်ပါ.
  • Code: mro. Saw name: Mru. Expected name: မရုန်သာ.
  • Code: mrw. Saw name: Maranao. Expected name: မာရာနဴ.
  • Code: ms. Saw name: Malay. Expected name: မလေဝ်.
  • Code: ms-cla. Saw name: Classical Malay. Expected name: မလေဝ် ဝင်ဂန္တ.
  • Code: ms-cla. Saw name: Malay. Expected name: မလေဝ်.
  • Code: ms-old. Saw name: Old Malay. Expected name: မလေဝ်တြေံ.
  • Code: ms-old. Saw name: Malay. Expected name: မလေဝ်.
  • Code: msn. Saw name: Vurës. Expected name: ဝူရေတ်.
  • Code: mt. Saw name: Maltese. Expected name: မာလ်တဳ.
  • Code: mtq. Saw name: Muong. Expected name: မေိန်.
  • Code: mul. Saw name: Translingual. Expected name: မအရေဝ်ပံင်ကောံ.
  • Code: mvi. Saw name: Miyako. Expected name: မိယျာကအ်.
  • Code: mwl. Saw name: Mirandese. Expected name: မဳရာန်ဒါက်.
  • Code: mww. Saw name: White Hmong. Expected name: ဝေါန်မါန်.
  • Code: my. Saw name: Burmese. Expected name: ဗၟာ.
  • Code: myv. Saw name: Erzya. Expected name: အာဝ်သဳယျာ.
  • Code: na. Saw name: Nauruan. Expected name: နာဥူလောန်.
  • Code: nan. Saw name: Min Nan. Expected name: ကြုက်-မိန်နန်.
  • Code: nan-hbl. Saw name: Hokkien. Expected name: ဟုပ်ကဳယာန်.
  • Code: nap. Saw name: Neapolitan. Expected name: နဳပဝ်လဳတေန်.
  • Code: nb. Saw name: Norwegian Bokmål. Expected name: နဝ်ဝေ ဗော်ခ်မဝ်.
  • Code: ncg. Saw name: Nisga'a. Expected name: နေတ်သကာ.
  • Code: nci. Saw name: Classical Nahuatl. Expected name: နာဝါတ်ဒဝ်ဝင်ဂန္ထ.
  • Code: nds. Saw name: Low German. Expected name: ဂျာမာန်မသဝ်.
  • Code: nds-de. Saw name: German Low German. Expected name: ဂျာမာန်မသဝ်ဂျာမာန်.
  • Code: nds-nl. Saw name: Dutch Low Saxon. Expected name: ဒါတ် လဝ်သက်သာန်.
  • Code: ne. Saw name: Nepali. Expected name: နဳပဝ်.
  • Code: nfl. Saw name: Äiwoo. Expected name: အာဲဝူ.
  • Code: nhe. Saw name: Eastern Huasteca Nahuatl. Expected name: ဝါသတေကာ နာဝါတော လ္ပာ်ဖာဗၟံက်.
  • Code: nhx. Saw name: Mecayapan Nahuatl. Expected name: မကာယျာပါံ နာဝါတဝ်.
  • Code: nia. Saw name: Nias. Expected name: နဳယျာ.
  • Code: nio. Saw name: Nganasan. Expected name: နၞဴနေတ်သာန်.
  • Code: niv. Saw name: Nivkh. Expected name: နိဖှေတ်.
  • Code: njz. Saw name: Nyishi. Expected name: နာ်ယဳဃှဳ.
  • Code: nl. Saw name: Dutch. Expected name: ဒါတ်.
  • Code: nn. Saw name: Norwegian Nynorsk. Expected name: နဝ်ဝေ နဳနိုတ်.
  • Code: no. Saw name: Norwegian. Expected name: နဝ်ဝေ.
  • Code: nod. Saw name: Northern Thai. Expected name: သေံသၟဝ်ကျာ.
  • Code: nog. Saw name: Nogai. Expected name: နဝ်ကာယ်.
  • Code: non. Saw name: Old Norse. Expected name: နဳနိုတ်တြေံ.
  • Code: non-oen. Saw name: Old Norse. Expected name: နဳနိုတ်တြေံ.
  • Code: nr. Saw name: Southern Ndebele. Expected name: အာန်ဒေဗေလေဝ် လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • Code: nrf. Saw name: Norman. Expected name: နဝ်မေံ.
  • Code: nrn. Saw name: Norn. Expected name: နန်.
  • Code: ntp. Saw name: Northern Tepehuan. Expected name: ထေပ်ပုဝ်ဝါန် လ္ပာ်သၟဝ်ကျာ.
  • Code: nuk. Saw name: Nootka. Expected name: နှတ်တက.
  • Code: nup. Saw name: Nupe. Expected name: နူပဳ.
  • Code: nus. Saw name: Nuer. Expected name: နူအေ.
  • Code: nut. Saw name: Nùng. Expected name: နောန်.
  • Code: nv. Saw name: Navajo. Expected name: နာဝါဟဝ်.
  • Code: ny. Saw name: Chichewa. Expected name: ချဳချေန်ဝါ.
  • Code: nza. Saw name: Tigon Mbembe. Expected name: ထိုင်ဂန် အာန်ဗာန်ဗေ.
  • Code: nzd. Saw name: Nzadi. Expected name: နဇာဒဳ.
  • Code: obr. Saw name: Old Burmese. Expected name: ဗၟာတြေံ.
  • Code: obt. Saw name: Old Breton. Expected name: ဗရဳတေန်တြေံ.
  • Code: oc. Saw name: Occitan. Expected name: အောက်စဳတာန်.
  • Code: och. Saw name: Old Chinese. Expected name: ကြုက်တြေံ.
  • Code: oco. Saw name: Old Cornish. Expected name: ခမ်နေတ်တြေံ.
  • Code: odt. Saw name: Old Dutch. Expected name: ဒါတ်တြေံ.
  • Code: ofs. Saw name: Old Frisian. Expected name: ဖရေဝ်သဳယာန်တြေံ.
  • Code: oge. Saw name: Old Georgian. Expected name: ဂျဝ်ဂျဳယျာတြေံ.
  • Code: ohu. Saw name: Old Hungarian. Expected name: ဟာန်ဂါရေဝ်တြေံ.
  • Code: oj. Saw name: Ojibwe. Expected name: အဝ်ဂျဳဗဝေ.
  • Code: ojp. Saw name: Old Japanese. Expected name: ဂျပါန်တြေံ.
  • Code: oka. Saw name: Okanagan. Expected name: အဝ်ခေန်နာဂါမ်.
  • Code: okm. Saw name: Middle Korean. Expected name: ကိုဝ်ရဳယျာအဒေါဝ်.
  • Code: okn. Saw name: Okinoerabu. Expected name: အဝ်ကဳ-နဝ်-အဳရေတ်ၜေအ်.
  • Code: oko. Saw name: Old Korean. Expected name: ကိုဝ်ရဳယျာတြေံ.
  • Code: okz. Saw name: Old Khmer. Expected name: ခမေန်တြေံ.
  • Code: okz-ang. Saw name: Angkorian Old Khmer. Expected name: ခမေန်တြေံ အာန်ခေါဝ်ရဳယာန်.
  • Code: okz-ang. Saw name: Old Khmer. Expected name: ခမေန်တြေံ.
  • Code: olo. Saw name: Livvi. Expected name: လေတ်ဝဳ.
  • Code: om. Saw name: Oromo. Expected name: အဝ်ရဝ်မဝ်.
  • Code: omx. Saw name: Old Mon. Expected name: မန်တြေံ.
  • Code: ood. Saw name: O'odham. Expected name: အဝ်ဟောံတံင်.
  • Code: oon. Saw name: Önge. Expected name: အၚ်္ၚါ.
  • Code: orv. Saw name: Old East Slavic. Expected name: သလာဗေတ်ဗၟံက်တြေံ.
  • Code: os. Saw name: Ossetian. Expected name: အဝ်ဇြဳယာန်.
  • Code: osc. Saw name: Oscan. Expected name: အဝ်သကာန်.
  • Code: osp. Saw name: Old Spanish. Expected name: သပုင်တြေံ.
  • Code: osx. Saw name: Old Saxon. Expected name: သာတ်သိုန်တြေံ.
  • Code: ota. Saw name: Ottoman Turkish. Expected name: တူရကဳအောက်ဒဝ်မာန်.
  • Code: otk. Saw name: Old Turkic. Expected name: တာခ်ကေတ်တြေံ.
  • Code: otw. Saw name: Ottawa. Expected name: အိုတ်တဝါ.
  • Code: oui. Saw name: Old Uyghur. Expected name: ဝဳဂါယ်တြေံ.
  • Code: ovd. Saw name: Elfdalian. Expected name: အာန်လ်ဖလဳယာန်.
  • Code: owl. Saw name: Old Welsh. Expected name: ဝေလတြေံ.
  • Code: pa. Saw name: Punjabi. Expected name: ပါန်ချာပဳ.
  • Code: paa-nha-pro. Saw name: Proto-North Halmahera. Expected name: ဟာဴမာဟေရာ သၟဝ်ကျာ-အခိုက်ကၞာ.
  • Code: pac. Saw name: Pacoh. Expected name: ပခိုဝ်.
  • Code: pag. Saw name: Pangasinan. Expected name: ပါန်ဂါသဳနာန်.
  • Code: pal. Saw name: Middle Persian. Expected name: ဖာသဳအဒေါဝ်.
  • Code: pam. Saw name: Kapampangan. Expected name: ခါပ်ပုံဖေါန်ဂါမ်.
  • Code: pap. Saw name: Papiamentu. Expected name: ပါဲပဳယာန်မာန်တူ.
  • Code: pau. Saw name: Palauan. Expected name: ပါလံင်ဝေတ်.
  • Code: pbv. Saw name: Pnar. Expected name: ဖဳနာ.
  • Code: pcc. Saw name: Bouyei. Expected name: ၜေါအ်ဣ.
  • Code: pcm. Saw name: Nigerian Pidgin. Expected name: နာဲဂျဳရဳယျာ ဖေါန်ဂျေန်.
  • Code: pdc. Saw name: Pennsylvania German. Expected name: ဂျာမာန် ပေန်သဲဗေနဳယျာ.
  • Code: pdt. Saw name: Plautdietsch. Expected name: ဖလာက်ဒဳ.
  • Code: pdu. Saw name: Kayan. Expected name: ကယျာန်.
  • Code: peh. Saw name: Bonan. Expected name: ဗါဝ်နာန်.
  • Code: peo. Saw name: Old Persian. Expected name: ဖာသဳတြေံ.
  • Code: phi-pro. Saw name: Proto-Philippine. Expected name: ဖိလေတ်ပိုင်-အခိုက်ကၞာ.
  • Code: phk. Saw name: Phake. Expected name: ဖကာဲ.
  • Code: phl. Saw name: Phalura. Expected name: ဖလူရ.
  • Code: phn. Saw name: Phoenician. Expected name: ဖဳနေတ်ယှေန်.
  • Code: pi. Saw name: Pali. Expected name: ပါဠိ.
  • Code: pjt. Saw name: Pitjantjatjara. Expected name: ဗှေတ်ဂျေန်ကျေတ်ဂျာရာ.
  • Code: pkc. Saw name: Baekje. Expected name: ဘာတ်ဇာ.
  • Code: pl. Saw name: Polish. Expected name: ပဝ်လာန်.
  • Code: ple. Saw name: Palu'e. Expected name: ပါဋ္ဌူအာယ်.
  • Code: plv. Saw name: Southwest Palawano. Expected name: ပါလာဝါနဝ် ဒိုတ်ပလိုတ်သမၠုင်ကျာ.
  • Code: plw. Saw name: Brooke's Point Palawano. Expected name: ပါလာဝါနဝ် ဗရှေတ်ခ်ဗေါန်.
  • Code: pml. Saw name: Sabir. Expected name: သဗဳယျ.
  • Code: pms. Saw name: Piedmontese. Expected name: ဖေတ်မန်တာယ်သောတ်.
  • Code: pov. Saw name: Guinea-Bissau Creole. Expected name: ဂဳနဳ-ဗေတ်သော ခရဳအဝ်လ်.
  • Code: pox. Saw name: Polabian. Expected name: ပဝ်လာဗဳယာန်.
  • Code: poz-cet-pro. Saw name: Proto-Central-Eastern Malayo-Polynesian. Expected name: မလာယဝ်-ပဝ်လဳနဳယှာ ဗဟဵု-လ္ပာ်ဖာဗၟံက်-အခိုက်ကၞာ.
  • Code: poz-mcm-pro. Saw name: Proto-Malayo-Chamic. Expected name: မာလာယဝ်-ချေန်မေတ်-အခိုက်ကၞာ.
  • Code: poz-mly-pro. Saw name: Proto-Malayic. Expected name: မလေဝ်လေတ်-အခိုက်ကၞာ.
  • Code: poz-msa-pro. Saw name: Proto-Malayo-Sumbawan. Expected name: သာန်ပါဝါန်-မလာဲယဝ်-အခိုက်ကၞာ.
  • Code: poz-oce-pro. Saw name: Proto-Oceanic. Expected name: အဝ်ဃှဳယျာနေတ်-အခိုက်ကၞာ.
  • Code: poz-pep-pro. Saw name: Proto-Eastern Polynesian. Expected name: ပဝ်လဳနဳဃှေန် လ္ပာ်ဖာဗၟံက်-အခိုက်ကၞာ.
  • Code: poz-pnp-pro. Saw name: Proto-Nuclear Polynesian. Expected name: နူကလဳယျာ ပဝ်လဳနဳဃှေန်-အခိုက်ကၞာ.
  • Code: poz-pol-pro. Saw name: Proto-Polynesian. Expected name: ပဝ်လဳနဳဃှေန်-အခိုက်ကၞာ.
  • Code: poz-pro. Saw name: Proto-Malayo-Polynesian. Expected name: မာလာယို-ပဝ်လဳနဳယျာ-အခိုက်ကၞာ.
  • Code: pqe-pro. Saw name: Proto-Eastern Malayo-Polynesian. Expected name: မာလာယဝ်-ပဝ်လဳနဳဃှေန် လ္ပာ်ဖာဗၟံက်-အခိုက်ကၞာ.
  • Code: pra. Saw name: Prakrit. Expected name: ပရာကရေတ်.
  • Code: prc. Saw name: Parachi. Expected name: ပါရာချဳ.
  • Code: prg. Saw name: Old Prussian. Expected name: ပရာတ်ဃှေန်တြေံ.
  • Code: pro. Saw name: Old Occitan. Expected name: အောက်စဳတာန်တြေံ.
  • Code: ps. Saw name: Pashto. Expected name: ပါသတုန်.
  • Code: pt. Saw name: Portuguese. Expected name: ပဝ်တူဂြဳ.
  • Code: pwn. Saw name: Paiwan. Expected name: ဖါဲဝါန်.
  • Code: qfa-lic-pro. Saw name: Proto-Hlai. Expected name: လာဲ-အခိုက်ကၞာ.
  • Code: qfa-sub. Saw name: substrate. Expected name: သေပ်သတွေန်.
  • Code: qfa-yen-pro. Saw name: Proto-Yeniseian. Expected name: ယေနဳသဳယာန်-အခိုက်ကၞာ.
  • Code: qsb-ibe. Saw name: Undetermined. Expected name: ပဆုဲလဇလဝ်.
  • Code: qu. Saw name: Quechua. Expected name: ခေန်ချူဝါ.
  • Code: quc. Saw name: K'iche'. Expected name: ခိတ်လ်.
  • Code: rap. Saw name: Rapa Nui. Expected name: ဝါတ်ပါန်နူဝဳ.
  • Code: raw. Saw name: Rawang. Expected name: ရဝါန်.
  • Code: rgn. Saw name: Romagnol. Expected name: ရဝ်မာယာန်.
  • Code: rhg. Saw name: Rohingya. Expected name: ရဝ်ဟေင်ဂျာ.
  • Code: rki. Saw name: Rakhine. Expected name: ရခေင်.
  • Code: rm. Saw name: Romansch. Expected name: ရဝ်မာန်.
  • Code: rme. Saw name: Angloromani. Expected name: အၚ်္ဂဠဝ်ရဝ်မာနဳ.
  • Code: rmg. Saw name: Traveller Norwegian. Expected name: နဝ်ဝေ ထာတ်ပလေန်.
  • Code: rmq. Saw name: Caló. Expected name: ကာလဝ်.
  • Code: rmt. Saw name: Domari. Expected name: ဒဝ်မာရေဝ်.
  • Code: rng. Saw name: Ronga. Expected name: ရံင်ကာ.
  • Code: ro. Saw name: Romanian. Expected name: ရဝ်မေနဳယျာ.
  • Code: roa. Saw name: Romance. Expected name: ရဝ်မာံ.
  • Code: roa-brg. Saw name: Bourguignon. Expected name: ၜေအ်ကဳယာဝ်.
  • Code: roa-fcm. Saw name: Franc-Comtois. Expected name: ဖရာန်အ်-ခါမ်တဝ်.
  • Code: roa-gal. Saw name: Gallo. Expected name: ဂဲဠဝ်.
  • Code: roa-leo. Saw name: Leonese. Expected name: လဳအဝ်နေတ်.
  • Code: roa-oca. Saw name: Old Catalan. Expected name: ကတလာန်တြေံ.
  • Code: roa-ole. Saw name: Old Leonese. Expected name: လဳအဝ်နေတ်တြေံ.
  • Code: roa-opt. Saw name: Old Galician-Portuguese. Expected name: ပဝ်တူဂြဳတြေံ.
  • Code: roa-tar. Saw name: Tarantino. Expected name: ထာရာန်တဳနဝ်.
  • Code: rom. Saw name: Romani. Expected name: ရဝ်မာနဳ.
  • Code: roo. Saw name: Rotokas. Expected name: ရဝ်ထဝ်ကာဒ်.
  • Code: rth. Saw name: Ratahan. Expected name: ရာတ်တာဟာမ်.
  • Code: rtm. Saw name: Rotuman. Expected name: ရဝ်ထူမေန်.
  • Code: ru. Saw name: Russian. Expected name: ရုဿျှာ.
  • Code: rue. Saw name: Carpathian Rusyn. Expected name: ရာတ်သေင်.
  • Code: ruo. Saw name: Istro-Romanian. Expected name: ရဝ်မေနဳယာန်-အေတ်သတဝ်.
  • Code: rup. Saw name: Aromanian. Expected name: အာရဝ်မေနဳယာန်.
  • Code: ruq. Saw name: Megleno-Romanian. Expected name: ရဝ်မေနဳယျာ-မေတ်ဂလဳနဝ်.
  • Code: rw. Saw name: Rwanda-Rundi. Expected name: ရဝမ်ဒါ ရမ်ဒဳ.
  • Code: ryn. Saw name: Northern Amami Ōshima. Expected name: အမာမိ-အဝ်ဃှဳမ လ္ပာ်သၟဝ်ကျာ.
  • Code: rys. Saw name: Yaeyama. Expected name: ယျာအေဲယျာမ.
  • Code: ryu. Saw name: Okinawan. Expected name: အဵုကဳနာဝါ.
  • Code: sa. Saw name: Sanskrit. Expected name: သံသကြိုတ်.
  • Code: sa-ved. Saw name: Sanskrit. Expected name: သံသကြိုတ်.
  • Code: sah. Saw name: Yakut. Expected name: ယျာခုတ်.
  • Code: sai-nje-pro. Saw name: Proto-Northern Jê. Expected name: သၟာ် လ္ပာ်သၟဝ်ကျာ-အခိုက်ကၞာ.
  • Code: sat. Saw name: Santali. Expected name: သာန်တာလဳ.
  • Code: sav. Saw name: Saafi-Saafi. Expected name: သာဖဳ-သာဖဳ.
  • Code: sbf. Saw name: Shabo. Expected name: သျှာဗဝ်.
  • Code: sc. Saw name: Sardinian. Expected name: သာဒဳနဳယာန်.
  • Code: scn. Saw name: Sicilian. Expected name: သဳစဳလဳယာန်.
  • Code: sco. Saw name: Scots. Expected name: သကတ်.
  • Code: sd. Saw name: Sindhi. Expected name: သိန္ဓိ.
  • Code: sdc. Saw name: Sassarese. Expected name: သာက်သွဳ.
  • Code: sdn. Saw name: Gallurese. Expected name: ဂါယ်ဠူရေဝ်သ်.
  • Code: se. Saw name: Northern Sami. Expected name: သာမိ သၟဝ်ကျာ.
  • Code: sei. Saw name: Seri. Expected name: သေဴရေဝ်.
  • Code: sem-pro. Saw name: Proto-Semitic. Expected name: ဆဲလ်မိတိ-အခိုက်ကၞာ.
  • Code: sg. Saw name: Sango. Expected name: သင်ဂဝ်.
  • Code: sga. Saw name: Old Irish. Expected name: အာဲယျာလာန်တြေံ.
  • Code: sgs. Saw name: Samogitian. Expected name: သာမဝ်ကဳထေင်.
  • Code: sh. Saw name: Serbo-Croatian. Expected name: သာဗ်ခြဝ်ဨရှဳယာန်.
  • Code: shk. Saw name: Shilluk. Expected name: သျှိလု.
  • Code: shn. Saw name: Shan. Expected name: သေံဇၞော်.
  • Code: si. Saw name: Sinhalese. Expected name: သိၚ်္ဃဵုရ်.
  • Code: sid. Saw name: Sidamo. Expected name: သေတ်ဒါမဝ်.
  • Code: sio-pro. Saw name: Proto-Siouan. Expected name: သုဝေန်-အခိုက်ကၞာ.
  • Code: sit-pro. Saw name: Proto-Sino-Tibetan. Expected name: ကြုက်-တိဗဝ်-အခိုက်ကၞာ.
  • Code: sit-sit. Saw name: Situ. Expected name: သဳဒူ.
  • Code: sit-tan-pro. Saw name: Proto-Tani. Expected name: တာန်နဳ-အခိုက်ကၞာ.
  • Code: sjd. Saw name: Kildin Sami. Expected name: ခဳယဝ်ဗေန် သာမိ.
  • Code: sje. Saw name: Pite Sami. Expected name: ဖါဲသာမိ.
  • Code: sjt. Saw name: Ter Sami. Expected name: ထရေဝ်သာမိ.
  • Code: sju. Saw name: Ume Sami. Expected name: ဥူမေ သာမိ.
  • Code: sk. Saw name: Slovak. Expected name: သလဝ်ဝေန်နဳယျာ.
  • Code: skb. Saw name: Saek. Expected name: သာပ်.
  • Code: sl. Saw name: Slovene. Expected name: သၠဝ်ဝေနဳ.
  • Code: sla. Saw name: Slavic. Expected name: သလာဗေတ်.
  • Code: sla-pro. Saw name: Proto-Slavic. Expected name: သလာဗေတ်-အခိုက်ကၞာ.
  • Code: slm. Saw name: Pangutaran Sama. Expected name: ထာန်ဂုတာရာန် သာမ.
  • Code: slr. Saw name: Salar. Expected name: သလာ.
  • Code: sm. Saw name: Samoan. Expected name: သမဝ်အာန်.
  • Code: sma. Saw name: Southern Sami. Expected name: သာမိ လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • Code: smi-pro. Saw name: Proto-Samic. Expected name: သာမေတ်-အခိုက်ကၞာ.
  • Code: smj. Saw name: Lule Sami. Expected name: ဠူသာမိ.
  • Code: smn. Saw name: Inari Sami. Expected name: အဳနာရိသာမိ.
  • Code: sms. Saw name: Skolt Sami. Expected name: သာမိ သဂဝ်.
  • Code: sn. Saw name: Shona. Expected name: သျှိနာ.
  • Code: snf. Saw name: Noon. Expected name: နူန်.
  • Code: so. Saw name: Somali. Expected name: ဆဝ်မာလဳ.
  • Code: sog. Saw name: Sogdian. Expected name: သတ်ဂျဳယာန်.
  • Code: sou. Saw name: Southern Thai. Expected name: သေံသၠုင်ကျာ.
  • Code: sq. Saw name: Albanian. Expected name: အလ်ဗနဳယာန်.
  • Code: sqj-pro. Saw name: Proto-Albanian. Expected name: အလ်ဗနဳယာန်-အခိုက်ကၞာ.
  • Code: squ. Saw name: Squamish. Expected name: သကေဝ်မောတ်.
  • Code: srn. Saw name: Sranan Tongo. Expected name: သရာနာန် တံင်ဂဝ်.
  • Code: srr. Saw name: Serer. Expected name: သေဴရေ.
  • Code: ss. Saw name: Swazi. Expected name: သဝါဇြဳ.
  • Code: ssf. Saw name: Thao. Expected name: ထော.
  • Code: stp. Saw name: Southeastern Tepehuan. Expected name: ထေပ်ပုဝ်ဝါန် လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • Code: stq. Saw name: Saterland Frisian. Expected name: သာဒလာန် ဖရေဝ်သဳယာန်.
  • Code: str. Saw name: Saanich. Expected name: သာဲနေတ်.
  • Code: sux. Saw name: Sumerian. Expected name: သူမာရေဝ်ယာန်.
  • Code: sv. Saw name: Swedish. Expected name: သွဳဒေန်.
  • Code: sw. Saw name: Swahili. Expected name: သဝါတ်ဟဳလဳ.
  • Code: syc. Saw name: Classical Syriac. Expected name: သဳရဳယျာ အခိုက်ကၞာ.
  • Code: szl. Saw name: Silesian. Expected name: သလဳယှေန်.
  • Code: szy. Saw name: Sakizaya. Expected name: သကဳသက်ယျာ.
  • Code: ta. Saw name: Tamil. Expected name: တမဳလ်.
  • Code: tai. Saw name: Tai. Expected name: သေံ.
  • Code: tai-pro. Saw name: Proto-Tai. Expected name: သေံ-အခိုက်ကၞာ.
  • Code: tao. Saw name: Yami. Expected name: ယျာမိ.
  • Code: tbq-bdg-pro. Saw name: Proto-Bodo-Garo. Expected name: ဗဝ်ဒဝ်-ဂါရဝ်-အခိုက်ကၞာ.
  • Code: tbq-kuk-pro. Saw name: Proto-Kuki-Chin. Expected name: ကူကဳ-ချေန်-အခိုက်ကၞာ.
  • Code: tbq-lob-pro. Saw name: Proto-Lolo-Burmese. Expected name: လဝ်လဝ်ဗၟာ-အခိုက်ကၞာ.
  • Code: tby. Saw name: Tabaru. Expected name: ထေက်ဗရု.
  • Code: tcs. Saw name: Torres Strait Creole. Expected name: အင်္ဂလိက် ဗရဝ်ဂေန်.
  • Code: tdd. Saw name: Tai Nüa. Expected name: သေံတာဲခေါင်.
  • Code: te. Saw name: Telugu. Expected name: တေလုဂု.
  • Code: tet. Saw name: Tetum. Expected name: တေထီု.
  • Code: tg. Saw name: Tajik. Expected name: တာဇိက်.
  • Code: th. Saw name: Thai. Expected name: သေံ.
  • Code: ti. Saw name: Tigrinya. Expected name: တဳဂျရေဝ်ယျာ.
  • Code: tio. Saw name: Teop. Expected name: ထဳအာ်.
  • Code: tiy. Saw name: Tiruray. Expected name: တဳရူရာန်.
  • Code: tk. Saw name: Turkmen. Expected name: တာခ်မေန်.
  • Code: tkl. Saw name: Tokelauan. Expected name: တဝ်ကဲလော.
  • Code: tl. Saw name: Tagalog. Expected name: တာဂါလံက်.
  • Code: tli. Saw name: Tlingit. Expected name: ထလေန်ကေတ်.
  • Code: tmh. Saw name: Tuareg. Expected name: ထူအာ်ရေတ်.
  • Code: to. Saw name: Tongan. Expected name: ထံင်ဂံင်.
  • Code: tpi. Saw name: Tok Pisin. Expected name: တေဝ်ဖါဲသေင်.
  • Code: tpw. Saw name: Old Tupi. Expected name: တူပဳတြေံ.
  • Code: tqw. Saw name: Tonkawa. Expected name: ထံင်ခါဝါ.
  • Code: tr. Saw name: Turkish. Expected name: တူရကဳ.
  • Code: trk. Saw name: Turkic. Expected name: တာခ်.
  • Code: trk-cmn. Saw name: Proto-Turkic. Expected name: တာခ်ကေတ်-အခိုက်ကၞာ.
  • Code: trk-cmn. Saw name: Common Turkic. Expected name: တာခ်ကေတ် သာမည.
  • Code: trk-oat. Saw name: Old Anatolian Turkish. Expected name: တူရကဳ အာန်နာတဝ်လဳယာန်တြေံ.
  • Code: trk-pro. Saw name: Proto-Turkic. Expected name: တာခ်ကေတ်-အခိုက်ကၞာ.
  • Code: trv. Saw name: Taroko. Expected name: တာရုဝ်ကိုအ်.
  • Code: ts. Saw name: Tsonga. Expected name: သွေန်ဂါ.
  • Code: tsg. Saw name: Tausug. Expected name: ထာဴသု.
  • Code: tt. Saw name: Tatar. Expected name: တာတာ.
  • Code: tts. Saw name: Isan. Expected name: ဣသင်.
  • Code: ttt. Saw name: Tat. Expected name: ထေပ်.
  • Code: tuw-pro. Saw name: Proto-Tungusic. Expected name: ဌာန်ဂုတ်သေတ်-အခိုက်ကၞာ.
  • Code: tuw-sol. Saw name: Solon. Expected name: ဆဝ်လာန်.
  • Code: tvn. Saw name: Tavoyan. Expected name: ဟဝါဲ.
  • Code: tvo. Saw name: Tidore. Expected name: ထဳဒါဝ်ရေ.
  • Code: txb. Saw name: Tocharian B. Expected name: တဝ်ချာရေဝ်ယာန် ဗဳ.
  • Code: txg. Saw name: Tangut. Expected name: တာန်ဂူ.
  • Code: ty. Saw name: Tahitian. Expected name: တဟဳတဳဃှေန်.
  • Code: tyv. Saw name: Tuvan. Expected name: တူဗါန်.
  • Code: tyz. Saw name: Tày. Expected name: ထာင်.
  • Code: tzm. Saw name: Central Atlas Tamazight. Expected name: အာက်လေတ် ထာမာသေတ် ဗဟဵု.
  • Code: tzo. Saw name: Tzotzil. Expected name: သအ်သေန်.
  • Code: ubl. Saw name: Buhi'non Bikol. Expected name: ၜေအ်ဟဳနန် ဗဳကေန်.
  • Code: uby. Saw name: Ubykh. Expected name: ဥူဗေတ်.
  • Code: ude. Saw name: Udihe. Expected name: ယူဒဳဟဳ.
  • Code: ug. Saw name: Uyghur. Expected name: ဥူဃူရ်.
  • Code: ugo. Saw name: Gong. Expected name: ဂေုန်.
  • Code: uk. Saw name: Ukrainian. Expected name: ယူကရိန်.
  • Code: umu. Saw name: Munsee. Expected name: မာန်သဳ.
  • Code: und. Saw name: Undetermined. Expected name: ပဆုဲလဇလဝ်.
  • Code: unm. Saw name: Unami. Expected name: ဥူနာမဳ.
  • Code: ur. Saw name: Urdu. Expected name: အူရဒူ.
  • Code: urj-fin-pro. Saw name: Proto-Finnic. Expected name: ဖေန်နေတ်-အခိုက်ကၞာ.
  • Code: urj-pro. Saw name: Proto-Uralic. Expected name: ယူရာလေတ်-အခိုက်ကၞာ.
  • Code: urk. Saw name: Urak Lawoi'. Expected name: ဥူရပ်လာဝဵု.
  • Code: ush. Saw name: Ushojo. Expected name: ယူသျှိဂျေန်.
  • Code: uz. Saw name: Uzbek. Expected name: ဥုသဗဝ်.
  • Code: vai. Saw name: Vai. Expected name: ဝါဲ.
  • Code: ve. Saw name: Venda. Expected name: ဗါန်ဒါ.
  • Code: vec. Saw name: Venetan. Expected name: ဝေနေတ်.
  • Code: vep. Saw name: Veps. Expected name: ဝေပ်.
  • Code: vi. Saw name: Vietnamese. Expected name: ဗဳယေတ်နာမ်.
  • Code: vo. Saw name: Volapük. Expected name: ဝဝ်လပုက်.
  • Code: vot. Saw name: Votic. Expected name: ဝေါတေတ်.
  • Code: vro. Saw name: Võro. Expected name: ဝုဝ်ရဝ်.
  • Code: wa. Saw name: Walloon. Expected name: ဝါဠူ.
  • Code: wam. Saw name: Massachusett. Expected name: မာတ်သာချူသာတ်.
  • Code: war. Saw name: Waray-Waray. Expected name: ဝါရေ-ဝါရေ.
  • Code: wbl. Saw name: Wakhi. Expected name: ဝါကဳ.
  • Code: win. Saw name: Winnebago. Expected name: ဝေန်နဳဗာဂဝ်.
  • Code: wlm. Saw name: Middle Welsh. Expected name: ဝေလအဒေါဝ်.
  • Code: wo. Saw name: Wolof. Expected name: ဝဝ်လံက်.
  • Code: wuh. Saw name: Wutunhua. Expected name: ဝေပ်တာန်ဝါ.
  • Code: wym. Saw name: Vilamovian. Expected name: ဝဳလာဲမုဗဳယာန်.
  • Code: xaa. Saw name: Andalusian Arabic. Expected name: အာရဗဳ အေန်တာလူယှေန်.
  • Code: xag. Saw name: Aghwan. Expected name: အခဝါန်.
  • Code: xbm. Saw name: Middle Breton. Expected name: ဗရဳတာန် အဒေါဝ်.
  • Code: xbr. Saw name: Kambera. Expected name: ခမ်ဗာရာ.
  • Code: xcl. Saw name: Old Armenian. Expected name: အာမေနဳယျာတြေံ.
  • Code: xgn. Saw name: Mongolic. Expected name: မန်ဂဝ်လေတ်.
  • Code: xgn-pro. Saw name: Proto-Mongolic. Expected name: မန်ဂဝ်လဳယျာ-အခိုက်ကၞာ.
  • Code: xh. Saw name: Xhosa. Expected name: ခါဝ်သာ.
  • Code: xib. Saw name: Iberian. Expected name: အာဲဗဝ်ရေဝ်ယျာ.
  • Code: xil. Saw name: Illyrian. Expected name: အဳလိရေန်.
  • Code: xnb. Saw name: Kanakanabu. Expected name: ခါနာကာနာဗု.
  • Code: xno. Saw name: Old French. Expected name: ပြင်သေတ်တြေံ.
  • Code: xno. Saw name: Anglo-Norman. Expected name: အာန်ဂလဝ်-နဝ်မာန်.
  • Code: xpq. Saw name: Mohegan-Pequot. Expected name: မဝ်ဟဳကေမ်-ဖှဳခွာ.
  • Code: xpr. Saw name: Parthian. Expected name: ပါဗဳယာန်.
  • Code: xqa. Saw name: Karakhanid. Expected name: ခဲတာခါနေတ်.
  • Code: xrn. Saw name: Arin. Expected name: အာရေန်.
  • Code: xsl. Saw name: South Slavey. Expected name: သလေဝ်ဖဳ သမၠုင်ကျာ.
  • Code: xss. Saw name: Assan. Expected name: အာတ်သာန်.
  • Code: xsv. Saw name: Sudovian. Expected name: သူဒဝ်ဝဳယာန်.
  • Code: xto. Saw name: Tocharian A. Expected name: တဝ်ချာရေဝ်ယာန် ဨ.
  • Code: xug. Saw name: Kunigami. Expected name: ခူနဳဂါမဳ.
  • Code: xve. Saw name: Venetic. Expected name: ဝေနေတေတ်.
  • Code: yag. Saw name: Yámana. Expected name: ယျာမာန.
  • Code: yai. Saw name: Yagnobi. Expected name: ယေတ်နဝ်ဗဳ.
  • Code: ybe. Saw name: Western Yugur. Expected name: ယူဂူ လ္ပာ်ပလိုတ်.
  • Code: yha. Saw name: Baha. Expected name: ဗအ်ဟအ်.
  • Code: yi. Saw name: Yiddish. Expected name: ယိဒ်ဒိသ်.
  • Code: yka. Saw name: Yakan. Expected name: ယာတ်ခိုင်.
  • Code: yle. Saw name: Yele. Expected name: ယေလေဝ်.
  • Code: yo. Saw name: Yoruba. Expected name: ရိုရုဗာ.
  • Code: yog. Saw name: Yogad. Expected name: ယဝ်ဂေါတ်.
  • Code: yoi. Saw name: Yonaguni. Expected name: ယဝ်နာဂုနဳ.
  • Code: yol. Saw name: Yola. Expected name: ယဝ်လာ.
  • Code: yox. Saw name: Yoron. Expected name: ယဝ်ရုန်.
  • Code: yrk. Saw name: Tundra Nenets. Expected name: ဌာန်ဓရာနာနေတ်.
  • Code: yua. Saw name: Yucatec Maya. Expected name: ယူခေန်ထေတ် မာယျာ.
  • Code: yue. Saw name: Cantonese. Expected name: ကာန်ဒုန်.
  • Code: yuy. Saw name: East Yugur. Expected name: ယူဂုဝ် လ္ပာ်ဗၟံက်.
  • Code: za. Saw name: Zhuang. Expected name: ဇြုန်.
  • Code: zag. Saw name: Zaghawa. Expected name: သျာဂါဝါ.
  • Code: zea. Saw name: Zealandic. Expected name: သဳလာမ်ဒေတ်.
  • Code: zh. Saw name: Chinese. Expected name: ကြုက်.
  • Code: zhn. Saw name: Nong Zhuang. Expected name: ဏောင်ကျောန်ယဳ.
  • Code: zko. Saw name: Kott. Expected name: ကတ်.
  • Code: zkt. Saw name: Khitan. Expected name: ခါန်ဒါန်.
  • Code: zle-obe. Saw name: Old Ruthenian. Expected name: ရုတဳနဳယာန်တြေံ.
  • Code: zle-ono. Saw name: Old Novgorodian. Expected name: နဝ်ဂိုဝ်ရဝ်ဒဳယျာတြေံ .
  • Code: zls. Saw name: South Slavic. Expected name: သလာဗေတ် ဒိုဟ်သမၠုင်ကျာ.
  • Code: zlw-ocs. Saw name: Old Czech. Expected name: ချက်ခ်တြေံ.
  • Code: zlw-opl. Saw name: Old Polish. Expected name: ပဝ်လာန်တြေံ.
  • Code: zom. Saw name: Zou. Expected name: ဇြူ.
  • Code: zpq. Saw name: Zoogocho Zapotec. Expected name: သူဂဝ်ချေဝ် သာပဝ်ထေတ်.
  • Code: zu. Saw name: Zulu. Expected name: သြူဠူ.
  • Code: zza. Saw name: Zazaki. Expected name: သာသာကဳ.
  • Southern Balochi, the canonical name for the code bcc, is wrong; it should be ဗဠူချဳ လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • Western Balochi, the canonical name for the code bgn, is wrong; it should be ဗဠူချဳ လ္ပာ်ပလိုတ်.
  • Eastern Balochi, the canonical name for the code bgp, is wrong; it should be ဗဠူချဳ လ္ပာ်ဖာဗၟံက်.
  • ပြင်ဂေတ်တြေံ, the canonical name for the code frk, is wrong; it should be ပြင်ဂေတ်.
  • နဝ်မာံတြေံ, the canonical name for the code fro-nor, is wrong; it should be ပြင်သေတ်တြေံလ္ပာ်သၟဝ်ကျာ.
  • Avahattha, the canonical name for the code inc-aav, is wrong; it should be အဝဟတာ.
  • Gurjara Apabhramsa, the canonical name for the code inc-agu, is wrong; it should be ဂူဂျာရာ အာပ်ပါပရာမ်သာ.
  • Kasmiri Apabhramsa, the canonical name for the code inc-aka, is wrong; it should be ခေပ်သမဳရဳ အာပ်ပါပရာမ်သာ.
  • Maharastri Apabhramsa, the canonical name for the code inc-ama, is wrong; it should be မဟာရာတ်သပ်ထရဳ အာပ်ပါပရာမ်သာ.
  • Sauraseni Apabhramsa, the canonical name for the code inc-asa, is wrong; it should be သဥူရေသဳနဳ အာပ်ပါပရာမ်သာ.
  • Takka Apabhramsa, the canonical name for the code inc-ata, is wrong; it should be တာကာ အာပ်ပါပရာမ်သာ.
  • Vracada Apabhramsa, the canonical name for the code inc-avr, is wrong; it should be ဝရာခါဒါ အာပ်ပါပရာမ်သာ.
  • Mitanni, the canonical name for the code inc-mit, is wrong; it should be မဳတာန်နဳ.
  • Classical Latin, the canonical name for the code la-cla, is wrong; it should be လပ်တေန်ဝင်ဂန္ထ.
  • Early Medieval Latin, the canonical name for the code la-eme, is wrong; it should be လပ်တေန်ခေတ်လဒေါဝ်ဗွဲမပြဟ်.
  • Kaniguram, the canonical name for the code oru-kan, is wrong; it should be ခေန်နဳပုရာမ်.
  • Logar, the canonical name for the code oru-log, is wrong; it should be ဠဝ်ဂါ.
  • ဒိကိုဝ်, the canonical name for the code os-dig, is wrong; it should be ဒိကိုဝ်အိုတ်သေဃှေန်.
  • အာဲရာန်, the canonical name for the code os-iro, is wrong; it should be အာဲရာန်အိုတ်သေဃှေန်.
  • Abhiri, the canonical name for the code pra-abh, is wrong; it should be အဖိရဳ.
  • Ardhamagadhi Prakrit, the canonical name for the code pra-ard, is wrong; it should be အာတ်ဓမဂါတ်ဒဳ ပရာကရေတ်.
  • Avanti, the canonical name for the code pra-ava, is wrong; it should be အဗါန်တဳ.
  • Bahliki, the canonical name for the code pra-bah, is wrong; it should be ပါလိကဳ.
  • Candali, the canonical name for the code pra-can, is wrong; it should be ခေန်ဒါလဳ.
  • Daksinatya, the canonical name for the code pra-dak, is wrong; it should be ထေတ်သဳနတာယျ.
  • Dramili, the canonical name for the code pra-dra, is wrong; it should be ဒရာမဳလဳ.
  • Helu Prakrit, the canonical name for the code pra-hel, is wrong; it should be ဟေဠူ ပရာကရေတ်.
  • Magadhi Prakrit, the canonical name for the code pra-mag, is wrong; it should be မဂ္ဂဒိ ပရာကရေတ်.
  • Odri, the canonical name for the code pra-odr, is wrong; it should be အဝ်ဒရဳ.
  • Paisaci Prakrit, the canonical name for the code pra-pai, is wrong; it should be ပါအေတ်သာသဳ ပရာကရေတ်.
  • Pracya, the canonical name for the code pra-pra, is wrong; it should be ပရာသဳယျာ.
  • Sabari, the canonical name for the code pra-sab, is wrong; it should be သာဗါရဳ.
  • Sakari, the canonical name for the code pra-sak, is wrong; it should be သာကာရဳ.
  • Qashqai, the canonical name for the code qxq, is wrong; it should be ဂါချေက်ကာဲ.
  • Proto-Tibeto-Burman, the canonical name for the code tbq-pro, is wrong; it should be ဗၟာ-တိဗဝ်တဝ် အခိုက်ကၞာ.
  • Old Indo-Aryan, the canonical name for the code inc-old, is wrong; it should be အိန်တဝ်-အာရိယာန်တြေံ.
  • The code ira-mid and the canonical name အဳရာန်အဒေါဝ် should be removed; they are not found in Module:families/data.
  • The code ira-old and the canonical name အဳရာန်တြေံ should be removed; they are not found in Module:families/data.
  • The canonical name ဂါဝ်တူဥူ (aaa) is missing.
  • Ghotuo, the canonical name for the code aaa, is wrong; it should be ဂါဝ်တူဥူ.
  • The canonical name အာဠူမူ-ထေတ်သူ (aab) is missing.
  • Alumu-Tesu, the canonical name for the code aab, is wrong; it should be အာဠူမူ-ထေတ်သူ.
  • The canonical name အာရဳ (aac) is missing.
  • Ari, the canonical name for the code aac, is wrong; it should be အာရဳ.
  • Amal, the canonical name for the code aad, is wrong; it should be အာမာန်.
  • The canonical name အာမာန် (aad) is missing.
  • Aranadan, the canonical name for the code aaf, is wrong; it should be အာရာနဒါန်.
  • The canonical name အာရာနဒါန် (aaf) is missing.
  • Ambrak, the canonical name for the code aag, is wrong; it should be အာန်ဗရေတ်ခ်.
  • The canonical name အာန်ဗရေတ်ခ် (aag) is missing.
  • Abu' Arapesh, the canonical name for the code aah, is wrong; it should be အာၜေအ်' အာရာဗေါတ်.
  • The canonical name အာၜေအ်' အာရာဗေါတ် (aah) is missing.
  • The canonical name အာရဳဖှာန်မာ-မဳနဳယျာဖှဳယျာ (aai) is missing.
  • Arifama-Miniafia, the canonical name for the code aai, is wrong; it should be အာရဳဖှာန်မာ-မဳနဳယျာဖှဳယျာ.
  • The canonical name အာန်ခါဝေ (aak) is missing.
  • Ankave, the canonical name for the code aak, is wrong; it should be အာန်ခါဝေ.
  • The canonical name အာဖှာဲဒေ (aal) is missing.
  • Afade, the canonical name for the code aal, is wrong; it should be အာဖှာဲဒေ.
  • Anambé, the canonical name for the code aan, is wrong; it should be အာန္နာမ်ဗေ.
  • The canonical name အာန္နာမ်ဗေ (aan) is missing.
  • The canonical name အောတ်သေတ် (aas) is missing.
  • Aasax, the canonical name for the code aas, is wrong; it should be အောတ်သေတ်.
  • The canonical name အာၜေဴ (aau) is missing.
  • Abau, the canonical name for the code aau, is wrong; it should be အာၜေဴ.
  • Solong, the canonical name for the code aaw, is wrong; it should be သဝ်လံန်.
  • The canonical name သဝ်လံန် (aaw) is missing.
  • Mandobo Atas, the canonical name for the code aax, is wrong; it should be မာန်ဒဝ်ဗဝ် အာတ်တာပ်.
  • The canonical name မာန်ဒဝ်ဗဝ် အာတ်တာပ် (aax) is missing.
  • Amarasi, the canonical name for the code aaz, is wrong; it should be အာန်မာရသဳ.
  • The canonical name အာန်မာရသဳ (aaz) is missing.
  • Akhvakh, the canonical name for the code akv, is wrong; it should be အာပ်ခါဝက်.
  • The canonical name အာပ်ခါဝက် (akv) is missing.
  • The canonical name အာန်ဒဳ (ani) is missing.
  • Andi, the canonical name for the code ani, is wrong; it should be အာန်ဒဳ.
  • Botlikh, the canonical name for the code bph, is wrong; it should be ဗေဒ်လိခ်.
  • The canonical name ဗေဒ်လိခ် (bph) is missing.
  • Proto-Andian, the canonical name for the code cau-and-pro, is wrong; it should be အာန်ဒဳယာန်-အခိုက်ကၞာ.
  • The canonical name အာန်ဒဳယာန်-အခိုက်ကၞာ (cau-and-pro) is missing.
  • Proto-Avaro-Andian, the canonical name for the code cau-ava-pro, is wrong; it should be အဝါရဝ်-အာန်ဒဳယာန်-အခိုက်ကၞာ.
  • The canonical name အဝါရဝ်-အာန်ဒဳယာန်-အခိုက်ကၞာ (cau-ava-pro) is missing.
  • The canonical name ချာမာလာန် (cji) is missing.
  • Chamalal, the canonical name for the code cji, is wrong; it should be ချာမာလာန်.
  • The canonical name ဒဝ်မာအာကိ (dmk) is missing.
  • Domaaki, the canonical name for the code dmk, is wrong; it should be ဒဝ်မာအာကိ.
  • The canonical name ဓာမေလဳ (dml) is missing.
  • Dameli, the canonical name for the code dml, is wrong; it should be ဓာမေလဳ.
  • The canonical name ဂါဝ်ဒဝ်ဗဳရေဝ် (gdo) is missing.
  • Godoberi, the canonical name for the code gdo, is wrong; it should be ဂါဝ်ဒဝ်ဗဳရေဝ်.
  • The canonical name နဝ်ဝေ လဒေါဝ် (gmq-mno) is missing.
  • Middle Norwegian, the canonical name for the code gmq-mno, is wrong; it should be နဝ်ဝေ လဒေါဝ်.
  • Gawar-Bati, the canonical name for the code gwt, is wrong; it should be ဂါဝါ-ဗါတဳ.
  • The canonical name ဂါဝါ-ဗါတဳ (gwt) is missing.
  • Proto-Iranian, the canonical name for the code ira-pro, is wrong; it should be အဳရာန်-အခိုက်ကၞာ.
  • The canonical name သတ်ဓေတ်-အခိုက်ကၞာ (ira-sgc-pro) is missing.
  • Proto-Sogdic, the canonical name for the code ira-sgc-pro, is wrong; it should be သတ်ဓေတ်-အခိုက်ကၞာ.
  • The canonical name ခါရာတ (kpt) is missing.
  • Karata, the canonical name for the code kpt, is wrong; it should be ခါရာတ.
  • The canonical name ဗတ်ဝါဠူ (kva) is missing.
  • Bagvalal, the canonical name for the code kva, is wrong; it should be ဗတ်ဝါဠူ.
  • The canonical name လာပ်သဂေဒဳ (lsa) is missing.
  • Lasgerdi, the canonical name for the code lsa, is wrong; it should be လာပ်သဂေဒဳ.
  • ကြုက်အဒေါဝ်, the canonical name for the code ltc, is wrong; it should be ကြုက်လဒေါဝ်.
  • The canonical name ကြုက်လဒေါဝ် (ltc) is missing.
  • The canonical name မဳနင်ကာဗေဴ (min) is missing.
  • Minangkabau, the canonical name for the code min, is wrong; it should be မဳနင်ကာဗေဴ.
  • အရေဝ်ဘာသာတဏဟ်, the canonical name for the code mul, is wrong; it should be မအရေဝ်ပံင်ကောံ.
  • The canonical name မအရေဝ်ပံင်ကောံ (mul) is missing.
  • The canonical name အိန်ဒါတ် ခါဝ်ဟေတ်သတာန်နဳ (mvy) is missing.
  • Indus Kohistani, the canonical name for the code mvy, is wrong; it should be အိန်ဒါတ် ခါဝ်ဟေတ်သတာန်နဳ.
  • Ormuri, the canonical name for the code oru, is wrong; it should be အာဝ်မူရဳ.
  • The canonical name အာဝ်မူရဳ (oru) is missing.
  • Pengo, the canonical name for the code peg, is wrong; it should be ဖေန်ဂါဝ်.
  • The canonical name ဖေန်ဂါဝ် (peg) is missing.
  • The canonical name ဗါဝ်နာန် (peh) is missing.
  • Bonan, the canonical name for the code peh, is wrong; it should be ဗါဝ်နာန်.
  • Parachi, the canonical name for the code prc, is wrong; it should be ပါရာချဳ.
  • The canonical name ပါရာချဳ (prc) is missing.
  • Proto-Nyima, the canonical name for the code sdv-nyi-pro, is wrong; it should be နယျဳမာ-အခိုက်ကၞာ.
  • The canonical name နယျဳမာ-အခိုက်ကၞာ (sdv-nyi-pro) is missing.
  • Proto-Taman, the canonical name for the code sdv-tmn-pro, is wrong; it should be တမာန်-အခိုက်ကၞာ.
  • The canonical name တမာန်-အခိုက်ကၞာ (sdv-tmn-pro) is missing.
  • Northern Selkup, the canonical name for the code sel-nor, is wrong; it should be သေင်ခုတ် လ္ပာ်သၟဝ်ကျာ.
  • The canonical name သေင်ခုတ် လ္ပာ်သၟဝ်ကျာ (sel-nor) is missing.
  • Proto-Selkup, the canonical name for the code sel-pro, is wrong; it should be သေင်ခုတ်-အခိုက်ကၞာ.
  • The canonical name သေင်ခုတ်-အခိုက်ကၞာ (sel-pro) is missing.
  • Southern Selkup, the canonical name for the code sel-sou, is wrong; it should be သေင်ခုတ် လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • The canonical name သေင်ခုတ် လ္ပာ်ဒိုဟ်သမၠုင်ကျာ (sel-sou) is missing.
  • Shughni, the canonical name for the code sgh, is wrong; it should be သျှောတ်နဳ.
  • The canonical name သျှောတ်နဳ (sgh) is missing.
  • Sangisari, the canonical name for the code sgr, is wrong; it should be သင်္ဂဳသာရဳ.
  • The canonical name သင်္ဂဳသာရဳ (sgr) is missing.
  • Bokar, the canonical name for the code sit-bok, is wrong; it should be ဗါဝ်ကာန်.
  • The canonical name ဗါဝ်ကာန် (sit-bok) is missing.
  • The canonical name ထာန်ဂုတာရာန် သာမ (slm) is missing.
  • Pangutaran Sama, the canonical name for the code slm, is wrong; it should be ထာန်ဂုတာရာန် သာမ.
  • The canonical name သေံသောန် (soa) is missing.
  • Thai Song, the canonical name for the code soa, is wrong; it should be သေံသောန်.
  • The canonical name သာဝ်ခေဝ် (sqo) is missing.
  • Sorkhei, the canonical name for the code sqo, is wrong; it should be သာဝ်ခေဝ်.
  • Shahmirzadi, the canonical name for the code srz, is wrong; it should be သျှာမဳဇြာဒဳ.
  • The canonical name သျှာမဳဇြာဒဳ (srz) is missing.
  • The canonical name သျှုမာတ်သတဳ (sts) is missing.
  • Shumashti, the canonical name for the code sts, is wrong; it should be သျှုမာတ်သတဳ.
  • Forest Nenets, the canonical name for the code syd-fne, is wrong; it should be ဖှောမ်နေနေတ်.
  • The canonical name ဖှောမ်နေနေတ် (syd-fne) is missing.
  • Tabasaran, the canonical name for the code tab, is wrong; it should be တဗါသာရာန်.
  • The canonical name တဗါသာရာန် (tab) is missing.
  • The canonical name တမာန် လ္ပာ်ဖာဗၟံက် (taj) is missing.
  • Eastern Tamang, the canonical name for the code taj, is wrong; it should be တမာန် လ္ပာ်ဖာဗၟံက်.
  • Taman (Myanmar), the canonical name for the code tcl, is wrong; it should be တာမာန် (ဍုင်ဗၟာ).
  • The canonical name တာမာန် (ဍုင်ဗၟာ) (tcl) is missing.
  • Western Tamang, the canonical name for the code tdg, is wrong; it should be တမာန် လ္ပာ်ဖာပလိုတ်.
  • The canonical name တမာန် လ္ပာ်ဖာပလိုတ် (tdg) is missing.
  • The canonical name ဂေါ်ခါ တာမာန် လ္ပာ်ဖာဗၟံက် (tge) is missing.
  • Eastern Gorkha Tamang, the canonical name for the code tge, is wrong; it should be ဂေါ်ခါ တာမာန် လ္ပာ်ဖာဗၟံက်.
  • Chali, the canonical name for the code tgf, is wrong; it should be ချာလဳ.
  • The canonical name ချာလဳ (tgf) is missing.
  • The canonical name ထေန်ဒဳ (tin) is missing.
  • Tindi, the canonical name for the code tin, is wrong; it should be ထေန်ဒဳ.
  • The canonical name တမာန် လ္ပာ်ဖာဒိုဟ်ပလိုတ်သၟဝ်ကျာ (tmk) is missing.
  • Northwestern Tamang, the canonical name for the code tmk, is wrong; it should be တမာန် လ္ပာ်ဖာဒိုဟ်ပလိုတ်သၟဝ်ကျာ.
  • The canonical name တာမာန် (အိန်ဒဝ်နဳယျာ) (tmn) is missing.
  • Taman (Indonesia), the canonical name for the code tmn, is wrong; it should be တာမာန် (အိန်ဒဝ်နဳယျာ).
  • The canonical name တဳရာဟဳ (tra) is missing.
  • Tirahi, the canonical name for the code tra, is wrong; it should be တဳရာဟဳ.
  • The canonical name တာရုဝ်ကိုအ် (trv) is missing.
  • Taroko, the canonical name for the code trv, is wrong; it should be တာရုဝ်ကိုအ်.
  • Torwali, the canonical name for the code trw, is wrong; it should be တောဝ်ဝါလဳ.
  • The canonical name တောဝ်ဝါလဳ (trw) is missing.
  • The canonical name သေပ်ခါဝ်နဳယာန် (tsd) is missing.
  • Tsakonian, the canonical name for the code tsd, is wrong; it should be သေပ်ခါဝ်နဳယာန်.
  • The canonical name ချာန်လာ (tsj) is missing.
  • Tshangla, the canonical name for the code tsj, is wrong; it should be ချာန်လာ.
  • The canonical name တဝါန် မန်ပါ (twm) is missing.
  • Tawang Monpa, the canonical name for the code twm, is wrong; it should be တဝါန် မန်ပါ.
  • Wotapuri-Katarqalai, the canonical name for the code wsv, is wrong; it should be ဝတ္တၜေအ်ရဳ-ကာတာကာလာင်.
  • The canonical name ဝတ္တၜေအ်ရဳ-ကာတာကာလာင် (wsv) is missing.
  • The canonical name မဳဝါတဳ (wtm) is missing.
  • Mewati, the canonical name for the code wtm, is wrong; it should be မဳဝါတဳ.
  • Wutunhua, the canonical name for the code wuh, is wrong; it should be ဝေပ်တာန်ဝါ.
  • The canonical name ဝေပ်တာန်ဝါ (wuh) is missing.
  • Hurrian, the canonical name for the code xhu, is wrong; it should be ဟေရဳယာန်.
  • The canonical name ဟေရဳယာန် (xhu) is missing.
  • Alanic, the canonical name for the code xln, is wrong; it should be အလာန်နေတ်.
  • The canonical name အလာန်နေတ် (xln) is missing.
  • The canonical name အာရေဗဳယာမ်ခေတ်တြေံသၟဝ်ကျာ (xna) is missing.
  • Ancient North Arabian, the canonical name for the code xna, is wrong; it should be အာရေဗဳယာမ်ခေတ်တြေံသၟဝ်ကျာ.
  • Kanakanabu, the canonical name for the code xnb, is wrong; it should be ခါနာကာနာဗု.
  • The canonical name ခါနာကာနာဗု (xnb) is missing.
  • Proto-Sarmatian, the canonical name for the code xsc-sar-pro, is wrong; it should be သာမာတဳယာန်-အခိုက်ကၞာ.
  • The canonical name သာမာတဳယာန်-အခိုက်ကၞာ (xsc-sar-pro) is missing.
  • Yagnobi, the canonical name for the code yai, is wrong; it should be ယေတ်နဝ်ဗဳ.
  • The canonical name ယေတ်နဝ်ဗဳ (yai) is missing.
  • Southern Yukaghir, the canonical name for the code yux, is wrong; it should be ယူခါဂဳ လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • The canonical name ယူခါဂဳ လ္ပာ်ဒိုဟ်သမၠုင်ကျာ (yux) is missing.
  • East Yugur, the canonical name for the code yuy, is wrong; it should be ယူဂုဝ် လ္ပာ်ဗၟံက်.
  • The canonical name ယူဂုဝ် လ္ပာ်ဗၟံက် (yuy) is missing.
  • Akhvakh, the canonical name for the code akv, is wrong; it should be အာပ်ခါဝက်.
  • Andi, the canonical name for the code ani, is wrong; it should be အာန်ဒဳ.
  • Botlikh, the canonical name for the code bph, is wrong; it should be ဗေဒ်လိခ်.
  • Proto-Andian, the canonical name for the code cau-and-pro, is wrong; it should be အာန်ဒဳယာန်-အခိုက်ကၞာ.
  • Proto-Avaro-Andian, the canonical name for the code cau-ava-pro, is wrong; it should be အဝါရဝ်-အာန်ဒဳယာန်-အခိုက်ကၞာ.
  • Chamalal, the canonical name for the code cji, is wrong; it should be ချာမာလာန်.
  • Domaaki, the canonical name for the code dmk, is wrong; it should be ဒဝ်မာအာကိ.
  • Dameli, the canonical name for the code dml, is wrong; it should be ဓာမေလဳ.
  • Godoberi, the canonical name for the code gdo, is wrong; it should be ဂါဝ်ဒဝ်ဗဳရေဝ်.
  • Middle Norwegian, the canonical name for the code gmq-mno, is wrong; it should be နဝ်ဝေ လဒေါဝ်.
  • Gawar-Bati, the canonical name for the code gwt, is wrong; it should be ဂါဝါ-ဗါတဳ.
  • Proto-Iranian, the canonical name for the code ira-pro, is wrong; it should be အဳရာန်-အခိုက်ကၞာ.
  • Proto-Sogdic, the canonical name for the code ira-sgc-pro, is wrong; it should be သတ်ဓေတ်-အခိုက်ကၞာ.
  • Karata, the canonical name for the code kpt, is wrong; it should be ခါရာတ.
  • Bagvalal, the canonical name for the code kva, is wrong; it should be ဗတ်ဝါဠူ.
  • Lasgerdi, the canonical name for the code lsa, is wrong; it should be လာပ်သဂေဒဳ.
  • ကြုက်အဒေါဝ်, the canonical name for the code ltc, is wrong; it should be ကြုက်လဒေါဝ်.
  • Minangkabau, the canonical name for the code min, is wrong; it should be မဳနင်ကာဗေဴ.
  • အရေဝ်ဘာသာတဏဟ်, the canonical name for the code mul, is wrong; it should be မအရေဝ်ပံင်ကောံ.
  • Indus Kohistani, the canonical name for the code mvy, is wrong; it should be အိန်ဒါတ် ခါဝ်ဟေတ်သတာန်နဳ.
  • Ormuri, the canonical name for the code oru, is wrong; it should be အာဝ်မူရဳ.
  • Pengo, the canonical name for the code peg, is wrong; it should be ဖေန်ဂါဝ်.
  • Bonan, the canonical name for the code peh, is wrong; it should be ဗါဝ်နာန်.
  • Parachi, the canonical name for the code prc, is wrong; it should be ပါရာချဳ.
  • Proto-Nyima, the canonical name for the code sdv-nyi-pro, is wrong; it should be နယျဳမာ-အခိုက်ကၞာ.
  • Proto-Taman, the canonical name for the code sdv-tmn-pro, is wrong; it should be တမာန်-အခိုက်ကၞာ.
  • Northern Selkup, the canonical name for the code sel-nor, is wrong; it should be သေင်ခုတ် လ္ပာ်သၟဝ်ကျာ.
  • Proto-Selkup, the canonical name for the code sel-pro, is wrong; it should be သေင်ခုတ်-အခိုက်ကၞာ.
  • Southern Selkup, the canonical name for the code sel-sou, is wrong; it should be သေင်ခုတ် လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • Shughni, the canonical name for the code sgh, is wrong; it should be သျှောတ်နဳ.
  • Sangisari, the canonical name for the code sgr, is wrong; it should be သင်္ဂဳသာရဳ.
  • Bokar, the canonical name for the code sit-bok, is wrong; it should be ဗါဝ်ကာန်.
  • Pangutaran Sama, the canonical name for the code slm, is wrong; it should be ထာန်ဂုတာရာန် သာမ.
  • Thai Song, the canonical name for the code soa, is wrong; it should be သေံသောန်.
  • Sorkhei, the canonical name for the code sqo, is wrong; it should be သာဝ်ခေဝ်.
  • Shahmirzadi, the canonical name for the code srz, is wrong; it should be သျှာမဳဇြာဒဳ.
  • Shumashti, the canonical name for the code sts, is wrong; it should be သျှုမာတ်သတဳ.
  • Forest Nenets, the canonical name for the code syd-fne, is wrong; it should be ဖှောမ်နေနေတ်.
  • Tabasaran, the canonical name for the code tab, is wrong; it should be တဗါသာရာန်.
  • Eastern Tamang, the canonical name for the code taj, is wrong; it should be တမာန် လ္ပာ်ဖာဗၟံက်.
  • Taman (Myanmar), the canonical name for the code tcl, is wrong; it should be တာမာန် (ဍုင်ဗၟာ).
  • Western Tamang, the canonical name for the code tdg, is wrong; it should be တမာန် လ္ပာ်ဖာပလိုတ်.
  • Eastern Gorkha Tamang, the canonical name for the code tge, is wrong; it should be ဂေါ်ခါ တာမာန် လ္ပာ်ဖာဗၟံက်.
  • Chali, the canonical name for the code tgf, is wrong; it should be ချာလဳ.
  • Tindi, the canonical name for the code tin, is wrong; it should be ထေန်ဒဳ.
  • Northwestern Tamang, the canonical name for the code tmk, is wrong; it should be တမာန် လ္ပာ်ဖာဒိုဟ်ပလိုတ်သၟဝ်ကျာ.
  • Taman (Indonesia), the canonical name for the code tmn, is wrong; it should be တာမာန် (အိန်ဒဝ်နဳယျာ).
  • Tirahi, the canonical name for the code tra, is wrong; it should be တဳရာဟဳ.
  • Taroko, the canonical name for the code trv, is wrong; it should be တာရုဝ်ကိုအ်.
  • Torwali, the canonical name for the code trw, is wrong; it should be တောဝ်ဝါလဳ.
  • Tsakonian, the canonical name for the code tsd, is wrong; it should be သေပ်ခါဝ်နဳယာန်.
  • Tshangla, the canonical name for the code tsj, is wrong; it should be ချာန်လာ.
  • Tawang Monpa, the canonical name for the code twm, is wrong; it should be တဝါန် မန်ပါ.
  • Wotapuri-Katarqalai, the canonical name for the code wsv, is wrong; it should be ဝတ္တၜေအ်ရဳ-ကာတာကာလာင်.
  • Mewati, the canonical name for the code wtm, is wrong; it should be မဳဝါတဳ.
  • Wutunhua, the canonical name for the code wuh, is wrong; it should be ဝေပ်တာန်ဝါ.
  • Hurrian, the canonical name for the code xhu, is wrong; it should be ဟေရဳယာန်.
  • Alanic, the canonical name for the code xln, is wrong; it should be အလာန်နေတ်.
  • Ancient North Arabian, the canonical name for the code xna, is wrong; it should be အာရေဗဳယာမ်ခေတ်တြေံသၟဝ်ကျာ.
  • Kanakanabu, the canonical name for the code xnb, is wrong; it should be ခါနာကာနာဗု.
  • Proto-Sarmatian, the canonical name for the code xsc-sar-pro, is wrong; it should be သာမာတဳယာန်-အခိုက်ကၞာ.
  • Yagnobi, the canonical name for the code yai, is wrong; it should be ယေတ်နဝ်ဗဳ.
  • Southern Yukaghir, the canonical name for the code yux, is wrong; it should be ယူခါဂဳ လ္ပာ်ဒိုဟ်သမၠုင်ကျာ.
  • East Yugur, the canonical name for the code yuy, is wrong; it should be ယူဂုဝ် လ္ပာ်ဗၟံက်.
  • အာသူ (aru) has a canonical name that is not unique; it is also used by the code aum.
  • apc is set as an ISO 639-3 code on multiple items: Q56593 ကေုာံ Q22809485.
  • kjv is set as an ISO 639-3 code on multiple items: Q838165 ကေုာံ Q31199873.
  • msn is set as an ISO 639-3 code on multiple items: Q3331111 ကေုာံ Q3563857.
  • ttt is set as an ISO 639-3 code on multiple items: Q56489 ကေုာံ Q123964178.
  • Nandinagari, the canonical name for the code Nand, is wrong; it should be နာန်ဒဳနာဂါရေဝ်.
  • Zanabazar Square, the canonical name for the code Zanb, is wrong; it should be ပန်ကၠၚ်ဇာနာဗဇြာ.
  • Manchu, the canonical name for the code mnc-Mong, is wrong; it should be မာန်ချူ.

For multiple data modules:

  • Codes for languages, families and etymology-only languages must be unique and cannot clash with one another.
  • Canonical names for languages, families, and etymology-only languages must not be found in the list of other names.
  • Each name in the list of other names must appear only once.
  • otherNames, if present, must be an array.
  • Wikidata item IDs must be a positive integer or a string starting with Q and ending with decimal digits.

The following must be true of the data used by Module:languages:

  • Each code must be defined in the correct submodule according to whether it is two-letter, three-letter or exceptional.
  • The canonical name (field 1) must be present and must not be the same as the canonical name of another language.
  • If field 2 is not nil, it must a valid Wikidata item ID.
  • If field 3 or family is given and not nil, it must be a valid family code.
  • If field 4 or scripts is given and not nil, it must be an array, and each string in the array must be a valid script code.
  • If ancestors is given, it must be an array, and each string in the array must be a valid language or etymology language code.
  • If family is given, it must be a valid family code.
  • If type is given, it must be one of the recognised values (regular, reconstructed, appendix-constructed).
  • If entry_name is given, it must be a table that contains either two arrays (from and to) or a string (remove_diacritics) or both.
  • If sort_key is given, it may either be a string, or at table that in turn contains either two arrays (from and to) or a string (remove_diacritics).
  • If entry_name or sort_key is given, the from array must be longer or equal in length to the to array.
  • If standardChars is given, it must form a valid Lua string pattern when placed between square brackets with ^ before it ("[^...]). (It should match all characters regularly used in the language, but that cannot be tested.)
  • If override_translit is set, translit must also be set, because there must be a transliteration module that can override manual transliteration.
  • If link_tr is present, it must be true.
  • Have no data keys besides these: 1, 2, 3, "entry_name", "sort_key", "display", "otherNames", "aliases", "varieties", "type", "scripts", "ancestors", "wikimedia_codes", "wikipedia_article", "standardChars", "translit", "override_translit", "link_tr".

Checks not performed:

  • If translit is present, it should be the name of a module, and this module should contain a tr function that takes a pagename (and optionally a language code and script code) as arguments.
  • If sort_key is a string, it should be the name of a module, and this module should contain a makeSortKey function that takes a pagename (and optionally a language code and script code) as arguments.
  • If entry_name or sort_key is a table and contains a field remove_diacritics, the value of the field should be a string that forms a valid Lua pattern when it is placed inside negated set notation ([^...]).

These are not checked here, because module errors will quickly crop up in entries if these conditions are not met, assuming that Module:utilities attempts to generate a sortkey for a category pertaining to the language in question, or full_link attempts to use the transliteration module.

Module:languages/code to canonical name and Module:languages/canonical names must contain all the codes and canonical names found in the data submodules of Module:languages, and no more.

The following must be true of the data used by Module:etymology languages:

  • canonicalName must be given.
  • parent must be given must be a valid language, family or etymology-only language code.
  • If ancestors is given, it must be an array, and each string in the array must be a valid language or etymology language code. The etymology language should also be listed as the ancestor of a regular language.
  • Have no data keys besides these: "canonicalName", "otherNames", "parent", "ancestors", "wikipedia_article", "wikidata_item".

Codes in Module:families data must:

  • Have canonicalName, which must not be the same as the canonical name of another family.
  • If family is given, it must be a valid family code.
  • Have at least one language or subfamily belonging to it.
  • Have no data keys besides these: "canonicalName", "otherNames", "family", "protoLanguage", "wikidata_item".

Codes in Module:scripts data must:

  • Have canonicalName.
  • Have at least one language that lists it as one of its scripts.
  • Have a characters pattern for script autodetection, and this must form a valid Lua string pattern when placed between square brackets ("[...]"). (It should match all characters in the script, but that cannot be tested.)
  • Have no data keys besides these: "canonicalName", "otherNames", "parent", "systems", "wikipedia_article", "characters", "direction".

-- TODO:
	-- ietf_subtag field used with a 2/3-letter langauge/family code except qaa-qtz, or a 4-letter script code.
	-- Check against files containing up-to-date ISO data, to cross-check validity.
local export = {}

local mw = mw
local require = require
local string = string

local m_languages = require("Module:languages")
local m_languages_data_all = require("Module:languages/data/all")
local m_languages_codes = require("Module:languages/code to canonical name")
local m_languages_canonical_names = require("Module:languages/canonical names")
local m_etym_languages_data = require("Module:etymology languages/data")
local m_etym_languages_codes = require("Module:etymology languages/code to canonical name")
local m_etym_languages_canonical_names = require("Module:etymology languages/canonical names")
local m_families = require("Module:families")
local m_families_data = require("Module:families/data")
local m_families_codes = require("Module:families/code to canonical name")
local m_families_canonical_names = require("Module:families/canonical names")
local m_load = require("Module:load")
local m_scripts = require("Module:scripts")
local m_scripts_data = require("Module:scripts/data")
local m_scripts_codes = require("Module:scripts/code to canonical name")
local m_scripts_canonical_names = require("Module:scripts/by name")

local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local Array = require("Module:array")

local add_indefinite_article = m_str_utils.add_indefinite_article
local codepoint = m_str_utils.codepoint
local concat = table.concat
local dump = mw.dumpObject
local format = string.format
local gcodepoint = m_str_utils.gcodepoint
local get_data_module_name = m_languages.getDataModuleName
local get_family_by_code = m_families.getByCode
local get_family_by_canonical_name = m_families.getByCanonicalName
local get_indefinite_article = m_str_utils.get_indefinite_article
local get_language_by_code = m_languages.getByCode
local get_language_by_canonical_name = m_languages.getByCanonicalName
local get_script_by_code = m_scripts.getByCode
local get_script_by_canonical_name = m_scripts.getByCanonicalName
local gmatch = string.gmatch
local gsub = string.gsub
local insert = table.insert
local ipairs = ipairs
local is_positive_integer = require("Module:math").is_positive_integer
local isutf8 = mw.ustring.isutf8
local json_decode = mw.text.jsonDecode
local language_link = require("Module:links").language_link
local list_to_set = m_table.listToSet
local list_to_text = mw.text.listToText
local load_data = m_load.load_data
local log = mw.log
local make_family = m_families.makeObject
local make_lang = m_languages.makeObject
local make_script = m_scripts.makeObject
local match = string.match
local new_title = mw.title.new
local pairs = pairs
local pcall = pcall
local remove_comments = m_str_utils.remove_comments
local safe_require = m_load.safe_require
local sorted_pairs = m_table.sortedPairs
local split = m_str_utils.split
local sub = string.sub
local table_len = m_table.length
local tag_text = require("Module:script utilities").tag_text
local type = type
local umatch = m_str_utils.match

local aliases = require("Module:languages/data").aliases
local messages

local function discrepancy(modname, ...)
	local success, result = pcall(function(...)
		messages[modname]:insert(format(...))
	end, ...)
	if not success then
		log(result, ...)
	end
end

local messages_mt = {}

function messages_mt:__index(k)
	local val = Array()
	self[k] = val
	return val
end

local all_codes = {}

local language_names = {}
local etym_language_names = {}
local family_names = {}
local script_names = {}

local nonempty_families = {}
local allowed_empty_families = {tbq = true}
local nonempty_scripts = {}
	
local function link(obj, code_first)
	return type(obj) == "string" and obj or
		code_first and format("<code>%s</code> (%s)", obj:getCode(), obj:makeCategoryLink()) or
		format("%s (<code>%s</code>)", obj:makeCategoryLink(), obj:getCode())
end

local function check_data_keys(...)
	local valid_keys = Array(...):toSet()
	
	return function (modname, obj, data)
		local invalid_keys
		for k in pairs(data) do
			if not valid_keys[k] then
				if not invalid_keys then
					invalid_keys = Array(k)
				else
					invalid_keys:insert(k)
				end
			end
		end
		if invalid_keys == nil then
			return
		end
		local plural = #invalid_keys ~= 1
		discrepancy(modname,
			"The data key%s %s for %s %s invalid.",
			plural and "s" or "",
			invalid_keys:map(function(key)
				return "<code>" .. key .. "</code>"
			end):concat(", "),
			link(obj),
			plural and "are" or "is"
		)
	end
end

-- Modification of isArray in [[Module:table]].
-- This assumes all keys are either integers or non-numbers.
-- If there are fractional numbers, the results might be incorrect.
-- For instance, find_gap{"a", "b", [0.5] = true} evaluates to 3, but there
-- isn't a gap at 3 in the sense of there being an integer key greater than 3.
local function find_gap(t, can_contain_non_number_keys)
	local i = 0
	for k in pairs(t) do
		if not (can_contain_non_number_keys and type(k) ~= "number") then
			i = i + 1
			if t[i] == nil then
				return i
			end
		end
	end
end

local function check_true_or_string_or_nil(modname, obj, data, key)
	local field = data[key]
	if not (field == nil or field == true or type(field) == "string") then
		discrepancy(modname,
			"%s has %s <code>%s</code> value that is not <code>nil</code>, <code>true</code> or a string: <code>%s</code>",
			link(obj), get_indefinite_article(key), key, dump(data[key])
		)
	end
end

local function check_array(modname, obj, data, array_name, subarray_name, can_contain_non_number_keys)
	local subtable = data
	if subarray_name then
		subtable = assert(data[subarray_name], subarray_name)
	end
	local array_type = type(subtable[array_name])
	if array_type == "table" then
		local gap = find_gap(subtable[array_name], can_contain_non_number_keys)
		if gap then
			discrepancy(modname,
				"The %s array in %sthe data table for %s has a gap at index %d.",
				array_name,
				subarray_name and "the " .. subarray_name .. " field in " or "",
				link(obj),
				gap
			)
		else
			return true
		end
	else
		discrepancy(modname,
			"The %s field in %sthe data table for %s should be an array (table) but is %s.",
			array_name,
			subarray_name and "the " .. subarray_name .. " field in " or "",
			link(obj),
			array_type == "nil" and "nil" or "a " .. array_type
		)
	end
end

local function check_no_alias_codes(modname, mod_data)
	local lookup, discrepancies = {}, {}
	for k, v in pairs(mod_data) do
		local check = lookup[v]
		if check then
			discrepancies[check] = discrepancies[check] or {"<code>" .. check .. "</code>"}
			insert(discrepancies[check], "<code>" .. k .. "</code>")
		else
			lookup[v] = k
		end
	end
	for _, v in pairs(discrepancies) do
		discrepancy(modname,
			"The codes %s are currently alias codes. Only one code should be used in the data.",
			list_to_text(v, ", ", " and ")
		)
	end
end

local function check_wikidata_item(modname, obj, data, key)
	local data_item = data[key]
	if data_item == nil or is_positive_integer(data_item) then
		return
	end
	discrepancy(modname,
		"%s has a Wikidata item ID that is not a positive integer: <code>%s</code>",
		link(obj), dump(data_item)
	)
end

local function check_name_field(modname, obj, data, canonical_name, data_key, allow_nested)
	local array = data[data_key]
	if not array then
		return
	end
	check_array(modname, obj, data, data_key, nil, true)

	local names = {}
	local function check_other_name(other_name)
		if other_name == canonical_name then
			discrepancy(modname,
				"%s has its canonical name (<code>%s</code>) repeated in the table of <code>%s</code>.",
				link(obj), dump(canonical_name), data_key
			)
		end
		if names[other_name] then
			discrepancy(modname,
				"The name %s is found twice or more in the list of <code>%s</code> for %s.",
				other_name, data_key, link(obj)
			)
		end
		names[other_name] = true
	end

	for _, other_name in ipairs(array) do
		if type(other_name) == "table" then
			if not allow_nested then
				discrepancy(modname,
					"A nested table is found in the list of <code>%s</code> for %s, but isn't allowed.",
					data_key, link(obj)
				)
			else
				for _, on in ipairs(other_name) do
					check_other_name(on)
				end
			end
		else
			check_other_name(other_name)
		end
	end
end

local function check_other_names_aliases_varieties(modname, obj, data, canonical_name)
	if data.otherNames then
		check_name_field(modname, obj, data, canonical_name, "otherNames")
	end
	if data.aliases then
		check_name_field(modname, obj, data, canonical_name, "aliases")
	end
	if data.varieties then
		check_name_field(modname, obj, data, canonical_name, "varieties", true)
	end
end

local function validate_pattern(pattern, modname, obj, standardChars)
	if type(pattern) ~= "string" then
		return discrepancy(modname,
			"\"%s\", the %spattern for %s, is not a string.",
			pattern, standardChars and "standard character " or "", link(obj)
		)
	elseif not isutf8(pattern) then
		return discrepancy(modname,
			"%s specifies a pattern for for %scharacter detection which is not valid UTF-8: <code>%s</code>",
			link(obj), standardChars and "standard " or "", dump(pattern)
		)
	end
	local ranges
	for lower, higher in gmatch(pattern, "(.[\128-\191]*)%-%%?(.[\128-\191]*)") do
		if codepoint(lower) >= codepoint(higher) then
			ranges = ranges or Array()
			insert(ranges, { lower, higher })
		end
	end
	if ranges and ranges[1] then
		local plural = #ranges ~= 1 and "s" or ""
		discrepancy(modname,
			"%s specifies an invalid pattern " ..
			"for %scharacter detection: <code>%s</code>. The first codepoint%s " ..
			"in the range%s %s %s must be less than or equal to the second.",
			link(obj), standardChars and "standard " or "", dump(pattern), plural, plural,
			ranges:map(function(range)
				return format(range[1] .. "-" .. range[2] .. " (U+%X, U+%X)", codepoint(range[1]), codepoint(range[2]))
			end):concat(", "),
			#ranges ~= 1 and "are" or "is"
		)
	end
	local success, result = pcall(umatch, "", "[" .. pattern .. "]")
	if not success then
		discrepancy(modname,
			"%s specifies an invalid pattern for %scharacter detection: <code>%s</code> (%s)",
			link(obj), standardChars and "standard " or "", dump(pattern), result
		)
	end
end

local remove_exceptions_addition = 0xF0000
local maximum_code_point = 0x10FFFF
local remove_exceptions_maximum_code_point = maximum_code_point - remove_exceptions_addition

local function check_entry_name_sortkey_display(modname, obj, data, replacements_name)
	local replacements = data[replacements_name]
	if type(replacements) == "string" then
		if not (replacements_name == "sort_key" or replacements_name == "entry_name") then
			discrepancy(modname,
				"The %s field in the data table for %s must be a table.",
				replacements_name, link(obj)
			)
		end
		return
	end
	
	if (replacements.from ~= nil) ~= (replacements.to ~= nil) then
		discrepancy(modname,
			"The <code>from</code> and <code>to</code> arrays in the <code>%s</code> table for %s are not both defined or both undefined.",
			replacements_name, link(obj)
		)
	elseif replacements.from then
		for _, key in ipairs {"from", "to"} do
			check_array(modname, obj, data, key, replacements_name)
		end
	end
	
	if replacements.remove_diacritics and type(replacements.remove_diacritics) ~= "string" then
		discrepancy(modname,
			"The <code>remove_diacritics</code> field in the <code>%s</code> table for %s table must be a string.",
			replacements_name, link(obj)
		)
	end
	
	if replacements.remove_exceptions then
		if check_array(modname, obj, data, "remove_exceptions", replacements_name) then
			for sequence_i, sequence in ipairs(replacements.remove_exceptions) do
				local code_point_i = 0
				for code_point in gcodepoint(sequence) do
					code_point_i = code_point_i + 1
					if code_point > remove_exceptions_maximum_code_point then
						discrepancy(modname,
							"Code point #%d (0x%04X) in field #%d of the <code>remove_exceptions</code> array for %s is over U+%04X.",
							code_point_i, code_point, sequence_i, link(obj), remove_exceptions_maximum_code_point
						)
					end
					
				end
			end
		end
	end
	
	if replacements.from and replacements.to
			and table_len(replacements.to) > table_len(replacements.from) then
		discrepancy(modname,
			"The <code>from</code> array in the <code>%s</code> table for %s must be shorter or the same length as the <code>to</code> array.",
			replacements_name, link(obj)
		)
	end
end

local function has_ancestor(lang, code)
	for _, anc in ipairs(lang:getAncestors()) do
		if code == anc:getCode() or has_ancestor(anc, code) then
			return true
		end
	end
end

local function get_default_ancestors(lang)
	if lang:hasType("language", "etymology-only") then
		local parent = lang:getParent()
		if not has_ancestor(parent, lang:getCode()) then
			return parent:getAncestorCodes()
		end
	end
	local fam_code, def_anc = lang:getFamilyCode()
	while fam_code and fam_code ~= "qfa-not" do
		local fam = m_families_data[fam_code]
		def_anc = fam.protoLanguage or
			m_languages_data_all[fam_code .. "-pro"] and fam_code .. "-pro" or
			m_etym_languages_data[fam_code .. "-pro"] and fam_code .. "-pro"
		if def_anc and def_anc ~= lang:getCode() then
			return {def_anc}
		end
		fam_code = fam[3]
	end
end

local function iterate_ancestor(obj, modname, anc_code)
	local anc = get_language_by_code(anc_code, nil, true)
	if not anc then
		discrepancy(modname,
			"%s lists the invalid language code <code>%s</code> as its ancestor.",
			link(obj), dump(anc_code)
		)
		return
	end
	local anc_fam = anc:getFamily()
	if not anc_fam then
		discrepancy(modname,
			"%s has no family.",
			link(anc)
		)
		return
	end
	local anc_fam_code = anc_fam:getCode()
	local def_ancs = get_default_ancestors(obj)
	if def_ancs then
		for _, def_anc in ipairs(def_ancs) do
			def_anc = get_language_by_code(def_anc, nil, true)
			if def_anc and (
				anc_code == def_anc:getCode() or
				has_ancestor(def_anc, anc_code) or
				def_anc:hasParent(anc_code) and not has_ancestor(anc, def_anc:getCode())
			) then
				discrepancy(modname,
					"%s has the ancestor %s listed in its ancestor field, which is redundant, since it is determined to be ancestral automatically.",
					link(obj), link(anc)
				)
			end
		end
	end
	if not obj:inFamily(anc_fam_code) then
		discrepancy(modname,
			"%s has %s set as an ancestor, but is not in the %s.",
			link(obj), link(anc), link(anc_fam)
		)
	end
	local fam, proto = obj
	repeat
		fam = fam:getFamily()
		proto = fam and fam:getProtoLanguage()
	until proto or not fam or fam:getCode() == "qfa-not"
	if proto and not (
		proto:getCode() == anc:getCode() or
		proto:hasAncestor(anc:getCode()) or
		anc:hasAncestor(proto:getCode())
	) then
		local fam = obj:getFamily()
		discrepancy(modname,
			"%s is in the %s and has %s set as an ancestor, but it is not possible to form an ancestral chain between them.",
			link(obj), link(fam), link(anc)
		)
	end
end

local function check_ancestors(modname, obj, data)
	local ancestors = data.ancestors
	if not ancestors then
		return
	elseif type(ancestors) == "string" then
		ancestors = split(ancestors, "%s*,%s*", true)
	end
	for _, anc in ipairs(ancestors) do
		iterate_ancestor(obj, modname, anc)
	end
end
	
local function check_code_to_name_and_name_to_code_maps(
		source_module_type,
		source_module_description,
		code_to_module_map, name_to_code_map,
		code_to_name_modname, code_to_name_module,
		name_to_code_modname, name_to_code_module
)
	
	local function check_code_and_name(modname, code, canonical_name)
		-- Check the code is in code_to_module_map and that it didn't originate from the wrong data module.
		local check_mod = code_to_module_map[code] or code_to_module_map[aliases[code]]
		if not (check_mod and match(check_mod, "^" .. source_module_type .. "/data")) then
			if not name_to_code_map[canonical_name] then
				discrepancy(modname,
					"The code <code>%s</code> and the canonical name %s should be removed; they are not found in %s.",
					code, canonical_name, source_module_description
				)
			else
				discrepancy(modname,
					"<code>%s</code>, the code for the canonical name %s, is wrong; it should be <code>%s</code>.",
					code, canonical_name, name_to_code_map[canonical_name]
				)
			end
		elseif not name_to_code_map[canonical_name] then
			local data_table = require("Module:" .. code_to_module_map[code])[code]
			discrepancy(modname,
				"%s, the canonical name for the code <code>%s</code>, is wrong; it should be %s.",
				canonical_name, code, data_table[1]
			)
		end
	end

	for code, canonical_name in pairs(code_to_name_module) do
		check_code_and_name(code_to_name_modname, code, canonical_name)
	end
	
	for canonical_name, code in pairs(name_to_code_module) do
		check_code_and_name(name_to_code_modname, code, canonical_name)
	end
end

local function check_extraneous_extra_data(
		data_modname, data_module, extra_data_modname, extra_data_module)
	for code, _ in pairs(extra_data_module) do
		if not data_module[code] then
			discrepancy(extra_data_modname,
				"The code <code>%s</code> is not found in [[Module:%s]], and should be removed from [[Module:%s]].",
				code, data_modname, extra_data_modname
			)
		end
	end
end

-- TODO: add collision check between the canonical names "X" and "X [Ll]anguage".
local function check_languages(frame)
	local check_language_data_keys = check_data_keys(
		1, 2, 3, 4, -- canonical name, Wikidata item, family, scripts
		"display_text", "generate_forms", "entry_name", "sort_key",
		"otherNames", "aliases", "varieties", "ietf_subtag",
		"type", "ancestors",
		"wikimedia_codes", "wikipedia_article", "standardChars",
		"translit", "override_translit", "link_tr",
		"dotted_dotless_i"
	)
	
	local function check_language(modname, code, data, extra_modname, extra_data)
		local obj, code_modname, canonical_name = make_lang(code, data, true), get_data_module_name(code), data[1]
		
		if code_modname ~= modname then
			if code_modname == "languages/data/2" then
				discrepancy(modname,
					"%s is a two-letter code, so should be moved to [[Module:%s]].",
					link(obj), code_modname
				)
			elseif code_modname == "languages/data/exceptional" then
				discrepancy(modname,
					"%s is an exceptional code, as it does not consist of two or three lowercase letters, so should be moved to [[Module:%s]].",
					link(obj), code_modname
				)
			else
				discrepancy(modname,
					"%s is a three-letter code beginning with '%s', so should be moved to [[Module:%s]].",
					link(obj), sub(code, 1, 1), code_modname
				)
			end
		end
		
		check_language_data_keys(modname, obj, data)
		
		if all_codes[code] then
			discrepancy(modname,
				"The code <code>%s</code> is not unique; it is also defined in [[Module:%s]].",
				code, all_codes[code]
			)
		else
			if not m_languages_codes[code] then
				discrepancy("languages/code to canonical name",
					"The code %s is missing.",
					link(obj, true)
				)
			end
			all_codes[code] = modname
		end
		
		if sub(code, -4) == "-pro" then
			local fam_code = sub(code, 1, -5)
			local fam = get_language_by_code(fam_code, nil, true, true)
			if not fam then
				discrepancy(modname,
					"%s has a proto-language code associated with the invalid code <code>%s</code>.",
					link(obj), dump(fam_code)
				)
			elseif not fam:hasType("family") then
				discrepancy(modname,
					"%s has a proto-language code associated with %s, which is not a family.",
					link(obj), link(fam)
				)
			else
				local expected_name = "Proto-" .. fam:getCanonicalName()
				if canonical_name ~= expected_name then
					discrepancy(modname,
						"%s does not have the expected name \"%s\", even though it is the proto-language of the %s.",
						link(obj), expected_name, link(fam)
					)
				end
			end
		end
		
		if not canonical_name then
			discrepancy(modname,
				"The code <code>%s</code> has no canonical name specified.",
				code
			)
		elseif language_names[canonical_name] then
			local canonical_lang = get_language_by_canonical_name(canonical_name)
			if not canonical_lang then
				discrepancy(modname,
					"%s has a canonical name that cannot be looked up.",
					link(obj)
				)
			elseif data.main_code ~= canonical_lang:getCode() then
				discrepancy(modname,
					"%s has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
					link(obj), language_names[canonical_name]
				)
			end
		else
			if not m_languages_canonical_names[canonical_name] then
				discrepancy("languages/canonical names",
					"The canonical name %s is missing.",
					link(obj)
				)
			end
			language_names[canonical_name] = code
		end
		
		check_wikidata_item(modname, obj, data, 2)

		if extra_data then
			check_other_names_aliases_varieties(modname, obj, extra_data, canonical_name)
		end
		
		local lang_type = data.type
		if lang_type and not (lang_type == "regular" or lang_type == "reconstructed" or lang_type == "appendix-constructed") then
			discrepancy(modname,
				"%s is of the invalid type <code>%s</code>.",
				link(obj), lang_type
			)
		end
		
		if data.aliases then
			discrepancy(modname,
				"%s has an <code>aliases</code> key in [[Module:%s]]. This must be moved to [[Module:%s]].",
				link(obj), modname, extra_modname
			)
		end
		
		if data.varieties then
			discrepancy(modname,
				"%s has the <code>varieties</code> key in [[Module:%s]]. This must be moved to [[Module:%s]].",
				link(obj), modname, extra_modname
			)
		end
		
		if data.otherNames then
			discrepancy(modname,
				"%s has the <code>otherNames</code> key in [[Module:%s]]. This must be moved to [[Module:%s]].",
				link(obj), modname, extra_modname
			)
		end
		
		if not extra_data then
			discrepancy(extra_modname,
				"%s has data in [[Module:%s]], but does not have corresponding data in [[Module:%s]].",
				link(obj), modname, extra_modname
			)
		--[[elseif extra_data.otherNames then
			discrepancy(extra_modname,
				"%s has <code>otherNames</code> key, but these should be changed to either <code>aliases</code> or <code>varieties</code>.",
				link(obj)
			)]]
		end
		
		local sc = data[4]
		if sc then
			if type(sc) == "string" then
				sc = split(sc, "%s*,%s*", true)
			end
			if type(sc) == "table" then
				if not sc[1] then
					discrepancy(modname,
						"%s has no scripts listed.",
						link(obj)
					)
				else
					for _, sccode in ipairs(sc) do
						local cur_sc = m_scripts_data[sccode]
						if not (cur_sc or sccode == "All" or sccode == "Hants") then
							discrepancy(modname,
								"%s lists the invalid script code <code>%s</code>.",
								link(obj), dump(sccode)
							)
						--[[elseif not cur_sc.characters then
							discrepancy(modname,
								"%s lists the %s, which does not have any characters.",
								link(obj), link(get_script_by_code(sccode))
							)]]
						end
			
						nonempty_scripts[sccode] = true
					end
				end
			else
				discrepancy(modname,
					"The %s field for %s must be a table or string.",
					4, link(obj)
				)
			end
		end
		
		if data.ancestors then
			check_ancestors(modname, obj, data)
		end
		
		if data[3] then
			local family = data[3]
			if not m_families_data[family] then
				discrepancy(modname,
					"%s has the invalid family code <code>%s</code>.",
					link(obj), dump(family)
				)
			end
			
			nonempty_families[family] = true
		end
		
		if data.sort_key then
			check_entry_name_sortkey_display(modname, obj, data, "sort_key")
		end
		
		if data.entry_name then
			check_entry_name_sortkey_display(modname, obj, data, "entry_name")
		end

		if data.display then
			check_entry_name_sortkey_display(modname, obj, data, "display")
		end

		if data.standardChars then
			if type(data.standardChars) == "table" then
				local sccodes = {}
				for _, sccode in ipairs(sc) do
					sccodes[sccode] = true
				end
				for sccode in pairs(data.standardChars) do
					if not (sccodes[sccode] or sccode == 1) then
						discrepancy(modname,
							"The field %s in the <code>standardChars</code> table for %s does not match any script for that language.",
							sccode, link(obj)
						)
					end
				end
			elseif data.standardChars and type(data.standardChars) ~= "string" then
				discrepancy(modname,
					"The <code>standardChars</code> field in the data table for %s must be a string or table.",
					link(obj)
				)
			end
		end
		
		check_true_or_string_or_nil(modname, obj, data, "override_translit")
		check_true_or_string_or_nil(modname, obj, data, "link_tr")
		
		if data.override_translit and not data.translit then
			discrepancy(modname,
				"%s has the <code>override_translit</code> field set, but no transliteration module",
				link(obj)
			)
		end
	end
	
	local function check_module(modname)
		local mod_data = load_data("Module:" .. modname)
		local extra_modname = modname .. "/extra"
		local extra_mod_data = load_data("Module:" .. extra_modname)
		for code, data in pairs(mod_data) do
			check_language(modname, code, data, extra_modname, extra_mod_data[code])
		end
		check_no_alias_codes(modname, mod_data)
		check_no_alias_codes(extra_modname, extra_mod_data)
		check_extraneous_extra_data(modname, mod_data, extra_modname, extra_mod_data)
	end
	
	-- Check two-letter codes
	check_module(
		"languages/data/2"
	)
	
	-- Check three-letter codes
	for i = 0x61, 0x7A do -- a to z
		check_module(
			format("languages/data/3/%c", i)
		)
	end
	
	-- Check exceptional codes
	check_module(
		"languages/data/exceptional"
	)
	
	-- These checks must be done while all_codes only contains language codes:
	-- that is, after language data modules have been processed, but before
	-- etymology languages, families, and scripts have.
	check_code_to_name_and_name_to_code_maps(
		"languages",
		"a submodule of [[Module:languages]]",
		all_codes, language_names,
		"languages/code to canonical name", m_languages_codes,
		"languages/canonical names", m_languages_canonical_names
	)
	
	-- Check [[Template:langname-lite]]
	local modname = "Template:langname-lite"
	for code, name in gmatch(remove_comments(new_title(modname):getContent()), "\n\t*|#*([^\n]+)=([^\n]*)") do
		if #code > 1 and code ~= "default" then
			for _, code in pairs(split(code, "|", true)) do
				local lang = get_language_by_code(code, nil, true, true)
				if match(name, "etymcode") then
					local nonEtym_name = frame:preprocess(name)
					local nonEtym_real_name = lang:getFullName()
					if nonEtym_name ~= nonEtym_real_name then
						discrepancy(modname,
							"Code: <code>%s</code>. Saw name: %s. Expected name: %s.",
							code, nonEtym_name, nonEtym_real_name
						)
					end
					name = frame:preprocess(gsub(name, "{{{allow etym|}}}", "1"))
				elseif match(name, "familycode") then
					name = match(name, "familycode|(.-)|")
				else
					name = name
				end
				if not lang then
					discrepancy(modname,
						"Code: <code>%s</code>. Saw name: %s. Language not present in data.",
						code, name
					)
				else
					local real_name = lang:getCanonicalName()
					if name ~= real_name then
						discrepancy(modname,
							"Code: <code>%s</code>. Saw name: %s. Expected name: %s.",
							code, name, real_name
						)
					end
				end
			end
		end
	end
end

local function check_etym_languages()
	local modname = "etymology languages/data"
	
	local check_etymology_language_data_keys = check_data_keys(
		1, 2, 3, 4, -- canonical name, Wikidata item, family, scripts
		"parent", "display_text", "generate_forms", "entry_name", "sort_key",
		"otherNames", "aliases", "varieties", "ietf_subtag",
		"type", "main_code", "ancestors",
		"wikimedia_codes", "wikipedia_article", "standardChars",
		"translit", "override_translit", "link_tr",
		"dotted_dotless_i"
	)
	
	local checked = {}
	for code, data in pairs(m_etym_languages_data) do
		local obj, canonical_name, parent = make_lang(code, data, true), data[1], data.parent
		
		check_etymology_language_data_keys(modname, obj, data)
		
		if all_codes[code] then
			discrepancy(modname,
				"The code <code>%s</code> is not unique; it is also defined in [[Module:%s]].",
				code, all_codes[code]
			)
		else
			if not m_etym_languages_codes[code] then
				discrepancy("etymology languages/code to canonical name",
					"The code %s is missing.",
					link(obj, true)
				)
			end
			all_codes[code] = modname
		end
		
		if not canonical_name then
			discrepancy(modname,
				"The code <code>%s</code> has no canonical name specified.",
				code
			)
		elseif language_names[canonical_name] then
			local canonical_lang = get_language_by_canonical_name(canonical_name, nil, true)
			if not canonical_lang then
				discrepancy(modname,
					"%s has a canonical name that cannot be looked up.",
					link(obj)
				)
			elseif data.main_code ~= canonical_lang:getCode() then
				discrepancy(modname,
					"%s has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
					link(obj), language_names[canonical_name]
				)
			end
		else
			if not m_etym_languages_canonical_names[canonical_name] then
				discrepancy("etymology languages/canonical names",
					"The canonical name %s is missing.",
					link(obj)
				)
			end
			etym_language_names[canonical_name] = code
		end
		
		check_other_names_aliases_varieties(modname, obj, data, canonical_name)
		
		if parent then
			if type(parent) ~= "string" then
				discrepancy(modname,
					"%s has a parent code that is %s rather than a string.",
					link(obj), parent == nil and "nil" or "a " .. type(parent)
				)
			elseif not (m_languages_data_all[parent] or m_families_data[parent] or m_etym_languages_data[parent]) then
				discrepancy(modname,
					"%s has the invalid parent code <code>%s</code>.",
					link(obj), dump(parent)
				)
			end
			nonempty_families[parent] = true
		else
			discrepancy(modname,
				"%s has no parent code.",
				link(obj)
			)
		end
		
		if data.ancestors then
			check_ancestors(modname, obj, data)
		end
		
		if data[3] then
			local family = data[3]
			if not m_families_data[family] then
				discrepancy(modname,
					"%s has the invalid family code <code>%s</code>.",
					link(obj), dump(family))
			end
			nonempty_families[family] = true
		end
		
		check_wikidata_item(modname, obj, data, 2)
		
		local stack = {}
		while data do
			if checked[code] then
				break	
			elseif stack[code] then
				local parent = data.parent
				discrepancy(modname,
					"%s has a cyclic parental relationship to %s",
					link(make_lang(code, data, true)),
					link(get_language_by_code(parent, nil, true))
				)
				break
			end
			stack[code] = true
			code = data.parent
			data = m_etym_languages_data[code]
		end
		
		for code in pairs(stack) do
			checked[code] = true	
		end
	end
	
	check_no_alias_codes(modname, m_etym_languages_data)
	
	check_code_to_name_and_name_to_code_maps(
		"etymology languages",
		"[[Module:etymology languages/data]]",
		all_codes, etym_language_names,
		"etymology languages/code to canonical name", m_etym_languages_codes,
		"etymology languages/canonical names", m_etym_languages_canonical_names)
end

-- TODO: add collision check between the canonical names "X" and "X [Ll]anguages".
local function check_families()
	local modname = "families/data"
	
	local check_family_data_keys = check_data_keys(
		1, 2, 3, -- canonical name, Wikidata item, (parent) family
		"type", "ietf_subtag",
		"protoLanguage", "otherNames", "aliases", "varieties"
	)
	
	local checked = {["qfa-not"] = true}
	for code, data in pairs(m_families_data) do
		local obj, canonical_name, family, protolang = make_family(code, data), data[1], data[3], data.protoLanguage
		
		check_family_data_keys(modname, obj, data)
		
		if all_codes[code] then
			discrepancy(modname,
				"The code <code>%s</code> is not unique; it is also defined in [[Module:%s]].",
				code, all_codes[code]
			)
		else
			if not m_families_codes[code] then
				discrepancy("families/code to canonical name",
					"The code %s is missing.",
					link(obj, true)
				)
			end
			all_codes[code] = modname
		end
		
		if not canonical_name then
			discrepancy(modname,
				"The code <code>%s</code> has no canonical name specified.",
				code
			)
		elseif family_names[canonical_name] then
			local canonical_family = get_family_by_canonical_name(canonical_name)
			if not canonical_family then
				discrepancy(modname,
					"%s has a canonical name that cannot be looked up.",
					link(obj)
				)
			elseif data.main_code ~= canonical_family:getCode() then
				discrepancy(modname,
					"%s has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
					link(obj), family_names[canonical_name]
				)
			end
		else
			if not m_families_canonical_names[canonical_name] then
				discrepancy("families/canonical names",
					"The canonical name %s is missing.",
					link(obj)
				)
			end
			family_names[canonical_name] = code
		end
		
		check_other_names_aliases_varieties(modname, obj, data, canonical_name)
		
		if family then
			if family == code and code ~= "qfa-not" then
				discrepancy(modname,
					"%s has itself as its family.",
					link(obj)
				)
			elseif not m_families_data[family] then
				discrepancy(modname,
					"%s has the invalid parent family code <code>%s</code>.",
					link(obj), dump(family)
				)
			end
			
			nonempty_families[family] = true
		end
		
		if protolang then
			local protolang_obj = get_language_by_code(protolang, nil, true)
			if not protolang_obj then
				discrepancy(modname,
					"%s has the invalid proto-language code <code>%s</code>.",
					link(obj), dump(protolang)
				)
			elseif protolang == code .. "-pro" then
				discrepancy(modname,
					"%s has %s listed as its proto-language, which is redundant, since it is determined to be the proto-language automatically.",
					link(obj), link(protolang_obj)
				)
			elseif sub(protolang, -4) == "-pro" then
				discrepancy(modname,
					"%s has %s listed as its proto-language, which is supposed to be the proto-language for the family <code>%s</code>.", link(obj), link(protolang_obj), sub(protolang, 1, -5)
				)
			end
		end
		
		check_wikidata_item(modname, obj, data, 2)
		
		if not (nonempty_families[code] or allowed_empty_families[code]) then
			discrepancy(modname,
				"%s has no child families or languages.",
				link(obj)
			)
		end
		
		local stack = {}
		while data do
			if checked[code] then
				break	
			elseif stack[code] then
				local parent = data[3]
				discrepancy(modname,
					"%s has a cyclic familial relationship to %s",
					link(make_family(code, data)),
					link(get_family_by_code(parent))
				)
				break
			end
			stack[code] = true
			code = data[3]
			data = m_families_data[code]
		end
		
		for code in pairs(stack) do
			checked[code] = true	
		end
	end
	
	check_no_alias_codes(modname, m_families_data)
	
	check_code_to_name_and_name_to_code_maps(
		"families",
		"[[Module:families/data]]",
		all_codes, family_names,
		"families/code to canonical name", m_families_codes,
		"families/canonical names", m_families_canonical_names)
end

-- TODO: add collision check between the canonical names "X" and "X [Ss]cript".
local function check_scripts()
	local modname = "scripts/data"
	
	local check_script_data_keys = check_data_keys(
		1, 2, 3, -- canonical name, Wikidata item, writing systems
		"otherNames", "aliases", "varieties", "parent", "ietf_subtag", "type",
		"wikipedia_article", "ranges", "characters", "spaces", "capitalized", "translit", "direction",
		"character_category", "normalizationFixes", "sort_by_scraping"
	)
	
	-- Just to satisfy requirements of check_code_to_name_and_name_to_code_maps.
	local script_code_to_module_map = {}
	
	for code, data in pairs(m_scripts_data) do
		local obj, canonical_name = make_script(code, data), data[1]
		
		if not m_scripts_codes[code] and #code == 4 then
			discrepancy("scripts/code to canonical name",
				"The code %s is missing",
				link(obj, true)
			)
		end
		
		check_script_data_keys(modname, obj, data)
		
		if not canonical_name then
			discrepancy(modname,
				"The code <code>%s</code> has no canonical name specified.",
				code
			)
		elseif script_names[canonical_name] then
			local canonical_script = get_script_by_canonical_name(canonical_name)
			if not canonical_script then
				discrepancy(modname,
					"%s has a canonical name that cannot be looked up.",
					link(obj)
				)
			--[[elseif data.main_code ~= canonical_script:getCode() then
				discrepancy(modname,
					"%s has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
					link(obj), script_names[canonical_name]
				)]]
			end
		else
			if not m_scripts_canonical_names[canonical_name] and #code == 4 then
				discrepancy("scripts/by name",
					"The canonical name %s is missing.",
					link(obj)
				)
			end
			script_names[canonical_name] = code
		end
		
		check_other_names_aliases_varieties(modname, obj, data, canonical_name)
		
		if not nonempty_scripts[code] then
			discrepancy(modname,
				"%s is not used by any language%s.",
				link(obj), data.characters and ""
					or " and has no characters listed for auto-detection")
		
		--[[elseif not data.characters then
			discrepancy(modname,
				"%s has no characters listed for auto-detection.",
				link(obj)
			)--]]
		end

		if data.characters then
			validate_pattern(data.characters, modname, obj, false)
		end
		
		check_wikidata_item(modname, obj, data, 2)
		
		script_code_to_module_map[code] = modname
	end
	
	check_no_alias_codes(modname, m_scripts_data)
	
	check_code_to_name_and_name_to_code_maps(
		"scripts",
		"a submodule of [[Module:scripts]]",
		script_code_to_module_map, script_names,
		"scripts/code to canonical name", m_scripts_codes,
		"scripts/by name", m_scripts_canonical_names)
end

-- FIXME: this is quite messy.
local function check_wikidata_languages()
	local data = json_decode(new_title("Module:languages/data/wikidata.json"):getContent())
	
	local seen = {{}, {}, {}, [5] = {}}
	for _, item in ipairs(data) do
		local id = item.id
		for k, v in pairs(item) do
			if k ~= "id" then
				local _seen = seen[k]
				for _, code in ipairs(v) do
					local _code = code[1]
					local _type = type(_seen[_code])
					if _type == "table" then
						insert(_seen[_code], id)
					elseif _type == "string" then
						_seen[_code] = {_seen[_code], id}
					else
						_seen[_code] = id
					end
				end
			end
		end
	end
	
	local modname = "languages/data/wikidata.json"
	for k, v in pairs(seen) do
		for code, ids in pairs(v) do
			if type(ids) == "table" then
				local t = {}
				for i, id in ipairs(ids) do
					t[i] = format("<code>[[d:%s|%s]]</code>", id, id)
				end
				discrepancy(modname,
					"<code>%s</code> is set as an ISO 639-%d code on multiple items: %s.",
					code, k, list_to_text(t)
				)
				
			end
		end
	end
end

local function check_labels()
	local check_label_data_keys = check_data_keys(
		"display", "Wikipedia", "glossary",
		"plain_categories", "topical_categories", "pos_categories", "regional_categories", "sense_categories",
		"omit_preComma", "omit_postComma", "omit_preSpace",
		"deprecated", "track"
	)
	
	local function check_label(modname, code, data)
		local _type = type(data)
		if _type == "table" then
			check_label_data_keys(modname, code, data)
		elseif _type ~= "string" then
			discrepancy(modname,
				"The data for the label <code>%s</code> is %s %s; only tables and strings are allowed.",
				code, add_indefinite_article(_type)
			)
		end
	end
	
	for _, module in ipairs{"", "/regional", "/topical"} do
		local modname = "Module:labels/data" .. module
		module = require(modname)
		for label, data in pairs(module) do
			check_label(modname, label, data)
		end
	end
	
	for code in pairs(m_languages_codes) do
		local modname = "Module:labels/data/lang/" .. code
		local module = safe_require(modname)
		if module then
			for label, data in pairs(module) do
				check_label(modname, label, data)
			end
		end
	end
end

local function check_zh_trad_simp()
	local m_ts = require("Module:zh/data/ts")
	local m_st = require("Module:zh/data/st")
	local ruby = require("Module:ja-ruby").ruby_auto
	local lang = get_language_by_code("zh")
	local Hant = get_script_by_code("Hant")
	local Hans = get_script_by_code("Hans")
	
	local data = {[0] = m_st, m_ts}
	local mod = {[0] = "st", "ts"}
	local var = {[0] = "Simp.", "Trad."}
	local sc = {[0] = Hans, Hant}
	
	local function find_stable_loop(chars, other, j)
		local display = ruby({["markup"] = "[" .. other .. "](" .. var[(j+1)%2] .. ")"})
		display = language_link{term = other, alt = display, lang = lang, sc = sc[(j+1)%2], tr = "-"}
		insert(chars, display)
		if data[(j+1)%2][other] == other then
			insert(chars, other)
			return chars, 1
		elseif not data[(j+1)%2][other] then
			insert(chars, "not found")
			return chars, 2
		elseif data[j%2][data[(j+1)%2][other]] ~= other then
			return find_stable_loop(chars, data[(j+1)%2][other], j + 1)
		else
			local display = ruby({["markup"] = "[" .. data[(j+1)%2][other] .. "](" .. var[j%2] .. ")"})
			display = language_link{term = data[(j+1)%2][other], alt = display, lang = lang, sc = sc[j%2], tr = "-"}
			insert(chars, display .. " (")
			display = ruby({["markup"] = "[" .. data[j%2][data[(j+1)%2][other]] .. "](" .. var[(j+1)%2] .. ")"})
			display = language_link{term = data[j%2][data[(j+1)%2][other]], alt = display, lang = lang, sc = sc[(j+1)%2], tr = "-"}
			insert(chars, display .. " etc.)")
			return chars, 3
		end
		
		return chars
	end
	
	for i = 0, 1, 1 do
		for ch, other_ch in pairs(data[i]) do
			if data[(i+1)%2][other_ch] ~= ch then
				local chars, issue = {}
				local display = ruby({["markup"] = "[" .. ch .. "](" .. var[i] .. ")"})
				display = language_link{term = ch, alt = display, lang = lang, sc = sc[i], tr = "-"}
				insert(chars, display)
				chars, issue = find_stable_loop(chars, other_ch, i)
				if issue == 1 or issue == 2 then
					local sc_this, mod_this, j = {}
					if match(chars[#chars-1], var[(i+1)%2]) then
						j = 1
					else
						j = 0
					end
					mod_this = mod[(i+j)%2]
					sc_this = {[0] = sc[(i+j)%2], sc[(i+j+1)%2]}
					for k, ch in ipairs(chars) do
						chars[k] = tag_text(ch, lang, sc_this[k%2], "term")
					end
					local modname = "zh/data/" .. mod_this
					if issue == 1 then
						discrepancy(modname,
							"character references itself: %s",
							concat(chars, " → ")
						)
					elseif issue == 2 then
						discrepancy(modname,
							"missing character: %s",
							concat(chars, " → ")
						)
					end
				elseif issue == 3 then
					for j, ch in ipairs(chars) do
						chars[j] = tag_text(ch, lang, sc[(i+j)%2], "term")
					end
					discrepancy("zh/data/" .. mod[i],
						"possible mismatched character: %s",
						concat(chars, " → ")
					)
				end
			end
		end
	end
end

local function check_serialization(modname)
	local serializers = {
		["Hani-sortkey/data/serialized"] = "Hani-sortkey/serializer",
	}
	
	if not serializers[modname] then
		return nil
	end
	
	local serializer = serializers[modname]
	local current_data = require("မဝ်ဂျူ:" .. serializer).main(true)
	local stored_data = require("မဝ်ဂျူ:" .. modname)
	if current_data ~= stored_data then
		discrepancy(modname,
			"<strong><u>Important!</u> Serialized data is out of sync. Use [[Module:%s]] to update it. If you have made any changes to the underlying data, the serialized data <u>must</u> be updated before these changes will take effect.</strong>",
			serializer
		)
	end
end

local find_code = require("Module:memoize")(function(message)
	return match(message, "<code>([^<]+)</code>")
end)

local function compare_messages(message1, message2)
	local code1, code2 = find_code(message1), find_code(message2)
	if code1 and code2 then
		return code1 < code2
	else
		return message1 < message2
	end
end

-- Warning: cannot be called twice in the same module invocation because
-- some module-global variables are not reset between calls.
local function do_checks(frame, modules)
	messages = setmetatable({}, messages_mt)
	
	if modules["zh/data/ts"] or modules["zh/data/st"] then
		check_zh_trad_simp()
	end
	check_languages(frame)
	check_etym_languages()

	-- families and scripts must be checked AFTER languages; languages checks fill out
	-- the nonempty_families and nonempty_scripts tables, used for testing if a family/script
	-- is ever used in the data
	check_families()
	check_scripts()
	
	check_wikidata_languages()
	
	if modules["labels/data"] then
		check_labels()
	end
	
	for module in pairs(modules) do
		check_serialization(module)
	end
	
	setmetatable(messages, nil)
	
	for _, msglist in pairs(messages) do
		msglist:sort(compare_messages)
	end
	
	local ret = messages
	messages = nil
	return ret
end

local function format_message(modname, msglist)
	local header; if match(modname, "^မဝ်ဂျူ:") or match(modname, "^ထာမ်ပလိက်:") then
		header = "===[[" .. modname .. "]]==="
	else
		header = "===[[မဝ်ဂျူ:" .. modname .. "]]==="
	end
	return header .. msglist:map(function(msg)
		return "\n* " .. msg
	end):concat()
end

function export.check_modules_t(frame)
	local args = frame.args
	
	local modules = list_to_set(args)
	local ret = Array()
	local messages = do_checks(frame, modules)
	
	for _, module in ipairs(args) do
		local msglist = messages[module]
		if msglist then
			ret:insert(format_message(module, msglist))
		end
	end
	return ret:concat("\n")
end

function export.perform(frame)
	local messages = do_checks(frame, {})
	
	-- Format the messages
	local ret = Array()
	for modname, msglist in sorted_pairs(messages) do
		ret:insert(format_message(modname, msglist))
	end
	
	-- Are there any messages?
	-- TODO: check how many messages there are.
	if false then --if i == 1 then
		return "<b class=\"success\">Glory to Arstotzka.</b>"
	else
		ret:insert(1, "<b class=\"warning\">Discrepancies detected:</b>")
		return ret:concat("\n")
	end
end

return export