Modul:data consistency check
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 codebsg
. - Hokkien language (
nan-hok
) has a canonical name that is not unique; it is also used by the codenan
. - Ardhamagadhi Prakrit language (
pra-ard
) has a canonical name that is not unique; it is also used by the codepka
. - Maharastri Prakrit language (
pra-mah
) has a canonical name that is not unique; it is also used by the codepmh
. - Sauraseni Prakrit language (
pra-sau
) has a canonical name that is not unique; it is also used by the codepsu
. - Rudbari language (
rdb-rud
) has a canonical name that is not unique; it is also used by the coderdb
. - Chali language (
tks-cal
) has a canonical name that is not unique; it is also used by the codetgf
.
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 codealv-swd
. - Arawak, the canonical name for
awd
, is repeated in the table ofaliases
. - Ta-Arawak, the canonical name for
awd-taa
, is repeated in the table ofaliases
. - 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 ofaliases
. - Nauru, the canonical name for
na
, is repeated in the table ofaliases
. - Sinhala, the canonical name for
si
, is repeated in the table ofaliases
.
Module:languages/data/3/a/extra
- Language code
ajt
is not found in Module:languages/data/3/a, and should be removed from Module:languages/data/3/a/extra. - Language code
aju
is not found in Module:languages/data/3/a, and should be removed from 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 codeban
. - bahasa Bodo Parja (
bdv
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Bhatri (
bgw
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Bhunjia (
bhu
) lists an invalid language codeinc-mgd
as ancestor. - Banjar, the canonical name for
bjn
, is repeated in the table ofaliases
. - Dairi Batak, the canonical name for
btd
, is repeated in the table ofaliases
.
Module:languages/data/3/d
- Idahan, the canonical name for
dbj
, is repeated in the table ofaliases
. - Kadazandusun, the canonical name for
dtp
, is repeated in the table ofaliases
.
Module:languages/data/3/e/extra
- Language code
esi
is not found in Module:languages/data/3/e, and should be removed from Module:languages/data/3/e/extra. - Language code
esk
is not found in Module:languages/data/3/e, and should be removed from Module:languages/data/3/e/extra.
Module:languages/data/3/g/extra
- Language code
grr
is not found in Module:languages/data/3/g, and should be removed from Module:languages/data/3/g/extra.
Module:languages/data/3/h
- bahasa Halbi (
hlb
) lists an invalid language codeinc-mgd
as ancestor.
Module:languages/data/3/h/extra
- Language code
haz
is not found in Module:languages/data/3/h, and should be removed from Module:languages/data/3/h/extra.
Module:languages/data/3/j/extra
- bahasa Jakun (
jak
) has data in Module:languages/data/3/j, but does not have corresponding data in Module:languages/data/3/j/extra. - Language code
jbe
is not found in Module:languages/data/3/j, and should be removed from Module:languages/data/3/j/extra. - Language code
jrb
is not found in Module:languages/data/3/j, and should be removed from Module:languages/data/3/j/extra. - Language code
jye
is not found in Module:languages/data/3/j, and should be removed from Module:languages/data/3/j/extra.
Module:languages/data/3/k
- bahasa Kamar (
keq
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Kurmukar (
kfv
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Kharia Thar (
ksy
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Kayort (
kyv
) lists an invalid language codeinc-mgd
as ancestor.
Module:languages/data/3/m
- Mendriq, the canonical name for
mnq
, is repeated in the table ofaliases
.
Module:languages/data/3/m/extra
- Language code
mjg
is not found in Module:languages/data/3/m, and should be removed from Module:languages/data/3/m/extra.
Module:languages/data/3/n
- bahasa Nahari (
nhh
) lists an invalid language codeinc-mgd
as ancestor.
Module:languages/data/3/r
- bahasa Rajbanshi (
rjs
) lists an invalid language codeinc-mgd
as ancestor.
Module:languages/data/3/s
- bahasa Surjapuri (
sjp
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Sonha (
soi
) lists an invalid language codeinc-mgd
as ancestor.
Module:languages/data/3/s/extra
- Language code
sel
is not found in Module:languages/data/3/s, and should be removed from Module:languages/data/3/s/extra. - Language code
ssn
is not found in Module:languages/data/3/s, and should be removed from Module:languages/data/3/s/extra.
Module:languages/data/3/t
- bahasa Chitwania Tharu (
the
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Dangaura Tharu (
thl
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Kochila Tharu (
thq
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Rana Tharu (
thr
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Buksa (
tkb
) lists an invalid language codeinc-mgd
as ancestor. - bahasa Kathoriya Tharu (
tkt
) lists an invalid language codeinc-mgd
as ancestor.
Module:languages/data/3/t/extra
- Language code
taq
is not found in Module:languages/data/3/t, and should be removed from Module:languages/data/3/t/extra. - Language code
thv
is not found in Module:languages/data/3/t, and should be removed from Module:languages/data/3/t/extra. - Language code
tjo
is not found in Module:languages/data/3/t, and should be removed from Module:languages/data/3/t/extra. - Language code
ttq
is not found in Module:languages/data/3/t, and should be removed from Module:languages/data/3/t/extra.
Module:languages/data/3/y/extra
- Language code
yhd
is not found in Module:languages/data/3/y, and should be removed from Module:languages/data/3/y/extra. - Language code
yud
is not found in Module:languages/data/3/y, and should be removed from Module:languages/data/3/y/extra.
Module:languages/data/3/z
- bahasa Mirgan (
zrg
) lists an invalid language codeinc-mgd
as ancestor.
Module:languages/data/exceptional
- bahasa Melayu Sarawak (
poz-sml
) has a canonical name that is not unique; it is also used by the codezlm-sar
. - bahasa Melayu Sarawak (
zlm-sar
) has an invalid family codems
.
Module:languages/data/exceptional/extra
- bahasa Melayu Sarawak (
zlm-sar
) has data in Module:languages/data/exceptional, but does not have corresponding data in Module:languages/data/exceptional/extra.
Module:scripts/data
- Blissymbols script (
Blis
) is not used by any language and has no characters listed for auto-detection. - Cypro-Minoan script (
Cpmn
) is not used by any language. - Hieratic script (
Egyh
) is not used by any language and has no characters listed for auto-detection. - Elymaic script (
Elym
) is not used by any language. - Hiragana script (
Hira
) is not used by any language. - Nyiakeng Puachue Hmong script (
Hmnp
) is not used by any language. - Kana script (
Hrkt
) is not used by any language. - Image-rendered script (
Imag
) is not used by any language and has no characters listed for auto-detection. - International Phonetic Alphabet script (
Ipach
) is not used by any language and has no characters listed for auto-detection. - Kpelle script (
Kpel
) is not used by any language and has no characters listed for auto-detection. - Loma script (
Loma
) is not used by any language and has no characters listed for auto-detection. - Moon script (
Moon
) is not used by any language and has no characters listed for auto-detection. - Morse code (
Morse
) is not used by any language and has no characters listed for auto-detection. - Musical notation script (
Music
) is not used by any language. - Nag Mundari script (
Nagm
) is not used by any language. - Unspecified script (
None
) is not used by any language and has no characters listed for auto-detection. - Rongorongo script (
Roro
) is not used by any language and has no characters listed for auto-detection. - Rumi numerals script (
Rumin
) is not used by any language. - flag semaphore (
Semap
) is not used by any language and has no characters listed for auto-detection. - Visible Speech script (
Visp
) is not used by any language and has no characters listed for auto-detection. - Vithkuqi script (
Vith
) is not used by any language. - Woleai script (
Wole
) is not used by any language and has no characters listed for auto-detection. - Yezidi script (
Yezi
) is not used by any language. - mathematical notation script (
Zmth
) is not used by any language. - symbol script (
Zsym
) is not used by any language. - undetermined script (
Zyyy
) is not used by any language and has no characters listed for auto-detection. - uncoded script (
Zzzz
) is not used by any language and has no characters listed for auto-detection. - The data key
sort_by_scraping
for Japanese script (Jpan
) is invalid.
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 notnil
, it must a valid Wikidata item ID. - If field
3
orfamily
is given and notnil
, it must be a valid family code. - If field
4
orscripts
is given and notnil
, 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
andto
) 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
andto
) or a string (remove_diacritics
). - If
entry_name
orsort_key
is given, thefrom
array must be longer or equal in length to theto
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 betrue
. - 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 atr
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 amakeSortKey
function that takes a pagename (and optionally a language code and script code) as arguments. - If
entry_name
orsort_key
is a table and contains a fieldremove_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