Modul:data consistency check

Daripada Wiktionary

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

Output[sunting]

Discrepancies detected:

Module:etymology languages/data

  • Code abr is not unique; it is also defined in Module:languages/data/3/a.
  • Bashkardi language (bsg-bas) has a canonical name that is not unique; it is also used by the code bsg.
  • Hokkien language (nan-hok) has a canonical name that is not unique; it is also used by the code nan.
  • Ardhamagadhi Prakrit language (pra-ard) has a canonical name that is not unique; it is also used by the code pka.
  • Maharastri Prakrit language (pra-mah) has a canonical name that is not unique; it is also used by the code pmh.
  • Sauraseni Prakrit language (pra-sau) has a canonical name that is not unique; it is also used by the code psu.
  • Rudbari language (rdb-rud) has a canonical name that is not unique; it is also used by the code rdb.
  • Chali language (tks-cal) has a canonical name that is not unique; it is also used by the code tgf.

Module:families/canonical names

  • The canonical name Gbaya Timur (alv-gbf) is missing.
  • Eastern Gbaya, the canonical name for the code alv-gbf, is wrong; it should be Gbaya Timur.
  • The canonical name Edo Utara Tengah (alv-nce) is missing.
  • North-Central Edoid, the canonical name for the code alv-nce, is wrong; it should be Edo Utara Tengah.
  • Edo Barat Lautmbia, the canonical name for the code alv-swd, is wrong; it should be Edo Barat Laut.
  • The canonical name Yorubo (alv-yrd) is missing.
  • Yoruboid, the canonical name for the code alv-yrd, is wrong; it should be Yorubo.
  • The canonical name Apache (apa) is missing.
  • Apachean, the canonical name for the code apa, is wrong; it should be Apache.
  • The canonical name Alacalufa (aqa) is missing.
  • Alacalufan, the canonical name for the code aqa, is wrong; it should be Alacalufa.
  • Algic, the canonical name for the code aql, is wrong; it should be Algik.
  • The canonical name Algik (aql) is missing.
  • The canonical name Athabaska Utara (ath-nor) is missing.
  • North Athabaskan, the canonical name for the code ath-nor, is wrong; it should be Athabaska Utara.
  • Pacific Coast Athabaskan, the canonical name for the code ath-pco, is wrong; it should be Athabaska Pantai Pasifik.
  • The canonical name Athabaska Pantai Pasifik (ath-pco) is missing.
  • The canonical name New South Wales Tengah (aus-cww) is missing.
  • Central New South Wales, the canonical name for the code aus-cww, is wrong; it should be New South Wales Tengah.
  • Southwest Pama-Nyungan, the canonical name for the code aus-psw, is wrong; it should be Pama-Nyungan Barat Laut.
  • The canonical name Pama-Nyungan Barat Laut (aus-psw) is missing.
  • Worrorran, the canonical name for the code aus-wor, is wrong; it should be Worrorra.
  • The canonical name Worrorra (aus-wor) is missing.
  • The canonical name Arawak (awd) is missing.
  • Arawakan, the canonical name for the code awd, is wrong; it should be Arawak.
  • Ta-Arawakan, the canonical name for the code awd-taa, is wrong; it should be Ta-Arawak.
  • The canonical name Ta-Arawak (awd-taa) is missing.
  • The canonical name Uto-Aztec (azc) is missing.
  • Uto-Aztecan, the canonical name for the code azc, is wrong; it should be Uto-Aztec.
  • Central Banda, the canonical name for the code bad-cnt, is wrong; it should be Banda Tengah.
  • The canonical name Banda Tengah (bad-cnt) is missing.
  • Berber, the canonical name for the code ber, is wrong; it should be Barbar.
  • The canonical name Barbar (ber) is missing.
  • The canonical name Bantu Timur Laut (bnt-bne) is missing.
  • Northeast Bantu, the canonical name for the code bnt-bne, is wrong; it should be Bantu Timur Laut.
  • The canonical name Bantu Tasik Besar (bnt-glb) is missing.
  • Great Lakes Bantu, the canonical name for the code bnt-glb, is wrong; it should be Bantu Tasik Besar.
  • The canonical name Bantu Barat Laut (bnt-swb) is missing.
  • Southwest Bantu, the canonical name for the code bnt-swb, is wrong; it should be Bantu Barat Laut.
  • The canonical name Andia (cau-and) is missing.
  • Andian, the canonical name for the code cau-and, is wrong; it should be Andia.
  • Avaro-Andian, the canonical name for the code cau-ava, is wrong; it should be Avaro-Andia.
  • The canonical name Avaro-Andia (cau-ava) is missing.
  • The canonical name Samur Timur (cau-esm) is missing.
  • Eastern Samur, the canonical name for the code cau-esm, is wrong; it should be Samur Timur.
  • East Tsezian, the canonical name for the code cau-ets, is wrong; it should be Tsez Timur.
  • The canonical name Tsez Timur (cau-ets) is missing.
  • Lezghian, the canonical name for the code cau-lzg, is wrong; it should be Lezghi.
  • The canonical name Lezghi (cau-lzg) is missing.
  • Northeast Caucasian, the canonical name for the code cau-nec, is wrong; it should be Kaukasus Timur Laut.
  • The canonical name Kaukasus Timur Laut (cau-nec) is missing.
  • The canonical name Kaukasus Barat Laut (cau-nwc) is missing.
  • Northwest Caucasian, the canonical name for the code cau-nwc, is wrong; it should be Kaukasus Barat Laut.
  • Southern Samur, the canonical name for the code cau-ssm, is wrong; it should be Samur Selatan.
  • The canonical name Samur Selatan (cau-ssm) is missing.
  • The canonical name Tsez (cau-tsz) is missing.
  • Tsezian, the canonical name for the code cau-tsz, is wrong; it should be Tsez.
  • Western Samur, the canonical name for the code cau-wsm, is wrong; it should be Samur Barat.
  • The canonical name Samur Barat (cau-wsm) is missing.
  • West Tsezian, the canonical name for the code cau-wts, is wrong; it should be Tsez Barat.
  • The canonical name Tsez Barat (cau-wts) is missing.
  • North Caucasian, the canonical name for the code ccn, is wrong; it should be Kaukasus Utara.
  • The canonical name Kaukasus Utara (ccn) is missing.
  • Kartvelian, the canonical name for the code ccs, is wrong; it should be Kartvelia.
  • The canonical name Kartvelia (ccs) is missing.
  • The canonical name Sudan Tengah (csu) is missing.
  • Central Sudanic, the canonical name for the code csu, is wrong; it should be Sudan Tengah.
  • The canonical name Dayak Darat (day) is missing.
  • Land Dayak, the canonical name for the code day, is wrong; it should be Dayak Darat.
  • East Manding, the canonical name for the code dmn-emn, is wrong; it should be Manding Timur.
  • The canonical name Manding Timur (dmn-emn) is missing.
  • Central Mande, the canonical name for the code dmn-mdc, is wrong; it should be Mande Tengah.
  • The canonical name Mande Tengah (dmn-mdc) is missing.
  • The canonical name Mande Timur (dmn-mde) is missing.
  • Eastern Mande, the canonical name for the code dmn-mde, is wrong; it should be Mande Timur.
  • Germanic, the canonical name for the code gem, is wrong; it should be Jermanik.
  • The canonical name Jermanik (gem) is missing.
  • The code ira-mid and the canonical name Middle Iranian should be removed; they are not found in Module:families/data.
  • The code ira-old and the canonical name Old Iranian should be removed; they are not found in Module:families/data.
  • The canonical name Atayal (map-ata) is missing.
  • Atayalic, the canonical name for the code map-ata, is wrong; it should be Atayal.
  • The canonical name Asli (mkh-asl) is missing.
  • Aslian, the canonical name for the code mkh-asl, is wrong; it should be Asli.
  • Katuic, the canonical name for the code mkh-kat, is wrong; it should be Katu.
  • The canonical name Katu (mkh-kat) is missing.
  • The canonical name Khmu (mkh-khm) is missing.
  • Khmuic, the canonical name for the code mkh-khm, is wrong; it should be Khmu.
  • Khmeric, the canonical name for the code mkh-kmr, is wrong; it should be Khmer.
  • The canonical name Khmer (mkh-kmr) is missing.
  • The canonical name Mon (mkh-mnc) is missing.
  • Monic, the canonical name for the code mkh-mnc, is wrong; it should be Mon.
  • The canonical name Palaung (mkh-pal) is missing.
  • Palaungic, the canonical name for the code mkh-pal, is wrong; it should be Palaung.
  • Vietic, the canonical name for the code mkh-vie, is wrong; it should be Viet.
  • The canonical name Viet (mkh-vie) is missing.
  • Mayan, the canonical name for the code myn, is wrong; it should be Maya.
  • The canonical name Maya (myn) is missing.
  • The canonical name Filipina (phi) is missing.
  • Philippine, the canonical name for the code phi, is wrong; it should be Filipina.
  • The canonical name Kepulauan Admiralty (poz-aay) is missing.
  • Admiralty Islands, the canonical name for the code poz-aay, is wrong; it should be Kepulauan Admiralty.
  • North Bornean, the canonical name for the code poz-bnn, is wrong; it should be Borneo Utara.
  • The canonical name Borneo Utara (poz-bnn) is missing.
  • The canonical name Borneo-Filipina (poz-bop) is missing.
  • Borneo-Philippines, the canonical name for the code poz-bop, is wrong; it should be Borneo-Filipina.
  • The canonical name Barito Timur (poz-bre) is missing.
  • East Barito, the canonical name for the code poz-bre, is wrong; it should be Barito Timur.
  • The canonical name Barito Barat (poz-brw) is missing.
  • West Barito, the canonical name for the code poz-brw, is wrong; it should be Barito Barat.
  • Melayu-Polinesia Tengah-Timur, the canonical name for the code poz-cet, is wrong; it should be Melayu Polinesia Tengah-Timur.
  • The canonical name Melayu Polinesia Tengah-Timur (poz-cet) is missing.
  • Celebic, the canonical name for the code poz-clb, is wrong; it should be Celebes.
  • The canonical name Celebes (poz-clb) is missing.
  • The canonical name New Caledonia (poz-cln) is missing.
  • New Caledonian, the canonical name for the code poz-cln, is wrong; it should be New Caledonia.
  • Central Maluku, the canonical name for the code poz-cma, is wrong; it should be Maluku Tengah.
  • The canonical name Maluku Tengah (poz-cma) is missing.
  • The canonical name Lampung (poz-lgx) is missing.
  • Lampungic, the canonical name for the code poz-lgx, is wrong; it should be Lampung.
  • The canonical name Mikronesia (poz-mic) is missing.
  • Micronesian, the canonical name for the code poz-mic, is wrong; it should be Mikronesia.
  • Northwest Sumatran, the canonical name for the code poz-nws, is wrong; it should be Sumatra Barat Laut.
  • The canonical name Sumatra Barat Laut (poz-nws) is missing.
  • Central-Eastern Oceanic, the canonical name for the code poz-occ, is wrong; it should be Oceania Tengah Timur.
  • The canonical name Oceania Tengah Timur (poz-occ) is missing.
  • The canonical name Oceania (poz-oce) is missing.
  • Oceanic, the canonical name for the code poz-oce, is wrong; it should be Oceania.
  • Western Oceanic, the canonical name for the code poz-ocw, is wrong; it should be Oceania Timur.
  • The canonical name Oceania Timur (poz-ocw) is missing.
  • The canonical name Polinesia Timur (poz-pep) is missing.
  • Eastern Polynesian, the canonical name for the code poz-pep, is wrong; it should be Polinesia Timur.
  • Nuclear Polynesian, the canonical name for the code poz-pnp, is wrong; it should be Polinesia Nuklear.
  • The canonical name Polinesia Nuklear (poz-pnp) is missing.
  • Polynesian, the canonical name for the code poz-pol, is wrong; it should be Polinesia.
  • The canonical name Polinesia (poz-pol) is missing.
  • The canonical name Sabah (poz-san) is missing.
  • Sabahan, the canonical name for the code poz-san, is wrong; it should be Sabah.
  • Sama-Bajaw, the canonical name for the code poz-sbj, is wrong; it should be Sama-Bajau.
  • The canonical name Sama-Bajau (poz-sbj) is missing.
  • The canonical name Solomon Tenggara (poz-sls) is missing.
  • Southeast Solomonic, the canonical name for the code poz-sls, is wrong; it should be Solomon Tenggara.
  • South Sulawesi, the canonical name for the code poz-ssw, is wrong; it should be Sulawesi Selatan.
  • The canonical name Sulawesi Selatan (poz-ssw) is missing.
  • North Sarawakan, the canonical name for the code poz-swa, is wrong; it should be Sarawak Utara.
  • The canonical name Sarawak Utara (poz-swa) is missing.
  • Timoric, the canonical name for the code poz-tim, is wrong; it should be Timor.
  • The canonical name Timor (poz-tim) is missing.
  • North-Central Vanuatu, the canonical name for the code poz-vnc, is wrong; it should be Vanuatu Utara Tengah.
  • The canonical name Vanuatu Utara Tengah (poz-vnc) is missing.
  • Central Great Andamanese, the canonical name for the code qfa-adc, is wrong; it should be Andaman Raya Tengah.
  • The canonical name Andaman Raya Tengah (qfa-adc) is missing.
  • The canonical name Andaman Raya (qfa-adm) is missing.
  • Great Andamanese, the canonical name for the code qfa-adm, is wrong; it should be Andaman Raya.
  • The canonical name Andaman Raya Utara (qfa-adn) is missing.
  • Northern Great Andamanese, the canonical name for the code qfa-adn, is wrong; it should be Andaman Raya Utara.
  • The canonical name Andaman Raya Selatan (qfa-ads) is missing.
  • Southern Great Andamanese, the canonical name for the code qfa-ads, is wrong; it should be Andaman Raya Selatan.
  • The canonical name Chukotko-Kamchatka (qfa-cka) is missing.
  • Chukotko-Kamchatkan, the canonical name for the code qfa-cka, is wrong; it should be Chukotko-Kamchatka.
  • Dene-Yeniseian, the canonical name for the code qfa-dny, is wrong; it should be Dene-Yenisei.
  • The canonical name Dene-Yenisei (qfa-dny) is missing.
  • Koreanic, the canonical name for the code qfa-kor, is wrong; it should be Korea.
  • The canonical name Korea (qfa-kor) is missing.
  • Left May, the canonical name for the code qfa-mal, is wrong; it should be May Kiri.
  • The canonical name May Kiri (qfa-mal) is missing.
  • The canonical name Serbi-Mongol (qfa-xgs) is missing.
  • Serbi-Mongolic, the canonical name for the code qfa-xgs, is wrong; it should be Serbi-Mongol.
  • Para-Mongolic, the canonical name for the code qfa-xgx, is wrong; it should be Para-Mongol.
  • The canonical name Para-Mongol (qfa-xgx) is missing.
  • The canonical name Yenisei (qfa-yen) is missing.
  • Yeniseian, the canonical name for the code qfa-yen, is wrong; it should be Yenisei.
  • Quechuan, the canonical name for the code qwe, is wrong; it should be Quechua.
  • The canonical name Quechua (qwe) is missing.
  • The canonical name Italo-Dalmatia (roa-itd) is missing.
  • Italo-Dalmatian, the canonical name for the code roa-itd, is wrong; it should be Italo-Dalmatia.
  • The canonical name Huitoto-Ocaina (sai-hoc) is missing.

Module:families/code to canonical name

  • The code MIr. and the canonical name Middle Iranian should be removed; they are not found in Module:families/data.
  • The code OIr. and the canonical name Old Iranian should be removed; they are not found in Module:families/data.
  • Khasian, the canonical name for the code aav-khs, is wrong; it should be Khasia.
  • Nicobarese, the canonical name for the code aav-nic, is wrong; it should be Nicobar.
  • Eastern Algonquian, the canonical name for the code alg-eas, is wrong; it should be Algonquia Timur.
  • Atlantic-Congo, the canonical name for the code alv, is wrong; it should be Atlantik-Congo.
  • Bambukic, the canonical name for the code alv-bam, is wrong; it should be Bambuk.
  • Central Tano, the canonical name for the code alv-ctn, is wrong; it should be Tano Tengah.
  • Delta Edoid, the canonical name for the code alv-dlt, is wrong; it should be Edo Delta.
  • Eastern Gbaya, the canonical name for the code alv-gbf, is wrong; it should be Gbaya Timur.
  • Southern Gbaya, the canonical name for the code alv-gbs, is wrong; it should be Gbaya Selatan.
  • Western Gbaya, the canonical name for the code alv-gbw, is wrong; it should be Gbaya Barat.
  • Ghana-Togo Mountain, the canonical name for the code alv-gtm, is wrong; it should be Gunung Ghana-Togo.
  • North-Central Edoid, the canonical name for the code alv-nce, is wrong; it should be Edo Utara Tengah.
  • Northwestern Edoid, the canonical name for the code alv-nwd, is wrong; it should be Edo Barat Laut.
  • Senegambian, the canonical name for the code alv-sng, is wrong; it should be Senegambia.
  • Southwestern Edoid, the canonical name for the code alv-swd, is wrong; it should be Edo Barat Laut.
  • Yoruboid, the canonical name for the code alv-yrd, is wrong; it should be Yorubo.
  • Apachean, the canonical name for the code apa, is wrong; it should be Apache.
  • Alacalufan, the canonical name for the code aqa, is wrong; it should be Alacalufa.
  • Algic, the canonical name for the code aql, is wrong; it should be Algik.
  • North Athabaskan, the canonical name for the code ath-nor, is wrong; it should be Athabaska Utara.
  • Pacific Coast Athabaskan, the canonical name for the code ath-pco, is wrong; it should be Athabaska Pantai Pasifik.
  • Central New South Wales, the canonical name for the code aus-cww, is wrong; it should be New South Wales Tengah.
  • Southwest Pama-Nyungan, the canonical name for the code aus-psw, is wrong; it should be Pama-Nyungan Barat Laut.
  • Worrorran, the canonical name for the code aus-wor, is wrong; it should be Worrorra.
  • Arawakan, the canonical name for the code awd, is wrong; it should be Arawak.
  • Ta-Arawakan, the canonical name for the code awd-taa, is wrong; it should be Ta-Arawak.
  • Uto-Aztecan, the canonical name for the code azc, is wrong; it should be Uto-Aztec.
  • Central Banda, the canonical name for the code bad-cnt, is wrong; it should be Banda Tengah.
  • Berber, the canonical name for the code ber, is wrong; it should be Barbar.
  • Northeast Bantu, the canonical name for the code bnt-bne, is wrong; it should be Bantu Timur Laut.
  • Great Lakes Bantu, the canonical name for the code bnt-glb, is wrong; it should be Bantu Tasik Besar.
  • Southwest Bantu, the canonical name for the code bnt-swb, is wrong; it should be Bantu Barat Laut.
  • Andian, the canonical name for the code cau-and, is wrong; it should be Andia.
  • Avaro-Andian, the canonical name for the code cau-ava, is wrong; it should be Avaro-Andia.
  • Eastern Samur, the canonical name for the code cau-esm, is wrong; it should be Samur Timur.
  • East Tsezian, the canonical name for the code cau-ets, is wrong; it should be Tsez Timur.
  • Lezghian, the canonical name for the code cau-lzg, is wrong; it should be Lezghi.
  • Northeast Caucasian, the canonical name for the code cau-nec, is wrong; it should be Kaukasus Timur Laut.
  • Northwest Caucasian, the canonical name for the code cau-nwc, is wrong; it should be Kaukasus Barat Laut.
  • Southern Samur, the canonical name for the code cau-ssm, is wrong; it should be Samur Selatan.
  • Tsezian, the canonical name for the code cau-tsz, is wrong; it should be Tsez.
  • Western Samur, the canonical name for the code cau-wsm, is wrong; it should be Samur Barat.
  • West Tsezian, the canonical name for the code cau-wts, is wrong; it should be Tsez Barat.
  • North Caucasian, the canonical name for the code ccn, is wrong; it should be Kaukasus Utara.
  • Kartvelian, the canonical name for the code ccs, is wrong; it should be Kartvelia.
  • Central Sudanic, the canonical name for the code csu, is wrong; it should be Sudan Tengah.
  • Cu⬛⬛ic, the canonical name for the code cus, is wrong; it should be Cushitic.
  • Central Cu⬛⬛ic, the canonical name for the code cus-cen, is wrong; it should be Central Cushitic.
  • East Cu⬛⬛ic, the canonical name for the code cus-eas, is wrong; it should be East Cushitic.
  • Highland East Cu⬛⬛ic, the canonical name for the code cus-hec, is wrong; it should be Highland East Cushitic.
  • South Cu⬛⬛ic, the canonical name for the code cus-sou, is wrong; it should be South Cushitic.
  • Land Dayak, the canonical name for the code day, is wrong; it should be Dayak Darat.
  • East Manding, the canonical name for the code dmn-emn, is wrong; it should be Manding Timur.
  • Central Mande, the canonical name for the code dmn-mdc, is wrong; it should be Mande Tengah.
  • Eastern Mande, the canonical name for the code dmn-mde, is wrong; it should be Mande Timur.
  • Germanic, the canonical name for the code gem, is wrong; it should be Jermanik.
  • The code ira-mid and the canonical name Middle Iranian should be removed; they are not found in Module:families/data.
  • The code ira-old and the canonical name Old Iranian should be removed; they are not found in Module:families/data.
  • Kru Timur, the canonical name for the code kro-ekr, is wrong; it should be Eastern Kru.
  • Kru Barat, the canonical name for the code kro-wkr, is wrong; it should be Western Kru.
  • Katuic, the canonical name for the code mkh-kat, is wrong; it should be Katu.
  • Vietic, the canonical name for the code mkh-vie, is wrong; it should be Viet.
  • Mayan, the canonical name for the code myn, is wrong; it should be Maya.
  • Papua Barat, the canonical name for the code paa-wpa, is wrong; it should be West Papuan.
  • Kalamia, the canonical name for the code phi-kal, is wrong; it should be Kalamian.
  • Melayu-Polinesia Tengah-Timur, the canonical name for the code poz-cet, is wrong; it should be Melayu Polinesia Tengah-Timur.
  • Melayu-Sumbawan, the canonical name for the code poz-msa, is wrong; it should be Melayu-Sumbawa.
  • Oceania Tengah-Timur, the canonical name for the code poz-occ, is wrong; it should be Oceania Tengah Timur.
  • Oceania Barat, the canonical name for the code poz-ocw, is wrong; it should be Oceania Timur.
  • Polinesian Timur, the canonical name for the code poz-pep, is wrong; it should be Polinesia Timur.
  • Polinesian Nuklear, the canonical name for the code poz-pnp, is wrong; it should be Polinesia Nuklear.
  • Polinesian, the canonical name for the code poz-pol, is wrong; it should be Polinesia.
  • Vanuatu Utara-Tengah, the canonical name for the code poz-vnc, is wrong; it should be Vanuatu Utara Tengah.
  • Central Great Andamanese, the canonical name for the code qfa-adc, is wrong; it should be Andaman Raya Tengah.
  • Great Andamanese, the canonical name for the code qfa-adm, is wrong; it should be Andaman Raya.
  • Northern Great Andamanese, the canonical name for the code qfa-adn, is wrong; it should be Andaman Raya Utara.
  • Southern Great Andamanese, the canonical name for the code qfa-ads, is wrong; it should be Andaman Raya Selatan.
  • Chukotko-Kamchatkan, the canonical name for the code qfa-cka, is wrong; it should be Chukotko-Kamchatka.
  • Dene-Yeniseian, the canonical name for the code qfa-dny, is wrong; it should be Dene-Yenisei.
  • Koreanic, the canonical name for the code qfa-kor, is wrong; it should be Korea.
  • Left May, the canonical name for the code qfa-mal, is wrong; it should be May Kiri.
  • Serbi-Mongolic, the canonical name for the code qfa-xgs, is wrong; it should be Serbi-Mongol.
  • Para-Mongolic, the canonical name for the code qfa-xgx, is wrong; it should be Para-Mongol.
  • Yeniseian, the canonical name for the code qfa-yen, is wrong; it should be Yenisei.
  • Quechuan, the canonical name for the code qwe, is wrong; it should be Quechua.
  • Italo-Dalmatian, the canonical name for the code roa-itd, is wrong; it should be Italo-Dalmatia.

Module:families/data

  • Edo Barat Laut family (alv-nwd) has a canonical name that is not unique; it is also used by the code alv-swd.
  • Arawak, the canonical name for awd, is repeated in the table of aliases.
  • Ta-Arawak, the canonical name for awd-taa, is repeated in the table of aliases.
  • Huitoto-Ocaina family (sai-hoc) has no child families or languages.

Module:languages/canonical names

  • Proto-Atlantik-Congo, the canonical name for the code alv-pro, is wrong; it should be Proto-Atlantic-Congo.
  • The canonical name Proto-Atlantic-Congo (alv-pro) is missing.
  • The canonical name Proto-Apachean (apa-pro) is missing.
  • Proto-Apache, the canonical name for the code apa-pro, is wrong; it should be Proto-Apachean.
  • Proto-Athabaska, the canonical name for the code ath-pro, is wrong; it should be Proto-Athabaskan.
  • The canonical name Proto-Athabaskan (ath-pro) is missing.
  • Balinese, the canonical name for the code ban, is wrong; it should be Bali.
  • The canonical name Bai Tengah (bca) is missing.
  • Bai tengah, the canonical name for the code bca, is wrong; it should be Bai Tengah.
  • Banjarese, the canonical name for the code bjn, is wrong; it should be Banjar.
  • The canonical name Banjar (bjn) is missing.
  • The canonical name Vaie (bny) is missing.
  • Bintulu, the canonical name for the code bny, is wrong; it should be Vaie.
  • The canonical name Tibet (bo) is missing.
  • Tibetan, the canonical name for the code bo, is wrong; it should be Tibet.
  • Banda Malay, the canonical name for the code bpq, is wrong; it should be Melayu Banda.
  • The canonical name Melayu Banda (bpq) is missing.
  • The canonical name Isyarat Bengkala (bqy) is missing.
  • Bengkala Sign Language, the canonical name for the code bqy, is wrong; it should be Isyarat Bengkala.
  • The canonical name Belanda Kreol Berbice (brc) is missing.
  • Berbice Creole Dutch, the canonical name for the code brc, is wrong; it should be Belanda Kreol Berbice.
  • Western Bru, the canonical name for the code brv, is wrong; it should be Bru Barat.
  • The canonical name Bru Barat (brv) is missing.
  • Brunei Bisaya, the canonical name for the code bsb, is wrong; it should be Bisaya Brunei.
  • The canonical name Bisaya Brunei (bsb) is missing.
  • Sabah Bisaya, the canonical name for the code bsy, is wrong; it should be Bisaya Sabah.
  • The canonical name Bisaya Sabah (bsy) is missing.
  • The canonical name Bidayuh Biatah (bth) is missing.
  • Biatah Bidayuh, the canonical name for the code bth, is wrong; it should be Bidayuh Biatah.
  • The canonical name Melayu Bacan (btj) is missing.
  • Bacanese Malay, the canonical name for the code btj, is wrong; it should be Melayu Bacan.
  • The canonical name Batak Mandailing (btm) is missing.
  • Mandailing Batak, the canonical name for the code btm, is wrong; it should be Batak Mandailing.
  • The canonical name Batak Simalungun (bts) is missing.
  • Simalungun Batak, the canonical name for the code bts, is wrong; it should be Batak Simalungun.
  • The canonical name Batak Karo (btx) is missing.
  • Karo Batak, the canonical name for the code btx, is wrong; it should be Batak Karo.
  • The canonical name Batak Alas-Kluet (btz) is missing.
  • Alas-Kluet Batak, the canonical name for the code btz, is wrong; it should be Batak Alas-Kluet.
  • Buginese, the canonical name for the code bug, is wrong; it should be Bugis.
  • The canonical name Bugis (bug) is missing.
  • The canonical name Melayu Berau (bve) is missing.
  • Berau Malay, the canonical name for the code bve, is wrong; it should be Melayu Berau.
  • Bolivian Sign Language, the canonical name for the code bvl, is wrong; it should be Isyarat Bolivia.
  • The canonical name Isyarat Bolivia (bvl) is missing.
  • The canonical name Melayu Bukit (bvu) is missing.
  • Bukit Malay, the canonical name for the code bvu, is wrong; it should be Melayu Bukit.
  • Southern Bobo, the canonical name for the code bwq, is wrong; it should be Bobo Selatan.
  • The canonical name Bobo Selatan (bwq) is missing.
  • Palawan Batak, the canonical name for the code bya, is wrong; it should be Batak Palawan.
  • The canonical name Batak Palawan (bya) is missing.
  • Belizean Creole, the canonical name for the code bzj, is wrong; it should be Kreol Belize.
  • The canonical name Kreol Belize (bzj) is missing.
  • The canonical name Kreol Nicaragua (bzk) is missing.
  • Nicaraguan Creole, the canonical name for the code bzk, is wrong; it should be Kreol Nicaragua.
  • Brazilian Sign Language, the canonical name for the code bzs, is wrong; it should be Isyarat Brazil.
  • The canonical name Isyarat Brazil (bzs) is missing.
  • Proto-Brython, the canonical name for the code cel-bry-pro, is wrong; it should be Proto-Brythonic.
  • The canonical name Proto-Brythonic (cel-bry-pro) is missing.
  • Western Cham, the canonical name for the code cja, is wrong; it should be Cam Barat.
  • The canonical name Cam Barat (cja) is missing.
  • The canonical name Cam Timur (cjm) is missing.
  • Eastern Cham, the canonical name for the code cjm, is wrong; it should be Cam Timur.
  • The canonical name Corsica (co) is missing.
  • Corsican, the canonical name for the code co, is wrong; it should be Corsica.
  • Old Church Slavonic, the canonical name for the code cu, is wrong; it should be Slavon Gereja Lama.
  • The canonical name Slavon Gereja Lama (cu) is missing.
  • The canonical name Denmark (da) is missing.
  • Danish, the canonical name for the code da, is wrong; it should be Denmark.
  • Ida'an, the canonical name for the code dbj, is wrong; it should be Idahan.
  • The canonical name Idahan (dbj) is missing.
  • The canonical name Jerman (de) is missing.
  • German, the canonical name for the code de, is wrong; it should be Jerman.
  • The canonical name Dagaare Selatan (dga) is missing.
  • Southern Dagaare, the canonical name for the code dga, is wrong; it should be Dagaare Selatan.
  • The canonical name Dagara Utara (dgi) is missing.
  • Northern Dagara, the canonical name for the code dgi, is wrong; it should be Dagara Utara.
  • South Central Dinka, the canonical name for the code dib, is wrong; it should be Dinka Tengah Selatan.
  • The canonical name Dinka Tengah Selatan (dib) is missing.
  • Southwestern Dinka, the canonical name for the code dik, is wrong; it should be Dinka Barat Daya.
  • The canonical name Dinka Barat Daya (dik) is missing.
  • The canonical name Dinka Timur Laut (dip) is missing.
  • Northeastern Dinka, the canonical name for the code dip, is wrong; it should be Dinka Timur Laut.
  • Northwestern Dinka, the canonical name for the code diw, is wrong; it should be Dinka Barat Laut.
  • The canonical name Dinka Barat Laut (diw) is missing.
  • The canonical name Dinka Tenggara (dks) is missing.
  • Southeastern Dinka, the canonical name for the code dks, is wrong; it should be Dinka Tenggara.
  • The canonical name Sungai (dmg) is missing.
  • Upper Kinabatangan, the canonical name for the code dmg, is wrong; it should be Sungai.
  • The canonical name Damar Timur (dmr) is missing.
  • East Damar, the canonical name for the code dmr, is wrong; it should be Damar Timur.
  • Western Dani, the canonical name for the code dnw, is wrong; it should be Dani Barat.
  • The canonical name Dani Barat (dnw) is missing.
  • Northern Kam, the canonical name for the code doc, is wrong; it should be Kam Utara.
  • The canonical name Kam Utara (doc) is missing.
  • West Damar, the canonical name for the code drn, is wrong; it should be Damar Barat.
  • The canonical name Damar Barat (drn) is missing.
  • Daro-Matu Melanau, the canonical name for the code dro, is wrong; it should be Melanau Daro-Matu.
  • The canonical name Melanau Daro-Matu (dro) is missing.
  • Central Dusun, the canonical name for the code dtp, is wrong; it should be Kadazandusun.
  • The canonical name Kadazandusun (dtp) is missing.
  • Alabat Island Agta, the canonical name for the code dul, is wrong; it should be Agta Pulau Alabat.
  • The canonical name Agta Pulau Alabat (dul) is missing.
  • Middle Dutch, the canonical name for the code dum, is wrong; it should be Belanda Pertengahan.
  • The canonical name Belanda Pertengahan (dum) is missing.
  • Dupaningan Agta, the canonical name for the code duo, is wrong; it should be Agta Dupaningan.
  • The canonical name Agta Dupaningan (duo) is missing.
  • Dicamay Agta, the canonical name for the code duy, is wrong; it should be Agta Dicamay.
  • The canonical name Agta Dicamay (duy) is missing.
  • The canonical name Yunani (el) is missing.
  • Greek, the canonical name for the code el, is wrong; it should be Yunani.
  • The code elu-prk and the canonical name Helu should be removed; they are not found in a submodule of Module:languages.
  • Spanish, the canonical name for the code es, is wrong; it should be Sepanyol.
  • The canonical name Sepanyol (es) is missing.
  • The canonical name Estonia (et) is missing.
  • Estonian, the canonical name for the code et, is wrong; it should be Estonia.
  • The canonical name Parsi (fa) is missing.
  • Persian, the canonical name for the code fa, is wrong; it should be Parsi.
  • Finnish, the canonical name for the code fi, is wrong; it should be Finland.
  • The canonical name Finland (fi) is missing.
  • The canonical name Fiji (fj) is missing.
  • Fijian, the canonical name for the code fj, is wrong; it should be Fiji.
  • Faroese, the canonical name for the code fo, is wrong; it should be Faroe.
  • The canonical name Faroe (fo) is missing.
  • French, the canonical name for the code fr, is wrong; it should be Perancis.
  • The canonical name Perancis (fr) is missing.
  • The canonical name Frisia Barat (fy) is missing.
  • West Frisian, the canonical name for the code fy, is wrong; it should be Frisia Barat.
  • The canonical name Ireland (ga) is missing.
  • Irish, the canonical name for the code ga, is wrong; it should be Ireland.
  • Scottish Gaelic, the canonical name for the code gd, is wrong; it should be Gael Scotland.
  • The canonical name Gael Scotland (gd) is missing.
  • The canonical name Jermanik Purba (gem-pro) is missing.
  • Proto-Germanic, the canonical name for the code gem-pro, is wrong; it should be Jermanik Purba.
  • Galician, the canonical name for the code gl, is wrong; it should be Galicia.
  • The canonical name Galicia (gl) is missing.
  • The canonical name Norway Pertengahan (gmq-mno) is missing.
  • Middle Norwegian, the canonical name for the code gmq-mno, is wrong; it should be Norway Pertengahan.
  • The canonical name Denmark Kuno (gmq-oda) is missing.
  • Old Danish, the canonical name for the code gmq-oda, is wrong; it should be Denmark Kuno.
  • The canonical name Sweden Kuno (gmq-osw) is missing.
  • Old Swedish, the canonical name for the code gmq-osw, is wrong; it should be Sweden Kuno.
  • The canonical name Norse Purba (gmq-pro) is missing.
  • Proto-Norse, the canonical name for the code gmq-pro, is wrong; it should be Norse Purba.
  • The canonical name Jerman Pusat Timur (gmw-ecg) is missing.
  • East Central German, the canonical name for the code gmw-ecg, is wrong; it should be Jerman Pusat Timur.
  • Proto-West Germanic, the canonical name for the code gmw-pro, is wrong; it should be Jermanik Barat Purba.
  • The canonical name Jermanik Barat Purba (gmw-pro) is missing.
  • The canonical name Gujarat (gu) is missing.
  • Gujarati, the canonical name for the code gu, is wrong; it should be Gujarat.
  • Hawaiian, the canonical name for the code haw, is wrong; it should be Hawaii.
  • The canonical name Hawaii (haw) is missing.
  • The canonical name Haida Selatan (hax) is missing.
  • Southern Haida, the canonical name for the code hax, is wrong; it should be Haida Selatan.
  • The canonical name Ibrani (he) is missing.
  • Hebrew, the canonical name for the code he, is wrong; it should be Ibrani.
  • The canonical name Kreol Haiti (ht) is missing.
  • Haitian Creole, the canonical name for the code ht, is wrong; it should be Kreol Haiti.
  • The canonical name Hungary (hu) is missing.
  • Hungarian, the canonical name for the code hu, is wrong; it should be Hungary.
  • Armenian, the canonical name for the code hy, is wrong; it should be Armenia.
  • The canonical name Armenia (hy) is missing.
  • Proto-Armenia, the canonical name for the code hyx-pro, is wrong; it should be Proto-Armenian.
  • The canonical name Proto-Armenian (hyx-pro) is missing.
  • Indonesian, the canonical name for the code id, is wrong; it should be Indonesia.
  • The canonical name Indonesia (id) is missing.
  • Sichuan Yi, the canonical name for the code ii, is wrong; it should be Yi Sichuan.
  • The canonical name Yi Sichuan (ii) is missing.
  • The canonical name Indo-Iran Purba (iir-pro) is missing.
  • Proto-Indo-Iranian, the canonical name for the code iir-pro, is wrong; it should be Indo-Iran Purba.
  • The code inc-kha and the canonical name Khasa Prakrit should be removed; they are not found in a submodule of Module:languages.
  • The code inc-mgd and the canonical name Magadhi Prakrit should be removed; they are not found in a submodule of Module:languages.
  • Proto-Indo-Aryan, the canonical name for the code inc-pro, is wrong; it should be Indo-Arya Purba.
  • The canonical name Indo-Arya Purba (inc-pro) is missing.
  • The code inc-psc and the canonical name Paisaci Prakrit should be removed; they are not found in a submodule of Module:languages.
  • The canonical name Indo-Eropah Purba (ine-pro) is missing.
  • Proto-Indo-European, the canonical name for the code ine-pro, is wrong; it should be Indo-Eropah Purba.
  • Icelandic, the canonical name for the code is, is wrong; it should be Iceland.
  • The canonical name Iceland (is) is missing.
  • The canonical name Itali (it) is missing.
  • Italian, the canonical name for the code it, is wrong; it should be Itali.
  • Japanese, the canonical name for the code ja, is wrong; it should be Jepun.
  • The canonical name Jepun (ja) is missing.
  • The canonical name Kreol Jamaika (jam) is missing.
  • Jamaican Creole, the canonical name for the code jam, is wrong; it should be Kreol Jamaika.
  • Java New Caledonia, the canonical name for the code jas, is wrong; it should be New Caledonian Javanese.
  • The canonical name New Caledonian Javanese (jas) is missing.
  • Jawa Caribbean, the canonical name for the code jvn, is wrong; it should be Caribbean Javanese.
  • The canonical name Caribbean Javanese (jvn) is missing.
  • The canonical name Georgia (ka) is missing.
  • Georgian, the canonical name for the code ka, is wrong; it should be Georgia.
  • The canonical name Old Javanese (kaw) is missing.
  • Jawa Kuno, the canonical name for the code kaw, is wrong; it should be Old Javanese.
  • The canonical name Tukang Besi North (khc) is missing.
  • Tukang Besi Utara, the canonical name for the code khc, is wrong; it should be Tukang Besi North.
  • The canonical name Greenland (kl) is missing.
  • Greenlandic, the canonical name for the code kl, is wrong; it should be Greenland.
  • Korean, the canonical name for the code ko, is wrong; it should be Korea.
  • The canonical name Korea (ko) is missing.
  • The canonical name Kashmir (ks) is missing.
  • Kashmiri, the canonical name for the code ks, is wrong; it should be Kashmir.
  • The canonical name Melayu Brunei (kxd) is missing.
  • Brunei Malay, the canonical name for the code kxd, is wrong; it should be Melayu Brunei.
  • The canonical name Kayan Baram (kys) is missing.
  • Baram Kayan, the canonical name for the code kys, is wrong; it should be Kayan Baram.
  • The canonical name Kayah Barat (kyu) is missing.
  • Western Kayah, the canonical name for the code kyu, is wrong; it should be Kayah Barat.
  • Coastal Kadazan, the canonical name for the code kzj, is wrong; it should be Kadazan.
  • The canonical name Kadazan (kzj) is missing.
  • Luxembourgish, the canonical name for the code lb, is wrong; it should be Luxembourg.
  • The canonical name Luxembourg (lb) is missing.
  • Lithuanian, the canonical name for the code lt, is wrong; it should be Lithuania.
  • The canonical name Lithuania (lt) is missing.
  • Latvian, the canonical name for the code lv, is wrong; it should be Latvia.
  • The canonical name Latvia (lv) is missing.
  • Proto-Atayal, the canonical name for the code map-ata-pro, is wrong; it should be Proto-Atayalic.
  • The canonical name Proto-Atayalic (map-ata-pro) is missing.
  • North Moluccan Malay, the canonical name for the code max, is wrong; it should be Melayu Maluku Utara.
  • The canonical name Melayu Maluku Utara (max) is missing.
  • The canonical name Mazahua Tengah (maz) is missing.
  • Central Mazahua, the canonical name for the code maz, is wrong; it should be Mazahua Tengah.
  • The canonical name Manobo Bukidnon Barat (mbb) is missing.
  • Western Bukidnon Manobo, the canonical name for the code mbb, is wrong; it should be Manobo Bukidnon Barat.
  • The canonical name Melayu Baba (mbf) is missing.
  • Baba Malay, the canonical name for the code mbf, is wrong; it should be Melayu Baba.
  • The canonical name Watut Selatan (mcy) is missing.
  • South Watut, the canonical name for the code mcy, is wrong; it should be Watut Selatan.
  • Southwestern Tlaxiaco Mixtec, the canonical name for the code meh, is wrong; it should be Mixtec Tlaxiaco Barat Daya.
  • The canonical name Mixtec Tlaxiaco Barat Daya (meh) is missing.
  • Central Melanau, the canonical name for the code mel, is wrong; it should be Melanau Tengah.
  • The canonical name Melanau Tengah (mel) is missing.
  • Kedah Malay, the canonical name for the code meo, is wrong; it should be Melayu Kedah.
  • The canonical name Melayu Kedah (meo) is missing.
  • Pattani Malay, the canonical name for the code mfa, is wrong; it should be Melayu Pattani.
  • The canonical name Melayu Pattani (mfa) is missing.
  • The canonical name Mofu Utara (mfk) is missing.
  • North Mofu, the canonical name for the code mfk, is wrong; it should be Mofu Utara.
  • Marghi South, the canonical name for the code mfm, is wrong; it should be Marghi Selatan.
  • The canonical name Marghi Selatan (mfm) is missing.
  • The canonical name Melayu Makassar (mfp) is missing.
  • Makassar Malay, the canonical name for the code mfp, is wrong; it should be Melayu Makassar.
  • Eastern Magar, the canonical name for the code mgp, is wrong; it should be Magar Timur.
  • The canonical name Magar Timur (mgp) is missing.
  • The canonical name Pulau Marshall (mh) is missing.
  • Marshallese, the canonical name for the code mh, is wrong; it should be Pulau Marshall.
  • The canonical name Melayu Bali (mhp) is missing.
  • Balinese Malay, the canonical name for the code mhp, is wrong; it should be Melayu Bali.
  • Eastern Mari, the canonical name for the code mhr, is wrong; it should be Mari Timur.
  • The canonical name Mari Timur (mhr) is missing.
  • The canonical name Mixtec Puebla Selatan (mit) is missing.
  • Southern Puebla Mixtec, the canonical name for the code mit, is wrong; it should be Mixtec Puebla Selatan.
  • San Juan Colorado Mixtec, the canonical name for the code mjc, is wrong; it should be Mixtec Colorado San Juan.
  • The canonical name Mixtec Colorado San Juan (mjc) is missing.
  • Northwest Maidu, the canonical name for the code mjd, is wrong; it should be Maidu Barat Laut.
  • The canonical name Maidu Barat Laut (mjd) is missing.
  • The canonical name Macedonia (mk) is missing.
  • Macedonian, the canonical name for the code mk, is wrong; it should be Macedonia.
  • Proto-Asli, the canonical name for the code mkh-asl-pro, is wrong; it should be Proto-Aslian.
  • The canonical name Proto-Aslian (mkh-asl-pro) is missing.
  • Kupang Malay, the canonical name for the code mkn, is wrong; it should be Melayu Kupang.
  • The canonical name Melayu Kupang (mkn) is missing.
  • Western Maninkakan, the canonical name for the code mlq, is wrong; it should be Maninkakan Barat.
  • The canonical name Maninkakan Barat (mlq) is missing.
  • The canonical name Ambrym Utara (mmg) is missing.
  • North Ambrym, the canonical name for the code mmg, is wrong; it should be Ambrym Utara.
  • Western Xiangxi Miao, the canonical name for the code mmr, is wrong; it should be Miao Xiangxi Barat.
  • The canonical name Miao Xiangxi Barat (mmr) is missing.
  • The canonical name Mongolia (mn) is missing.
  • Mongolian, the canonical name for the code mn, is wrong; it should be Mongolia.
  • Eastern Mnong, the canonical name for the code mng, is wrong; it should be Mnong Timur.
  • The canonical name Mnong Timur (mng) is missing.
  • Southern Mnong, the canonical name for the code mnn, is wrong; it should be Mnong Selatan.
  • The canonical name Mnong Selatan (mnn) is missing.
  • Minriq, the canonical name for the code mnq, is wrong; it should be Mendriq.
  • The canonical name Mendriq (mnq) is missing.
  • The canonical name Melayu Kutai Kota Bangun (mqg) is missing.
  • Kota Bangun Kutai Malay, the canonical name for the code mqg, is wrong; it should be Melayu Kutai Kota Bangun.
  • The canonical name Marquesa Selatan (mqm) is missing.
  • South Marquesan, the canonical name for the code mqm, is wrong; it should be Marquesa Selatan.
  • Western Magar, the canonical name for the code mrd, is wrong; it should be Magar Barat.
  • The canonical name Magar Barat (mrd) is missing.
  • The canonical name Bahasa Isyarat Vineyard Martha (mre) is missing.
  • Martha's Vineyard Sign Language, the canonical name for the code mre, is wrong; it should be Bahasa Isyarat Vineyard Martha.
  • Western Mari, the canonical name for the code mrj, is wrong; it should be Mari Barat.
  • The canonical name Mari Barat (mrj) is missing.
  • North Marquesan, the canonical name for the code mrq, is wrong; it should be Marquesa Utara.
  • The canonical name Marquesa Utara (mrq) is missing.
  • Hill Maria, the canonical name for the code mrr, is wrong; it should be Maria Bukit.
  • The canonical name Maria Bukit (mrr) is missing.
  • The canonical name Melayu Sabah (msi) is missing.
  • Sabah Malay, the canonical name for the code msi, is wrong; it should be Melayu Sabah.
  • The canonical name Malta (mt) is missing.
  • Maltese, the canonical name for the code mt, is wrong; it should be Malta.
  • The canonical name Miao Xiangxi Timur (muq) is missing.
  • Eastern Xiangxi Miao, the canonical name for the code muq, is wrong; it should be Miao Xiangxi Timur.
  • Western Muria, the canonical name for the code mut, is wrong; it should be Muria Barat.
  • The canonical name Muria Barat (mut) is missing.
  • The canonical name Murut Tahol (mvv) is missing.
  • Tagal Murut, the canonical name for the code mvv, is wrong; it should be Murut Tahol.
  • The canonical name Maewo Tengah (mwo) is missing.
  • Central Maewo, the canonical name for the code mwo, is wrong; it should be Maewo Tengah.
  • Northwest Oaxaca Mixtec, the canonical name for the code mxa, is wrong; it should be Mixtec Oaxaca Barat Laut.
  • The canonical name Mixtec Oaxaca Barat Laut (mxa) is missing.
  • Southeastern Nochixtlán Mixtec, the canonical name for the code mxy, is wrong; it should be Mixtec Nochixtlán Tenggara.
  • The canonical name Mixtec Nochixtlán Tenggara (mxy) is missing.
  • Central Masela, the canonical name for the code mxz, is wrong; it should be Masela Tengah.
  • The canonical name Masela Tengah (mxz) is missing.
  • The canonical name Burma (my) is missing.
  • Burmese, the canonical name for the code my, is wrong; it should be Burma.
  • The canonical name Barbar Sahara Utara (mzb) is missing.
  • Northern Saharan Berber, the canonical name for the code mzb, is wrong; it should be Barbar Sahara Utara.
  • Madagascar Sign Language, the canonical name for the code mzc, is wrong; it should be Bahasa Isyarat Madagascar.
  • The canonical name Bahasa Isyarat Madagascar (mzc) is missing.
  • Mozambican Sign Language, the canonical name for the code mzy, is wrong; it should be Bahasa Isyarat Mozambique.
  • The canonical name Bahasa Isyarat Mozambique (mzy) is missing.
  • The canonical name Nauru (na) is missing.
  • Nauruan, the canonical name for the code na, is wrong; it should be Nauru.
  • The canonical name Hokkien (nan) is missing.
  • Min Nan, the canonical name for the code nan, is wrong; it should be Hokkien.
  • The canonical name Norway Bokmål (nb) is missing.
  • Norwegian Bokmål, the canonical name for the code nb, is wrong; it should be Norway Bokmål.
  • The canonical name Ndebele Utara (nd) is missing.
  • Northern Ndebele, the canonical name for the code nd, is wrong; it should be Ndebele Utara.
  • Nepali, the canonical name for the code ne, is wrong; it should be Nepal.
  • The canonical name Nepal (ne) is missing.
  • The canonical name Belanda (nl) is missing.
  • Dutch, the canonical name for the code nl, is wrong; it should be Belanda.
  • Norwegian Nynorsk, the canonical name for the code nn, is wrong; it should be Norway Nynorsk.
  • The canonical name Norway Nynorsk (nn) is missing.
  • Norwegian, the canonical name for the code no, is wrong; it should be Norway.
  • The canonical name Norway (no) is missing.
  • Southern Ndebele, the canonical name for the code nr, is wrong; it should be Ndebele Selatan.
  • The canonical name Ndebele Selatan (nr) is missing.
  • Old Chinese, the canonical name for the code och, is wrong; it should be Cina Kuno.
  • The canonical name Cina Kuno (och) is missing.
  • The canonical name Belanda Kuno (odt) is missing.
  • Old Dutch, the canonical name for the code odt, is wrong; it should be Belanda Kuno.
  • Old Frisian, the canonical name for the code ofs, is wrong; it should be Frisia Kuno.
  • The canonical name Frisia Kuno (ofs) is missing.
  • The canonical name Georgia Kuno (oge) is missing.
  • Old Georgian, the canonical name for the code oge, is wrong; it should be Georgia Kuno.
  • Old Hungarian, the canonical name for the code ohu, is wrong; it should be Hungary Kuno.
  • The canonical name Hungary Kuno (ohu) is missing.
  • The canonical name Jepun Kuno (ojp) is missing.
  • Old Japanese, the canonical name for the code ojp, is wrong; it should be Jepun Kuno.
  • The canonical name Jawa Ontong (ojv) is missing.
  • Ontong Java, the canonical name for the code ojv, is wrong; it should be Jawa Ontong.
  • The canonical name Ossetia (os) is missing.
  • Ossetian, the canonical name for the code os, is wrong; it should be Ossetia.
  • Proto-North Halmahera, the canonical name for the code paa-nha-pro, is wrong; it should be Halmahera Utara Purba.
  • The canonical name Halmahera Utara Purba (paa-nha-pro) is missing.
  • Proto-Kalamian, the canonical name for the code phi-kal-pro, is wrong; it should be Kalamian Purba.
  • The canonical name Kalamian Purba (phi-kal-pro) is missing.
  • The canonical name Filipina Purba (phi-pro) is missing.
  • Proto-Philippine, the canonical name for the code phi-pro, is wrong; it should be Filipina Purba.
  • The canonical name Poland (pl) is missing.
  • Polish, the canonical name for the code pl, is wrong; it should be Poland.
  • Proto-Bungku-Tolaki, the canonical name for the code poz-btk-pro, is wrong; it should be Bungku-Tolaki Purba.
  • The canonical name Bungku-Tolaki Purba (poz-btk-pro) is missing.
  • Proto-Central-Eastern Malayo-Polynesian, the canonical name for the code poz-cet-pro, is wrong; it should be Melayu-Polinesia Tengah Timur Purba.
  • The canonical name Melayu-Polinesia Tengah Timur Purba (poz-cet-pro) is missing.
  • The canonical name Halmahera Cenderawasih Purba (poz-hce-pro) is missing.
  • Proto-Halmahera-Cenderawasih, the canonical name for the code poz-hce-pro, is wrong; it should be Halmahera Cenderawasih Purba.
  • Proto-Lampungic, the canonical name for the code poz-lgx-pro, is wrong; it should be Lampung Purba.
  • The canonical name Lampung Purba (poz-lgx-pro) is missing.
  • Melayu Purba, the canonical name for the code poz-mly-pro, is wrong; it should be Melayik Purba.
  • The canonical name Melayik Purba (poz-mly-pro) is missing.
  • The canonical name Oceania Purba (poz-oce-pro) is missing.
  • Proto-Oceanic, the canonical name for the code poz-oce-pro, is wrong; it should be Oceania Purba.
  • The canonical name Polinesia Timur Purba (poz-pep-pro) is missing.
  • Proto-Eastern Polynesian, the canonical name for the code poz-pep-pro, is wrong; it should be Polinesia Timur Purba.
  • Proto-Nuclear Polynesian, the canonical name for the code poz-pnp-pro, is wrong; it should be Polinesia Teras Purba.
  • The canonical name Polinesia Teras Purba (poz-pnp-pro) is missing.
  • The canonical name Polinesia Purba (poz-pol-pro) is missing.
  • Proto-Polynesian, the canonical name for the code poz-pol-pro, is wrong; it should be Polinesia Purba.
  • Sarawak Malay, the canonical name for the code poz-sml, is wrong; it should be Melayu Sarawak.
  • The canonical name Sulawesi Selatan Purba (poz-ssw-pro) is missing.
  • Proto-South Sulawesi, the canonical name for the code poz-ssw-pro, is wrong; it should be Sulawesi Selatan Purba.
  • The canonical name Sunda-Sulawesi Purba (poz-sus-pro) is missing.
  • Proto-Sunda-Sulawesi, the canonical name for the code poz-sus-pro, is wrong; it should be Sunda-Sulawesi Purba.
  • Proto-North Sarawak, the canonical name for the code poz-swa-pro, is wrong; it should be Sarawak Utara Purba.
  • The canonical name Sarawak Utara Purba (poz-swa-pro) is missing.
  • The canonical name Melayu Terengganu (poz-ter) is missing.
  • Terengganu Malay, the canonical name for the code poz-ter, is wrong; it should be Melayu Terengganu.
  • Proto-Eastern Malayo-Polynesian, the canonical name for the code pqe-pro, is wrong; it should be Melayu-Polinesia Timur Purba.
  • The canonical name Melayu-Polinesia Timur Purba (pqe-pro) is missing.
  • The canonical name Portugis (pt) is missing.
  • Portuguese, the canonical name for the code pt, is wrong; it should be Portugis.
  • The canonical name Andaman Raya Purba (qfa-adm-pro) is missing.
  • Proto-Great Andamanese, the canonical name for the code qfa-adm-pro, is wrong; it should be Andaman Raya Purba.
  • The canonical name Be-Tai Purba (qfa-bet-pro) is missing.
  • Proto-Be-Tai, the canonical name for the code qfa-bet-pro, is wrong; it should be Be-Tai Purba.
  • Proto-Kam-Sui, the canonical name for the code qfa-kms-pro, is wrong; it should be Kam-Sui Purba.
  • The canonical name Kam-Sui Purba (qfa-kms-pro) is missing.
  • Proto-Koreanic, the canonical name for the code qfa-kor-pro, is wrong; it should be Korea Purba.
  • The canonical name Korea Purba (qfa-kor-pro) is missing.
  • The canonical name Kra Purba (qfa-kra-pro) is missing.
  • Proto-Kra, the canonical name for the code qfa-kra-pro, is wrong; it should be Kra Purba.
  • The canonical name Hlai Purba (qfa-lic-pro) is missing.
  • Proto-Hlai, the canonical name for the code qfa-lic-pro, is wrong; it should be Hlai Purba.
  • Proto-Be, the canonical name for the code qfa-onb-pro, is wrong; it should be Be Purba.
  • The canonical name Be Purba (qfa-onb-pro) is missing.
  • Proto-Ongan, the canonical name for the code qfa-ong-pro, is wrong; it should be Ongan Purba.
  • The canonical name Ongan Purba (qfa-ong-pro) is missing.
  • Proto-Kra-Dai, the canonical name for the code qfa-tak-pro, is wrong; it should be Kra-Dai Purba.
  • The canonical name Kra-Dai Purba (qfa-tak-pro) is missing.
  • The canonical name Romania (ro) is missing.
  • Romanian, the canonical name for the code ro, is wrong; it should be Romania.
  • Russian, the canonical name for the code ru, is wrong; it should be Rusia.
  • The canonical name Rusia (ru) is missing.
  • Okinawan, the canonical name for the code ryu, is wrong; it should be Okinawa.
  • The canonical name Okinawa (ryu) is missing.
  • The code sai-hoc-pro and the canonical name Proto-Huitoto-Ocaina should be removed; they are not found in a submodule of Module:languages.
  • Sardinian, the canonical name for the code sc, is wrong; it should be Sardinia.
  • The canonical name Sardinia (sc) is missing.
  • The canonical name Sami Utara (se) is missing.
  • Northern Sami, the canonical name for the code se, is wrong; it should be Sami Utara.
  • The canonical name Serbo-Croatia (sh) is missing.
  • Serbo-Croatian, the canonical name for the code sh, is wrong; it should be Serbo-Croatia.
  • Sinhalese, the canonical name for the code si, is wrong; it should be Sinhala.
  • The canonical name Sinhala (si) is missing.
  • The canonical name Sino-Tibet Purba (sit-pro) is missing.
  • Proto-Sino-Tibetan, the canonical name for the code sit-pro, is wrong; it should be Sino-Tibet Purba.
  • Slovene, the canonical name for the code sl, is wrong; it should be Slovenia.
  • The canonical name Slovenia (sl) is missing.
  • Proto-Slavic, the canonical name for the code sla-pro, is wrong; it should be Slavik Purba.
  • The canonical name Slavik Purba (sla-pro) is missing.
  • The canonical name Samoa (sm) is missing.
  • Samoan, the canonical name for the code sm, is wrong; it should be Samoa.
  • Central Sama, the canonical name for the code sml, is wrong; it should be Bajau Laut.
  • The canonical name Bajau Laut (sml) is missing.
  • The canonical name Bidayuh Bau (sne) is missing.
  • Bau Bidayuh, the canonical name for the code sne, is wrong; it should be Bidayuh Bau.
  • The canonical name Albania Purba (sqj-pro) is missing.
  • Proto-Albanian, the canonical name for the code sqj-pro, is wrong; it should be Albania Purba.
  • The canonical name Bajau Pantai Timur (ssb) is missing.
  • Southern Sama, the canonical name for the code ssb, is wrong; it should be Bajau Pantai Timur.
  • Tanana Hilir, the canonical name for the code taa, is wrong; it should be Tanana Bawah.
  • The canonical name Tanana Bawah (taa) is missing.
  • The canonical name Tai Purba (tai-pro) is missing.
  • Proto-Tai, the canonical name for the code tai-pro, is wrong; it should be Tai Purba.
  • The canonical name Tai Barat Laut Purba (tai-swe-pro) is missing.
  • Proto-Southwestern Tai, the canonical name for the code tai-swe-pro, is wrong; it should be Tai Barat Laut Purba.
  • The canonical name Tanana Atas (tau) is missing.
  • Tanana Hulu, the canonical name for the code tau, is wrong; it should be Tanana Atas.
  • The canonical name Melayu Sarawak (zlm-sar) is missing.

Module:languages/code to canonical name

  • Apache Barat, the canonical name for the code apw, is wrong; it should be Western Apache.
  • Alta Utara, the canonical name for the code aqn, is wrong; it should be Northern Alta.
  • Arrernte Barat, the canonical name for the code are, is wrong; it should be Western Arrernte.
  • Arab Algeria, the canonical name for the code arq, is wrong; it should be Algerian Arabic.
  • Arab Maghribi, the canonical name for the code ary, is wrong; it should be Moroccan Arabic.
  • Arab Mesir, the canonical name for the code arz, is wrong; it should be Egyptian Arabic.
  • Bahaaa Isyarat Amerika Syarikat, the canonical name for the code ase, is wrong; it should be American Sign Language.
  • Bahasa Isyarat Algeria, the canonical name for the code asp, is wrong; it should be Algerian Sign Language.
  • Bahasa Isyarat Austria, the canonical name for the code asq, is wrong; it should be Austrian Sign Language.
  • Bahasa Isyarat Orang Asli Australia, the canonical name for the code asw, is wrong; it should be Australian Aboriginal Sign Language.
  • Altai Utara, the canonical name for the code atv, is wrong; it should be Northern Altai.
  • Arawa Purba, the canonical name for the code auf-pro, is wrong; it should be Proto-Arawa.
  • Kampa Purba, the canonical name for the code awd-kmp-pro, is wrong; it should be Proto-Kampa.
  • Nawiki Purba, the canonical name for the code awd-nwk-pro, is wrong; it should be Proto-Nawiki.
  • Armenia Pertengahan, the canonical name for the code axm, is wrong; it should be Middle Armenian.
  • Arab Libya, the canonical name for the code ayl, is wrong; it should be Libyan Arabic.
  • Arab Yaman, the canonical name for the code ayn, is wrong; it should be Yemeni Arabic.
  • Arab Mesopotamia Utara, the canonical name for the code ayp, is wrong; it should be North Mesopotamian Arabic.
  • Isyarat Bulgaria, the canonical name for the code bqn, is wrong; it should be Bulgarian Sign Language.
  • Ida'an, the canonical name for the code dbj, is wrong; it should be Idahan.
  • The code elu-prk and the canonical name Helu should be removed; they are not found in a submodule of Module:languages.
  • Bahasa Isyarat Estonia, the canonical name for the code eso, is wrong; it should be Estonian Sign Language.
  • Fijian, the canonical name for the code fj, is wrong; it should be Fiji.
  • Faroese, the canonical name for the code fo, is wrong; it should be Faroe.
  • French, the canonical name for the code fr, is wrong; it should be Perancis.
  • Bahasa Isyarat Finland, the canonical name for the code fse, is wrong; it should be Finnish Sign Language.
  • West Frisian, the canonical name for the code fy, is wrong; it should be Frisia Barat.
  • Irish, the canonical name for the code ga, is wrong; it should be Ireland.
  • Scottish Gaelic, the canonical name for the code gd, is wrong; it should be Gael Scotland.
  • Galician, the canonical name for the code gl, is wrong; it should be Galicia.
  • Old Sweden Kuno, the canonical name for the code gmq-osw, is wrong; it should be Sweden Kuno.
  • Gujarati, the canonical name for the code gu, is wrong; it should be Gujarat.
  • Hawaiian, the canonical name for the code haw, is wrong; it should be Hawaii.
  • Southern Haida, the canonical name for the code hax, is wrong; it should be Haida Selatan.
  • Hebrew, the canonical name for the code he, is wrong; it should be Ibrani.
  • Haitian Creole, the canonical name for the code ht, is wrong; it should be Kreol Haiti.
  • Hungarian, the canonical name for the code hu, is wrong; it should be Hungary.
  • Armenian, the canonical name for the code hy, is wrong; it should be Armenia.
  • Indonesian, the canonical name for the code id, is wrong; it should be Indonesia.
  • Sichuan Yi, the canonical name for the code ii, is wrong; it should be Yi Sichuan.
  • Proto-Indo-Iranian, the canonical name for the code iir-pro, is wrong; it should be Indo-Iran Purba.
  • The code inc-kha and the canonical name Khasa Prakrit should be removed; they are not found in a submodule of Module:languages.
  • The code inc-mgd and the canonical name Magadhi Prakrit should be removed; they are not found in a submodule of Module:languages.
  • Proto-Indo-Aryan, the canonical name for the code inc-pro, is wrong; it should be Indo-Arya Purba.
  • The code inc-psc and the canonical name Paisaci Prakrit should be removed; they are not found in a submodule of Module:languages.
  • Proto-Indo-European, the canonical name for the code ine-pro, is wrong; it should be Indo-Eropah Purba.
  • Icelandic, the canonical name for the code is, is wrong; it should be Iceland.
  • Italian, the canonical name for the code it, is wrong; it should be Itali.
  • Japanese, the canonical name for the code ja, is wrong; it should be Jepun.
  • Jamaican Creole, the canonical name for the code jam, is wrong; it should be Kreol Jamaika.
  • Jawa New Caledonia, the canonical name for the code jas, is wrong; it should be New Caledonian Javanese.
  • Jawa Caribbean, the canonical name for the code jvn, is wrong; it should be Caribbean Javanese.
  • Georgian, the canonical name for the code ka, is wrong; it should be Georgia.
  • Jawa Kuno, the canonical name for the code kaw, is wrong; it should be Old Javanese.
  • Greenlandic, the canonical name for the code kl, is wrong; it should be Greenland.
  • Korean, the canonical name for the code ko, is wrong; it should be Korea.
  • Kashmiri, the canonical name for the code ks, is wrong; it should be Kashmir.
  • Brunei Malay, the canonical name for the code kxd, is wrong; it should be Melayu Brunei.
  • Baram Kayan, the canonical name for the code kys, is wrong; it should be Kayan Baram.
  • Western Kayah, the canonical name for the code kyu, is wrong; it should be Kayah Barat.
  • Coastal Kadazan, the canonical name for the code kzj, is wrong; it should be Kadazan.
  • Luxembourgish, the canonical name for the code lb, is wrong; it should be Luxembourg.
  • Lithuanian, the canonical name for the code lt, is wrong; it should be Lithuania.
  • Latvian, the canonical name for the code lv, is wrong; it should be Latvia.
  • North Moluccan Malay, the canonical name for the code max, is wrong; it should be Melayu Maluku Utara.
  • Central Mazahua, the canonical name for the code maz, is wrong; it should be Mazahua Tengah.
  • Western Bukidnon Manobo, the canonical name for the code mbb, is wrong; it should be Manobo Bukidnon Barat.
  • Baba Malay, the canonical name for the code mbf, is wrong; it should be Melayu Baba.
  • South Watut, the canonical name for the code mcy, is wrong; it should be Watut Selatan.
  • Southwestern Tlaxiaco Mixtec, the canonical name for the code meh, is wrong; it should be Mixtec Tlaxiaco Barat Daya.
  • Central Melanau, the canonical name for the code mel, is wrong; it should be Melanau Tengah.
  • Kedah Malay, the canonical name for the code meo, is wrong; it should be Melayu Kedah.
  • Pattani Malay, the canonical name for the code mfa, is wrong; it should be Melayu Pattani.
  • North Mofu, the canonical name for the code mfk, is wrong; it should be Mofu Utara.
  • Marghi South, the canonical name for the code mfm, is wrong; it should be Marghi Selatan.
  • Makassar Malay, the canonical name for the code mfp, is wrong; it should be Melayu Makassar.
  • Eastern Magar, the canonical name for the code mgp, is wrong; it should be Magar Timur.
  • Marshallese, the canonical name for the code mh, is wrong; it should be Pulau Marshall.
  • Balinese Malay, the canonical name for the code mhp, is wrong; it should be Melayu Bali.
  • Eastern Mari, the canonical name for the code mhr, is wrong; it should be Mari Timur.
  • Southern Puebla Mixtec, the canonical name for the code mit, is wrong; it should be Mixtec Puebla Selatan.
  • San Juan Colorado Mixtec, the canonical name for the code mjc, is wrong; it should be Mixtec Colorado San Juan.
  • Northwest Maidu, the canonical name for the code mjd, is wrong; it should be Maidu Barat Laut.
  • Macedonian, the canonical name for the code mk, is wrong; it should be Macedonia.
  • Kupang Malay, the canonical name for the code mkn, is wrong; it should be Melayu Kupang.
  • Western Maninkakan, the canonical name for the code mlq, is wrong; it should be Maninkakan Barat.
  • North Ambrym, the canonical name for the code mmg, is wrong; it should be Ambrym Utara.
  • Western Xiangxi Miao, the canonical name for the code mmr, is wrong; it should be Miao Xiangxi Barat.
  • Mongolian, the canonical name for the code mn, is wrong; it should be Mongolia.
  • Eastern Mnong, the canonical name for the code mng, is wrong; it should be Mnong Timur.
  • Southern Mnong, the canonical name for the code mnn, is wrong; it should be Mnong Selatan.
  • Minriq, the canonical name for the code mnq, is wrong; it should be Mendriq.
  • Kota Bangun Kutai Malay, the canonical name for the code mqg, is wrong; it should be Melayu Kutai Kota Bangun.
  • South Marquesan, the canonical name for the code mqm, is wrong; it should be Marquesa Selatan.
  • Western Magar, the canonical name for the code mrd, is wrong; it should be Magar Barat.
  • Martha's Vineyard Sign Language, the canonical name for the code mre, is wrong; it should be Bahasa Isyarat Vineyard Martha.
  • Western Mari, the canonical name for the code mrj, is wrong; it should be Mari Barat.
  • North Marquesan, the canonical name for the code mrq, is wrong; it should be Marquesa Utara.
  • Hill Maria, the canonical name for the code mrr, is wrong; it should be Maria Bukit.
  • Sabah Malay, the canonical name for the code msi, is wrong; it should be Melayu Sabah.
  • Maltese, the canonical name for the code mt, is wrong; it should be Malta.
  • Eastern Xiangxi Miao, the canonical name for the code muq, is wrong; it should be Miao Xiangxi Timur.
  • Western Muria, the canonical name for the code mut, is wrong; it should be Muria Barat.
  • Tagal Murut, the canonical name for the code mvv, is wrong; it should be Murut Tahol.
  • Central Maewo, the canonical name for the code mwo, is wrong; it should be Maewo Tengah.
  • Northwest Oaxaca Mixtec, the canonical name for the code mxa, is wrong; it should be Mixtec Oaxaca Barat Laut.
  • Southeastern Nochixtlán Mixtec, the canonical name for the code mxy, is wrong; it should be Mixtec Nochixtlán Tenggara.
  • Central Masela, the canonical name for the code mxz, is wrong; it should be Masela Tengah.
  • Burmese, the canonical name for the code my, is wrong; it should be Burma.
  • Northern Saharan Berber, the canonical name for the code mzb, is wrong; it should be Barbar Sahara Utara.
  • Madagascar Sign Language, the canonical name for the code mzc, is wrong; it should be Bahasa Isyarat Madagascar.
  • Mozambican Sign Language, the canonical name for the code mzy, is wrong; it should be Bahasa Isyarat Mozambique.
  • Nauruan, the canonical name for the code na, is wrong; it should be Nauru.
  • Min Nan, the canonical name for the code nan, is wrong; it should be Hokkien.
  • Norwegian Bokmål, the canonical name for the code nb, is wrong; it should be Norway Bokmål.
  • Northern Ndebele, the canonical name for the code nd, is wrong; it should be Ndebele Utara.
  • Nepali, the canonical name for the code ne, is wrong; it should be Nepal.
  • Dutch, the canonical name for the code nl, is wrong; it should be Belanda.
  • Norwegian Nynorsk, the canonical name for the code nn, is wrong; it should be Norway Nynorsk.
  • Norwegian, the canonical name for the code no, is wrong; it should be Norway.
  • Southern Ndebele, the canonical name for the code nr, is wrong; it should be Ndebele Selatan.
  • Old Chinese, the canonical name for the code och, is wrong; it should be Cina Kuno.
  • Old Dutch, the canonical name for the code odt, is wrong; it should be Belanda Kuno.
  • Old Frisian, the canonical name for the code ofs, is wrong; it should be Frisia Kuno.
  • Old Georgian, the canonical name for the code oge, is wrong; it should be Georgia Kuno.
  • Old Hungarian, the canonical name for the code ohu, is wrong; it should be Hungary Kuno.
  • Old Japanese, the canonical name for the code ojp, is wrong; it should be Jepun Kuno.
  • Ossetian, the canonical name for the code os, is wrong; it should be Ossetia.
  • Sepanyol Kuno, the canonical name for the code osp, is wrong; it should be Old Spanish.
  • Proto-North Halmahera, the canonical name for the code paa-nha-pro, is wrong; it should be Halmahera Utara Purba.
  • Parsi Pertengahan, the canonical name for the code pal, is wrong; it should be Middle Persian.
  • Parsi Pertengahan, the canonical name for the code peo, is wrong; it should be Old Persian.
  • Proto-Kalamian, the canonical name for the code phi-kal-pro, is wrong; it should be Kalamian Purba.
  • Proto-Philippine, the canonical name for the code phi-pro, is wrong; it should be Filipina Purba.
  • Polish, the canonical name for the code pl, is wrong; it should be Poland.
  • Proto-Bungku-Tolaki, the canonical name for the code poz-btk-pro, is wrong; it should be Bungku-Tolaki Purba.
  • Proto-Central-Eastern Malayo-Polynesian, the canonical name for the code poz-cet-pro, is wrong; it should be Melayu-Polinesia Tengah Timur Purba.
  • Proto-Halmahera-Cenderawasih, the canonical name for the code poz-hce-pro, is wrong; it should be Halmahera Cenderawasih Purba.
  • Proto-Lampungic, the canonical name for the code poz-lgx-pro, is wrong; it should be Lampung Purba.
  • Melayu Purba, the canonical name for the code poz-mly-pro, is wrong; it should be Melayik Purba.
  • Proto-Oceanic, the canonical name for the code poz-oce-pro, is wrong; it should be Oceania Purba.
  • Proto-Eastern Polynesian, the canonical name for the code poz-pep-pro, is wrong; it should be Polinesia Timur Purba.
  • Proto-Nuclear Polynesian, the canonical name for the code poz-pnp-pro, is wrong; it should be Polinesia Teras Purba.
  • Proto-Polynesian, the canonical name for the code poz-pol-pro, is wrong; it should be Polinesia Purba.
  • Sarawak Malay, the canonical name for the code poz-sml, is wrong; it should be Melayu Sarawak.
  • Proto-South Sulawesi, the canonical name for the code poz-ssw-pro, is wrong; it should be Sulawesi Selatan Purba.
  • Proto-Sunda-Sulawesi, the canonical name for the code poz-sus-pro, is wrong; it should be Sunda-Sulawesi Purba.
  • Proto-North Sarawak, the canonical name for the code poz-swa-pro, is wrong; it should be Sarawak Utara Purba.
  • Terengganu Malay, the canonical name for the code poz-ter, is wrong; it should be Melayu Terengganu.
  • Proto-Eastern Malayo-Polynesian, the canonical name for the code pqe-pro, is wrong; it should be Melayu-Polinesia Timur Purba.
  • Bahasa Isyarat Parsi, the canonical name for the code psc, is wrong; it should be Persian Sign Language.
  • Portuguese, the canonical name for the code pt, is wrong; it should be Portugis.
  • Proto-Great Andamanese, the canonical name for the code qfa-adm-pro, is wrong; it should be Andaman Raya Purba.
  • Proto-Be-Tai, the canonical name for the code qfa-bet-pro, is wrong; it should be Be-Tai Purba.
  • Proto-Kam-Sui, the canonical name for the code qfa-kms-pro, is wrong; it should be Kam-Sui Purba.
  • Proto-Koreanic, the canonical name for the code qfa-kor-pro, is wrong; it should be Korea Purba.
  • Proto-Kra, the canonical name for the code qfa-kra-pro, is wrong; it should be Kra Purba.
  • Proto-Hlai, the canonical name for the code qfa-lic-pro, is wrong; it should be Hlai Purba.
  • Proto-Be, the canonical name for the code qfa-onb-pro, is wrong; it should be Be Purba.
  • Proto-Ongan, the canonical name for the code qfa-ong-pro, is wrong; it should be Ongan Purba.
  • Proto-Kra-Dai, the canonical name for the code qfa-tak-pro, is wrong; it should be Kra-Dai Purba.
  • Romanian, the canonical name for the code ro, is wrong; it should be Romania.
  • Russian, the canonical name for the code ru, is wrong; it should be Rusia.
  • Okinawan, the canonical name for the code ryu, is wrong; it should be Okinawa.
  • The code sai-hoc-pro and the canonical name Proto-Huitoto-Ocaina should be removed; they are not found in a submodule of Module:languages.
  • Sardinian, the canonical name for the code sc, is wrong; it should be Sardinia.
  • Northern Sami, the canonical name for the code se, is wrong; it should be Sami Utara.
  • Serbo-Croatian, the canonical name for the code sh, is wrong; it should be Serbo-Croatia.
  • Chadian Arab, the canonical name for the code shu, is wrong; it should be Chadian Arabic.
  • Sinhalese, the canonical name for the code si, is wrong; it should be Sinhala.
  • Proto-Sino-Tibetan, the canonical name for the code sit-pro, is wrong; it should be Sino-Tibet Purba.
  • Slovene, the canonical name for the code sl, is wrong; it should be Slovenia.
  • Proto-Slavic, the canonical name for the code sla-pro, is wrong; it should be Slavik Purba.
  • Samoan, the canonical name for the code sm, is wrong; it should be Samoa.
  • Central Sama, the canonical name for the code sml, is wrong; it should be Bajau Laut.
  • Bau Bidayuh, the canonical name for the code sne, is wrong; it should be Bidayuh Bau.
  • Albanian, the canonical name for the code sq, is wrong; it should be Albania.
  • Proto-Albanian, the canonical name for the code sqj-pro, is wrong; it should be Albania Purba.
  • Southern Sama, the canonical name for the code ssb, is wrong; it should be Bajau Pantai Timur.
  • Bahasa Isyarat Sepanyol, the canonical name for the code ssp, is wrong; it should be Spanish Sign Language.
  • Sundanese, the canonical name for the code su, is wrong; it should be Sunda.
  • Swedish, the canonical name for the code sv, is wrong; it should be Sweden.
  • Lower Tanana, the canonical name for the code taa, is wrong; it should be Tanana Bawah.
  • Proto-Tai, the canonical name for the code tai-pro, is wrong; it should be Tai Purba.
  • Proto-Southwestern Tai, the canonical name for the code tai-swe-pro, is wrong; it should be Tai Barat Laut Purba.
  • Eastern Tamang, the canonical name for the code taj, is wrong; it should be Tamang Timur.
  • Central Tarahumara, the canonical name for the code tar, is wrong; it should be Tarahumara Tengah.
  • Upper Tanana, the canonical name for the code tau, is wrong; it should be Tanana Atas.
  • North Tairora, the canonical name for the code tbg, is wrong; it should be Tairora Utara.
  • Southeastern Tarahumara, the canonical name for the code tcu, is wrong; it should be Tarahumara Tenggara.
  • Western Tamang, the canonical name for the code tdg, is wrong; it should be Tamang Barat.
  • Tempasuk Dusun, the canonical name for the code tdu, is wrong; it should be Dusun Tempasuk.
  • Central Tagbanwa, the canonical name for the code tgt, is wrong; it should be Tagbanwa Tengah.
  • Timugon Murut, the canonical name for the code tih, is wrong; it should be Murut Timugon.
  • Tongan, the canonical name for the code to, is wrong; it should be Tonga.
  • Turkish, the canonical name for the code tr, is wrong; it should be Turki.
  • Tausug, the canonical name for the code tsg, is wrong; it should be Suluk.
  • Tahitian, the canonical name for the code ty, is wrong; it should be Tahiti.
  • Ukrainian, the canonical name for the code uk, is wrong; it should be Ukraine.
  • Vietnamese, the canonical name for the code vi, is wrong; it should be Vietnam.
  • Cantonese, the canonical name for the code yue, is wrong; it should be Kantonis.
  • Chinese, the canonical name for the code zh, is wrong; it should be Cina.
  • The code zlm-sar (Melayu Sarawak) is missing.
  • Negeri Sembilan Malay, the canonical name for the code zmi, is wrong; it should be Melayu Negeri Sembilan.

Module:languages/data/2

  • Azeri, the canonical name for az, is repeated in the table of aliases.
  • Nauru, the canonical name for na, is repeated in the table of aliases.
  • Sinhala, the canonical name for si, is repeated in the table of aliases.

Module:languages/data/3/a/extra

Module:languages/data/3/b

  • bahasa Bali (bcp) has a canonical name that is not unique; it is also used by the code ban.
  • bahasa Bodo Parja (bdv) lists an invalid language code inc-mgd as ancestor.
  • bahasa Bhatri (bgw) lists an invalid language code inc-mgd as ancestor.
  • bahasa Bhunjia (bhu) lists an invalid language code inc-mgd as ancestor.
  • Banjar, the canonical name for bjn, is repeated in the table of aliases.
  • Dairi Batak, the canonical name for btd, is repeated in the table of aliases.

Module:languages/data/3/d

  • Idahan, the canonical name for dbj, is repeated in the table of aliases.
  • Kadazandusun, the canonical name for dtp, is repeated in the table of aliases.

Module:languages/data/3/e/extra

Module:languages/data/3/g/extra

Module:languages/data/3/h

  • bahasa Halbi (hlb) lists an invalid language code inc-mgd as ancestor.

Module:languages/data/3/h/extra

Module:languages/data/3/j/extra

Module:languages/data/3/k

  • bahasa Kamar (keq) lists an invalid language code inc-mgd as ancestor.
  • bahasa Kurmukar (kfv) lists an invalid language code inc-mgd as ancestor.
  • bahasa Kharia Thar (ksy) lists an invalid language code inc-mgd as ancestor.
  • bahasa Kayort (kyv) lists an invalid language code inc-mgd as ancestor.

Module:languages/data/3/m

  • Mendriq, the canonical name for mnq, is repeated in the table of aliases.

Module:languages/data/3/m/extra

Module:languages/data/3/n

  • bahasa Nahari (nhh) lists an invalid language code inc-mgd as ancestor.

Module:languages/data/3/r

Module:languages/data/3/s

  • bahasa Surjapuri (sjp) lists an invalid language code inc-mgd as ancestor.
  • bahasa Sonha (soi) lists an invalid language code inc-mgd as ancestor.

Module:languages/data/3/s/extra

Module:languages/data/3/t

Module:languages/data/3/t/extra

Module:languages/data/3/y/extra

Module:languages/data/3/z

  • bahasa Mirgan (zrg) lists an invalid language code inc-mgd as ancestor.

Module:languages/data/exceptional

Module:languages/data/exceptional/extra

Module:scripts/data

Checks performed[sunting]

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".

local export = {}

local m_language_data = require("Module:languages/data/all")
local m_language_codes = require("Module:languages/code to canonical name")
local m_language_canonical_names = require("Module:languages/canonical names")
local m_etym_language_data = require("Module:etymology languages/data")
local m_etym_language_codes = require("Module:etymology languages/code to canonical name")
local m_etym_language_canonical_names = require("Module:etymology languages/canonical names")
local m_family_data = require("Module:families/data")
local m_family_codes = require("Module:families/code to canonical name")
local m_family_canonical_names = require("Module:families/canonical names")
local m_script_data = require("Module:scripts/data")

local m_languages = require("Module:languages")
local m_links = require("Module:links")
local m_scripts = require("Module:scripts")
local m_script_utils = require("Module:script utilities")
local m_table = require("Module:table")
local Array = require("Module:array")

local messages

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

local all_codes = {}

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

local nonempty_families = {}
local allowed_empty_families = {tbq = true}
local nonempty_scripts = {}
	
local function link(name)
	if not name then
		return "???"
	elseif name:find("[Bb]ahasa") then
		return "[[:Kategori:" .. name .. "|" .. name .. "]]"
	else
		return "[[:Kategori:Bahasa " .. name .. "|bahasa " .. name .. "]]"
	end
end
	
local function link_script(name)
	if not name then
		return "???"
	elseif name:find("[Cc]ode$") or name:find("[Ss]emaphore$") then
		return "[[:Category:" .. name:gsub("^%l", string.upper) .. "|" .. name .. "]]"
	else
		return "[[:Category:" .. name .. " script|" .. name .. " script]]"
	end
end

local function invalid_keys_message(modname, code, data, invalid_keys, is_script)
	local plural = #invalid_keys ~= 1
	discrepancy(modname, "The data key%s %s for %s (<code>%s</code>) %s invalid.",
		plural and "s" or "",
		invalid_keys
			:map(
				function(key)
					return '<code>' .. key .. '</code>'
				end)
			:concat(", "),
		(is_script and link_script or link)(data[1]),
		code,
		plural and "are" or "is")
end

local function check_data_keys(valid_keys, is_script)
	valid_keys = Array(valid_keys):to_set()
	
	return function (modname, code, data)
		local invalid_keys
		for k in pairs(data) do
			if not valid_keys[k] then
				invalid_keys = invalid_keys or Array()
				invalid_keys:insert(k)
			end
		end
		if invalid_keys then
			invalid_keys_message(modname, code, data, invalid_keys, is_script)
		end
	end
end

-- Modification of isArray in [[Module:table]].
local function find_gap(t)
	local i = 0
	for _ in pairs(t) do
		i = i + 1
		if t[i] == nil then
			return i
		end
	end
end

local function check_true_or_nil(modname, code, data, field_name)
	if not (data[field_name] == nil or data[field_name] == true) then
		discrepancy(modname,
			"%s (<code>%s</code>) has an <code>%s</code> value that is not <code>nil</code> or <code>true</code>: %s",
			link(canonical_name), code, field_name,
			tostring(data.link_tr)
		)
	end
end

local function check_array(modname, code, data, array_name, subarray_name)
	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])
		if gap then
			discrepancy(modname, "The %s array in %sthe data table for %s (<code>%s</code>) has a gap at index %d.",
				array_name,
				subarray_name and "the " .. subarray_name .. " field in " or "",
				data[1],
				code, gap)
		else
			return true
		end
	else
		discrepancy(modname, "The %s field in %sthe data table for %s (<code>%s</code>) should be an array (table) but is %s.",
			array_name,
			subarray_name and "the " .. subarray_name .. " field in " or "",
			data[1],
			code,
			array_type == "nil" and "nil" or "a " .. array_type)
	end
end

local function check_wikidata_item(modname, code, data, key)
	local data_item = data[key]
	if data_item == nil then
		return
	elseif type(data_item) == "number" then
		if not require "Module:table".isPositiveInteger(data_item) then
			discrepancy(modname, "%g, the Wikidata item id for %s (<code>%s</code>), is not a positive integer or a string in the correct format.",
				data_item, data[1], code)
		end
	elseif type(data_item) == "string" then
		if not data_item:find "^Q%d+$" then
			discrepancy(modname, "%s, the Wikidata item id for %s (<code>%s</code>), is not a string in the correct format or a positive integer.",
				data_item, data[1], code)
		end
	end
end

local function check_other_names_or_aliases(modname, code, canonical_name, data, data_key, allow_nested)
	local array = data[data_key]
	if not array then
		return
	end
	check_array(modname, code, data, data_key)

	local names = {}
	local function check_other_name(other_name)
		if other_name == canonical_name then
			discrepancy(modname,
				"%s, the canonical name for <code>%s</code>, is repeated in the table of <code>%s</code>.",
				canonical_name, code, 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 (<code>%s</code>).",
				other_name, data_key, canonical_name, code)
		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 (<code>%s</code>), but isn't allowed.",
					data_key, canonical_name, code)
			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, code, canonical_name, data)
	if data.otherNames then
		check_other_names_or_aliases(modname, code, canonical_name, data, "otherNames")
	end
	if data.aliases then
		check_other_names_or_aliases(modname, code, canonical_name, data, "aliases")
	end
	if data.varieties then
		check_other_names_or_aliases(modname, code, canonical_name, data, "varieties", true)
	end
end

local get_codepoint = mw.ustring.codepoint
local function validate_pattern(pattern, modname, code, data, standardChars)
	if type(pattern) ~= "string" then
		discrepancy(modname, '"%s", the %spattern for %s (<code>%s</code>), is not a string.',
			pattern, standardChars and 'standard character ' or '', code, data[1])
	end
	local ranges
	for lower, higher in mw.ustring.gmatch(pattern, "(.)%-%%?(.)") do
		if get_codepoint(lower) >= get_codepoint(higher) then
			ranges = ranges or Array()
			table.insert(ranges, { lower, higher })
		end
	end
	if ranges and ranges[1] then
		local plural = #ranges ~= 1 and "s" or ""
		discrepancy(modname, '%s (<code>%s</code>) specifies an invalid pattern ' ..
			'for %scharacter detection: <code>"%s"</code>. The first codepoint%s ' ..
			'in the range%s %s %s must be less than the second.',
			link(data[1]), code, standardChars and 'standard ' or '', pattern, plural, plural,
			ranges
				:map(
					function(range)
						return range[1] .. "-" .. range[2] .. (" (U+%X, U+%X)")
							:format(get_codepoint(range[1]), get_codepoint(range[2]))
					end)
				:concat(", "),
			#ranges ~= 1 and "are" or "is")
	end
	if not pcall(mw.ustring.find, "", "[" .. pattern .. "]") then
		discrepancy(modname, '%s (<code>%s</code>) specifies an invalid pattern for ' ..
			(standardChars and 'standard' or '') .. ' character detection: <code>"%s"</code>',
			link(data.canonical_name), code, pattern)
	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_or_sortkey(modname, code, data, replacements_name)
	local canonical_name = data[1]
	
	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 (<code>%s</code>) must be a table.",
				replacements_name, canonical_name, code)
		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 (<code>%s</code>) are not both defined or both undefined.",
			replacements_name, canonical_name, code)
	elseif replacements.from then
		for _, key in ipairs { "from", "to" } do
			check_array(modname, code, 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 (<code>%s</code>) table must be a string.",
			replacements_name, canonical_name, code)
	end
	
	if replacements.remove_exceptions then
		if check_array(modname, code, 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 mw.ustring.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 (<code>%s</code>) is over U+%04X.",
							code_point_i, code_point, sequence_i, canonical_name, code, remove_exceptions_maximum_code_point)
					end
					
				end
			end
		end
	end
	
	if replacements.from and replacements.to
			and m_table.length(replacements.to) > m_table.length(replacements.from) then
		discrepancy(modname,
			"The <code>from</code> array in the <code>%s</code> table for %s (<code>%s</code>) must be shorter or the same length as the <code>to</code> array.",
			replacements_name, canonical_name, code)
	end
end

local function has_regular_language_child(parent_code)
	for code, data in pairs(m_language_data) do
		local ancestors = data.ancestors
		if ancestors then
			for _, ancestor in pairs(ancestors) do
				if ancestor == parent_code then
					return true
				end
			end
		end
	end
	return false
end

local function check_ancestors(modname, code, data, ancestors, is_etymology_language)
	if type(ancestors) == "string" then ancestors = mw.text.split(ancestors, "%s*,%s*") end
	
	local canonical_name = data[1]
	for _, ancestor_code in ipairs(ancestors) do
		if not (m_language_data[ancestor_code] or m_etym_language_data[ancestor_code]) then
			discrepancy(modname,
				"%s (<code>%s</code>) lists an invalid language code <code>%s</code> as ancestor.",
				link(canonical_name), code, ancestor_code)
		end
	end
end
	
local function check_code_to_name_and_name_to_code_maps(
		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)
		if not code_to_module_map[code] 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,
				"Language 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

-- Just trying to not have a module error when someone puts a script code
-- in the position of a language code.
local function show_family_code(code)
	if type(code) == "string" then
		return "<code>" .. code .. "</code>"
	else
		return require("Module:debug").highlight_dump(code)
	end
end

local function check_languages()
	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",
		"type", "ancestors",
		"wikimedia_codes", "wikipedia_article", "standardChars",
		"translit", "override_translit", "link_tr",
		"dotted_dotless_i"
	}
	
	local function check_language(modname, code, data, mainData, extraData)
		local canonical_name, lang_type = data[1], data.type
		
		check_language_data_keys(modname, code, data)
		
		if all_codes[code] then
			discrepancy(modname, "Code <code>%s</code> is not unique; it is also defined in [[Module:%s]].", code, all_codes[code])
		else
			if not m_language_codes[code] then
				discrepancy("languages/code to canonical name", "The code <code>%s</code> (%s) is missing.", code, canonical_name)
			end
			all_codes[code] = modname
		end
		
		if not canonical_name then
			discrepancy(modname, "Code <code>%s</code> has no canonical name specified.", code)
		elseif language_names[canonical_name] then
			discrepancy(modname,
				"%s (<code>%s</code>) has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
				link(canonical_name), code, language_names[canonical_name])
		else
			if not m_language_canonical_names[canonical_name] then
				discrepancy("languages/canonical names", "The canonical name %s (<code>%s</code>) is missing.", canonical_name, code)
			end
			language_names[canonical_name] = code
		end
		
		check_wikidata_item(modname, code, data, 2)

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

		if data.display then
			check_entry_name_or_sortkey(modname, code, 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 standardChars table for %s (<code>%s</code>) does not match any script for that language.",
							sccode, canonical_name, code)
					end
				end
			elseif data.standardChars and type(data.standardChars) ~= "string" then
				discrepancy(modname, "The standardChars field in the data table for %s (<code>%s</code>) must be a string or table.",
					canonical_name, code)
			end
		end
		
		check_true_or_nil(modname, code, data, "override_translit")
		check_true_or_nil(modname, code, data, "link_tr")
		
		if data.override_translit and not data.translit then
			discrepancy(modname,
				"%s (<code>%s</code>) has <code>override_translit</code> set, but no transliteration module",
				link(canonical_name), code)
		end
	end
	
	-- Check two-letter codes
	local modname = "languages/data/2"
	local data2 = mw.loadData("Module:" .. modname)
	local extra_modname = modname .. "/extra"
	local extradata2 = mw.loadData("Module:" .. extra_modname)
	
	for code, data in pairs(data2) do
		if not code:find("^[a-z][a-z]$") then
			discrepancy(modname, '%s (<code>%s</code>) does not have a two-letter code.', link(data[1]), code)
		end
		
		check_language(modname, code, data, data2[code], extradata2[code])
	end
	check_extraneous_extra_data(modname, data2, extra_modname, extradata2)
	
	-- Check three-letter codes
	for i = string.byte('a'), string.byte('z') do
		local letter = string.char(i)
		local modname = "languages/data/3/" .. letter
		local data3 = mw.loadData("Module:" .. modname)
		local extra_modname = modname .. "/extra"
		local extradata3 = mw.loadData("Module:" .. extra_modname)
		local code_pattern = "^" .. letter .. "[a-z][a-z]$"
		
		for code, data in pairs(data3) do
			if not code:find(code_pattern) then
				discrepancy(modname,
					'%s (<code>%s</code>) does not have a three-letter code starting with "<code>%s</code>".',
					link(data[1]), code, letter)
			end
			
			check_language(modname, code, data, data3[code], extradata3[code])
		end
		check_extraneous_extra_data(modname, data3, extra_modname, extradata3)
	end
	
	-- Check exceptional codes
	modname = "languages/data/exceptional"
	local datax = mw.loadData("Module:" .. modname)
	extra_modname = modname .. "/extra"
	local extradatax = mw.loadData("Module:" .. extra_modname)
	
	for code, data in pairs(datax) do
		if code:find("^[a-z][a-z][a-z]?$") then
			discrepancy(modname, '%s (<code>%s</code>) has a two- or three-letter code.', link(data[1]), code)
		end
		
		check_language(modname, code, data, datax[code], extradatax[code])
	end
	check_extraneous_extra_data(modname, datax, extra_modname, extradatax)
	
	-- 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(
		"a submodule of [[Module:languages]]",
		all_codes, language_names,
		"languages/code to canonical name", m_language_codes,
		"languages/canonical names", m_language_canonical_names)
	
	-- Check [[Template:langname-lite]]
	local frame = mw.getCurrentFrame()
	local content = mw.title.new("Template:langname-lite"):getContent()
	content = content:gsub("%<%!%-%-.-%-%-%>", "") -- remove comments
	local match = mw.ustring.gmatch(content, "\n\t*|#*([^\n]+)=([^\n]*)")
	while true do
		local code, name, check_name = match()
		if not code then return "OK" end
		if code:len() > 1 and code ~= "default" then
			for _, code in pairs(mw.text.split(code, "|")) do
				local lang = m_languages.getByCode(code, nil, true, true)
				if name:match("etymcode") then
					local nonEtym_name = frame:preprocess(name)
					local nonEtym_real_name = lang:getNonEtymologicalName()
					if nonEtym_name ~= nonEtym_real_name then
						discrepancy("Template:langname-lite", "Code: <code>" .. code .. "</code>. Saw name: " .. nonEtym_name .. ". Expected name: " .. nonEtym_real_name .. ".")
					end
					name = frame:preprocess(name:gsub("{{{allow etym|}}}", "1"))
				elseif name:match("familycode") then
					name = name:match("familycode|(.-)|")
				else
					name = name
				end
				if not lang then
					discrepancy("Template:langname-lite", "Code: <code>" .. code .. "</code>. Saw name: " .. name .. ". Language not present in data.")
				else
					local real_name = lang:getCanonicalName()
					if name ~= real_name then
						discrepancy("Template:langname-lite", "Code: <code>" .. code .. "</code>. Saw name: " .. name .. ". Expected 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, 5, -- canonical name, wikidata item, family, scripts, parent
		"display_text", "generate_forms", "entry_name", "sort_key",
		"otherNames", "aliases", "varieties",
		"type", "main_code", "ancestors",
		"wikimedia_codes", "wikipedia_article", "standardChars",
		"translit", "override_translit", "link_tr",
		"dotted_dotless_i"
	}
	
	local function link(name)
		if not name then
			return "???"
		elseif name:find("[Ll]anguage$") then
			return name
		else
			return name .. " language"
		end
	end
	
	for code, data in pairs(m_etym_language_data) do
		local canonical_name, parent =
			data[1], data[5]
		check_etymology_language_data_keys(modname, code, data)
		
		if all_codes[code] then
			discrepancy(modname, "Code <code>%s</code> is not unique; it is also defined in [[Module:%s]].", code, all_codes[code])
		else
			if not m_etym_language_codes[code] then
				discrepancy("etymology languages/code to canonical name", "The code <code>%s</code> (%s) is missing.", code, canonical_name)
			end
			all_codes[code] = modname
		end
		
		if not canonical_name then
			discrepancy(modname, "Code <code>%s</code> has no canonical name specified.", code)
		elseif language_names[canonical_name] then
			local m_canonical_lang = m_languages.getByCanonicalName(canonical_name, nil, true)
			if not m_canonical_lang then
				discrepancy(modname, "%s (<code>%s</code>) has a canonical name that cannot be looked up.",
					link(canonical_name), code)
			elseif data.main_code ~= m_canonical_lang:getCode() then
				discrepancy(modname,
					"%s (<code>%s</code>) has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
					link(canonical_name), code, language_names[canonical_name])
			end
		else
			if not m_etym_language_canonical_names[canonical_name] then
				discrepancy("etymology languages/canonical names", "The canonical name %s (<code>%s</code>) is missing.", canonical_name, code)
			end
			language_names[canonical_name] = code
		end
		
		check_other_names_aliases_varieties(modname, code, canonical_name, data)
		
		if parent then
			if type(parent) ~= "string" then
				discrepancy(modname,
					"Etymology-only %s (<code>%s</code>) has a parent language or family code that is %s rather than a string.",
					link(canonical_name), code, parent == nil and "nil" or "a " .. type(parent))
			elseif not (m_language_data[parent] or m_family_data[parent] or m_etym_language_data[parent]) then
				discrepancy(modname,
					"Etymology-only %s (<code>%s</code>) has invalid parent language or family code <code>%s</code>.",
					link(canonical_name), code, parent)
			end
			nonempty_families[parent] = true
		else
			discrepancy(modname,
				"Etymology-only %s (<code>%s</code>) has no parent language or family code.",
				link(canonical_name), code)
		end
		
		if data.ancestors then
			check_ancestors(modname, code, data, data.ancestors, false)
		end
		
		if data[3] then
			local family = data[3]
			if not m_family_data[family] then
				discrepancy(modname,
					"%s (<code>%s</code>) has an invalid family code %s.",
					link(canonical_name), code, show_family_code(family))
			end
			nonempty_families[family] = true
		end
		
		check_wikidata_item(modname, code, data, 2)
	end

	local checked = {}
	for code, data in pairs(m_etym_language_data) do
		local stack = {}

		while data do
			if checked[data] then
				break	
			end
			if stack[data] then
				discrepancy(modname, "%s (<code>%s</code>) has a cyclic parental relationship to %s (<code>%s</code>)",
					link(data[1]), code,
					link(m_etym_language_data[data[5]][1]), data.parent or data[5]
				)
				break
			end
			stack[data] = true
			code, data = data[5], data[5] and m_etym_language_data[data[5]]
		end
		
		for data in pairs(stack) do
			checked[data] = true	
		end
	end
	
	check_code_to_name_and_name_to_code_maps(
		"[[Module:etymology languages/data]]",
		all_codes, language_names,
		"etymology languages/code to canonical name", m_etym_language_codes,
		"etymology languages/canonical names", m_etym_language_canonical_names)
end

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",
		"protoLanguage", "otherNames", "aliases", "varieties",
	}

	local function link(name)
		if not name then
			return "???"
		elseif name:find("[Ll]anguages$") then
			return "[[:Category:" .. name .. "|" .. name .. " family]]"
		else
			return "[[:Category:" .. name .. " languages|" .. name .. " family]]"
		end
	end
	
	for code, data in pairs(m_family_data) do
		check_family_data_keys(modname, code, data)
		
		local canonical_name, family = data[1], data[3]
		
		if all_codes[code] then
			discrepancy(modname, "Code <code>%s</code> is not unique; it is also defined in [[Module:%s]].", code, all_codes[code])
		else
			if not m_family_codes[code] then
				discrepancy("families/code to canonical name", "The code <code>%s</code> (%s) is missing.", code, canonical_name)
			end
			all_codes[code] = modname
		end
		
		if not canonical_name then
			discrepancy(modname, "Code <code>%s</code> has no canonical name specified.", code)
		elseif family_names[canonical_name] then
			discrepancy(modname,
				"%s (<code>%s</code>) has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
				link(canonical_name), code, family_names[canonical_name])
		else
			if not m_family_canonical_names[canonical_name] then
				discrepancy("families/canonical names", "The canonical name %s (<code>%s</code>) is missing.", canonical_name, code)
			end
			family_names[canonical_name] = code
		end
		
		if data[2] and type(data[2]) ~= "number" then
			discrepancy(modname, "%s (<code>%s</code>) has a wikidata item value that is not a number or <code>nil</code>: %s", link(canonical_name), code, mw.dumpObject(data[2]))
		end
		
		check_other_names_aliases_varieties(modname, code, canonical_name, data)
		
		if family then
			if family == code and code ~= "qfa-not" then
				discrepancy(modname,
					"%s (<code>%s</code>) has itself as its family.",
					link(canonical_name), code)
			elseif not m_family_data[family] then
				discrepancy(modname,
					"%s (<code>%s</code>) has an invalid parent family code %s.",
					link(canonical_name), code, show_family_code(family))
			end
			
			nonempty_families[family] = true
		end
		
		check_wikidata_item(modname, code, data, 2)
	end
	
	for code, data in pairs(m_family_data) do
		if not (nonempty_families[code] or allowed_empty_families[code]) then
			discrepancy(modname, "%s (<code>%s</code>) has no child families or languages.", link(data[1]), code)
		end
	end

	local checked = { ['qfa-not'] = true }
	for code, data in pairs(m_family_data) do
		local stack = {}

		while data do
			if checked[code] then
				break	
			end
			if stack[code] then
				discrepancy(modname, "%s (<code>%s</code>) has a cyclic parental relationship to %s (<code>%s</code>)",
					link(data[1]), code,
					link(m_family_data[data[3]][1]), data[3]
				)
				break
			end
			stack[code] = true
			code, data = data[3], m_family_data[data[3]]
		end
		
		for code in pairs(stack) do
			checked[code] = true	
		end
	end
	
	check_code_to_name_and_name_to_code_maps(
		"[[Module:families/data]]",
		all_codes, family_names,
		"families/code to canonical name", m_family_codes,
		"families/canonical names", m_family_canonical_names)
end

local function check_scripts()
	local modname = "scripts/data"
	
	local check_script_data_keys = check_data_keys({
		1, 2, -- canonical name, writing systems
		"canonicalName", "otherNames", "aliases", "varieties", "parent",
		"wikipedia_article", "characters", "spaces", "capitalized", "translit", "direction",
		"character_category", "normalizationFixes"
	}, true)
	
	local m_script_codes = require('Module:scripts/code to canonical name')
	local m_script_canonical_names = require('Module:scripts/by name')
	
	-- 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_script_data) do
		local canonical_name = data[1]
		if not m_script_codes[code] and #code == 4 then
			discrepancy('scripts/code to canonical name', '<code>%s</code> (%s) is missing', code, canonical_name)
		end
		
		check_script_data_keys(modname, code, data)
		
		if not canonical_name then
			discrepancy(modname, "Code <code>%s</code> has no canonical name specified.", code)
		elseif script_names[canonical_name] then
			--[=[
			discrepancy(modname,
				"%s (<code>%s</code>) has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
				link_script(data.names[1]), code, script_names[data.names[1]])
			--]=]
		else
			if not m_script_canonical_names[canonical_name] and #code == 4 then
				discrepancy('scripts/by name', '%s (<code>%s</code>) is missing', canonical_name, code)
			end
			script_names[canonical_name] = code
		end
		
		check_other_names_aliases_varieties(modname, code, canonical_name, data)
		
		if not nonempty_scripts[code] then
			discrepancy(modname,
				"%s (<code>%s</code>) is not used by any language%s.",
				link_script(canonical_name), code, data.characters and ""
					or " and has no characters listed for auto-detection")
		--[[
		elseif not data.characters then
			discrepancy(modname, "%s (<code>%s</code>) has no characters listed for auto-detection.", link_script(canonical_name), code)
		--]]
		end

		if data.characters then
			validate_pattern(data.characters, modname, code, data, false)
		end
		
		script_code_to_module_map[code] = modname
	end
	
	check_code_to_name_and_name_to_code_maps(
		"a submodule of [[Module:scripts]]",
		script_code_to_module_map, script_names,
		"scripts/code to canonical name", m_script_codes,
		"scripts/by name", m_script_canonical_names)
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 typ = type(data)
		if typ == "table" then
			check_label_data_keys(modname, code, data)
		elseif typ ~= "string" then
			discrepancy(modname,
				"The data for label <code>%s</code> is a %s; only tables and strings are allowed.",
				code, typ)
		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_language_codes) do
		local modname = "Module:labels/data/lang/" .. code
		local ok, module = pcall(require, modname)
		if ok 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 = mw.loadData("Module:zh/data/ts")
	local m_st = mw.loadData("Module:zh/data/st")
	local ruby = require("Module:ja-ruby").ruby_auto
	local lang = m_languages.getByCode("zh")
	local Hant = m_scripts.getByCode("Hant")
	local Hans = m_scripts.getByCode("Hans")
	
	local data = {[0] = m_st.st, m_ts.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 = m_links.language_link({term = other, alt = display, lang = lang, sc = sc[(j+1)%2], tr = "-"}, false)
		table.insert(chars, display)
		if data[(j+1)%2][other] == other then
			table.insert(chars, other)
			return chars, 1
		elseif not data[(j+1)%2][other] then
			table.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 = m_links.language_link({term = data[(j+1)%2][other], alt = display, lang = lang, sc = sc[j%2], tr = "-"}, false)
			table.insert(chars, display .. " (")
			display = ruby({["markup"] = "[" .. data[j%2][data[(j+1)%2][other]] .. "](" .. var[(j+1)%2] .. ")"})
			display = m_links.language_link({term = data[j%2][data[(j+1)%2][other]], alt = display, lang = lang, sc = sc[(j+1)%2], tr = "-"}, false)
			table.insert(chars, display .. " etc.)")
			return chars, 3
		end
		
		return chars, issue
	end
	
	for i = 0, 1, 1 do
		for char, other in pairs(data[i]) do
			if data[(i+1)%2][other] ~= char then
				local chars, issue = {}
				local display = ruby({["markup"] = "[" .. char .. "](" .. var[i] .. ")"})
				display = m_links.language_link({term = char, alt = display, lang = lang, sc = sc[i], tr = "-"}, false)
				table.insert(chars, display)
				chars, issue = find_stable_loop(chars, other, i)
				if issue == 1 or issue == 2 then
					local sc_this, mod_this, j = {}
					if chars[#chars-1]:match(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, char in ipairs(chars) do
						chars[k] = m_script_utils.tag_text(char, lang, sc_this[k%2], "term")
					end
					if issue == 1 then
						discrepancy("zh/data/" .. mod_this, "character references itself: " .. table.concat(chars, " → "))
					elseif issue == 2 then
						discrepancy("zh/data/" .. mod_this, "missing character: " .. table.concat(chars, " → "))
					end
				elseif issue == 3 then
					for j, char in ipairs(chars) do
						chars[j] = m_script_utils.tag_text(char, lang, sc[(i+j)%2], "term")
					end
					discrepancy("zh/data/" .. mod[i], "possible mismatched character: " .. table.concat(chars, " → "))
				end
			end
		end
	end
end

local function check_serialization(modname)
	local serializers = {
		["Hani-sortkey/data/serialized"] = "Hani-sortkey/serializer",
		["zh/data/ts/serialized"] = "zh/data/ts/serializer",
		["zh/data/st/serialized"] = "zh/data/st/serializer",
	}
	
	if not serializers[modname] then
		return nil
	end
	
	local serializer = serializers[modname]
	local current_data = require("Module:" .. serializer).main(true)
	local stored_data = require("Module:" .. modname)
	if current_data ~= stored_data then
		discrepancy(modname, "<strong><u>Important!</u> Serialized data is out of sync. Use [[Module: ".. serializer .. "]] 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>")
	end
end

-- Warning: cannot be called twice in the same module invocation because
-- some module-global variables are not reset between calls.
function export.do_checks(modules)
	messages = setmetatable({}, {
		__index = function (self, k)
			local val = Array()
			self[k] = val
			return val
		end
	})
	
	if modules["zh/data/ts"] or modules["zh/data/st"] then
		check_zh_trad_simp()
	end
	check_languages()
	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()
	
	if modules["labels/data"] then
		check_labels()
	end
	
	for module in pairs(modules) do
		check_serialization(module)
	end
	
	setmetatable(messages, nil)
	
	local function find_code(message)
		return string.match(message, "<code>([^<]+)</code>")
	end
	
	find_code = require("Module:fun").memoize(find_code)
	
	local function comp(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
	
	for modname, msglist in pairs(messages) do
		msglist:sort(comp)
	end
	
	local ret = messages
	messages = nil
	return ret
end

function export.format_message(modname, msglist)
	local header; if modname:match("^Module:") or modname:match("^Template:") then
		header = "===[[" .. modname .. "]]==="
	else
		header = "===[[Module:" .. modname .. "]]==="
	end
	return header
		.. msglist
			:map(
				function(msg)
					return "\n* " .. msg
				end)
			:concat()
end

function export.check_modules(args)
	
	local modules = {}
	for i, arg in ipairs(args) do
		modules[arg] = true
	end
	
	local ret = Array()
	local messages = export.do_checks(modules)
	
	for _, module in ipairs(args) do
		local msglist = messages[module]
		if msglist then
			ret:insert(export.format_message(module, msglist))
		end
	end
	return ret:concat("\n")
end

function export.check_modules_t(frame)
	local args = m_table.shallowcopy(frame.args)
	return export.check_modules(args)
end

function export.perform(frame)
	local messages = export.do_checks({})
	
	-- Format the messages
	local ret = Array()
	for modname, msglist in m_table.sortedPairs(messages) do
		ret:insert(export.format_message(modname, msglist))
	end
	
	-- Are there any messages?
	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