မေႃႇၵျူး: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.
ဢၢဝ်ႉပုတ်ႉ
[မႄးထတ်း]Discrepancies detected:
- Code:
EL.. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
EL.. Saw name: Ecclesiastical Latin. Expected name: ၶျၢတ်ႉၶႅတ်ႉတလိၵ်ႉလတိၼ်ႇ. - Code:
LL.. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
ML.. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
VL.. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
aav. Saw name: Austroasiatic. Expected name: ဢေႃႇသထရူဝ်ႇဢေးသျႃးတိၵ်ႉ. - Code:
ar. Saw name: Arabic. Expected name: ဢႃႇရၢပ်ႈ. - Code:
bg. Saw name: Bulgarian. Expected name: ပူႇၵႃႇရီႇယႃႇ. - Code:
blt. Saw name: Tai Dam. Expected name: တႆးလမ်. - Code:
cja. Saw name: Western Cham. Expected name: ၸၢမ်ပွတ်းတူၵ်း. - Code:
cnk. Saw name: Khumi Chin. Expected name: ၶျၢင်းၶူမီး. - Code:
de. Saw name: German. Expected name: ၵျႃႇမၼ်ႇ. - Code:
en. Saw name: English. Expected name: ဢိင်းၵလဵတ်ႈ. - Code:
enm. Saw name: Middle English. Expected name: ဢိင်းၵလဵတ်ႈ ပွတ်းၵၢင်. - Code:
es. Saw name: Spanish. Expected name: သပဵၼ်ႇ. - Code:
fi. Saw name: Finnish. Expected name: ၾိၼ်ႇလႅၼ်ႇ. - Code:
fr. Saw name: French. Expected name: ၾရၢင်ႇသဵတ်ႈ. - Code:
fr-CA. Saw name: French. Expected name: ၾရၢင်ႇသဵတ်ႈ. - Code:
gkm. Saw name: Ancient Greek. Expected name: ၵရိတ်ႈမိူဝ်ႈၵွၼ်ႇ. - Code:
grc. Saw name: Ancient Greek. Expected name: ၵရိတ်ႈမိူဝ်ႈၵွၼ်ႇ. - Code:
gv. Saw name: Manx. Expected name: မႅၼ်ႉ. - Code:
he. Saw name: Hebrew. Expected name: ႁီးပရူး. - Code:
hi. Saw name: Hindi. Expected name: ႁိၼ်ႇတီႇ. - Code:
it. Saw name: Italian. Expected name: ဢီႇတႃႇလီႇ. - Code:
itc-ola. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
ja. Saw name: Japanese. Expected name: ၵျႃႇပၢၼ်ႇ. - Code:
jv. Saw name: Javanese. Expected name: ၵျႃႇဝႃး. - Code:
ka. Saw name: Georgian. Expected name: ၵျေႃႇၵျႃႇ. - Code:
khb. Saw name: Lü. Expected name: လိုဝ်ႉ. - Code:
kht. Saw name: Khamti. Expected name: ၶမ်းတီႈ. - Code:
km. Saw name: Khmer. Expected name: ၶမဵၼ်. - Code:
ko. Saw name: Korean. Expected name: ၵၢဝ်းလီ. - Code:
la. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
la-ecc. Saw name: Ecclesiastical Latin. Expected name: ၶျၢတ်ႉၶႅတ်ႉတလိၵ်ႉလတိၼ်ႇ. - Code:
la-ecc. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
la-lat. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
la-med. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
la-vul. Saw name: Latin. Expected name: လတိၼ်ႇ. - Code:
lo. Saw name: Lao. Expected name: လၢဝ်း. - Code:
ltc. Saw name: Middle Chinese. Expected name: ၶႄႇပွတ်းၵၢင်. - Code:
mi. Saw name: Maori. Expected name: မၢဝ်းရီႇ. - Code:
mkh-pro. Saw name: Proto-Mon-Khmer. Expected name: မွၼ်း-ၶမဵၼ် ႁူဝ်တီး. - Code:
mnw. Saw name: Mon. Expected name: မွၼ်း. - Code:
my. Saw name: Burmese. Expected name: မၢၼ်ႈ. - Code:
nan-hbl. Saw name: Hokkien. Expected name: ႁွၵ်ႉၵဵၼ်း. - Code:
nl. Saw name: Dutch. Expected name: တတ်ႉၶ်ျ. - Code:
nod. Saw name: Northern Thai. Expected name: လၢၼ်ႉၼႃး. - Code:
och. Saw name: Old Chinese. Expected name: ၶႄႇၵဝ်ႇ. - Code:
okz. Saw name: Old Khmer. Expected name: ၶမဵၼ်ၵဝ်ႇ. - Code:
okz-ang. Saw name: Old Khmer. Expected name: ၶမဵၼ်ၵဝ်ႇ. - Code:
omx. Saw name: Old Mon. Expected name: မွၼ်းၵဝ်ႇ. - Code:
ota. Saw name: Ottoman Turkish. Expected name: တူႇရၵီႇ ဢူဝ်ႇတူဝ်ႇမႅၼ်ႇ. - Code:
phk. Saw name: Phake. Expected name: ၽႃၵေး. - Code:
pi. Saw name: Pali. Expected name: ပႃႇလိ. - Code:
ru. Saw name: Russian. Expected name: ရတ်ႈသျႃး. - Code:
sa. Saw name: Sanskrit. Expected name: သၢၼ်းသၶရိတ်ႉ. - Code:
shn. Saw name: Shan. Expected name: တႆး. - Code:
sit-pro. Saw name: Proto-Sino-Tibetan. Expected name: သီႇၼူဝ်ႇ-တိပႅတ်ႉ-ႁူဝ်တီး. - Code:
ta. Saw name: Tamil. Expected name: တမီးလ်. - Code:
tai-pro. Saw name: Proto-Tai. Expected name: တႆး-ႁူဝ်တီး. - Code:
tdd. Saw name: Tai Nüa. Expected name: တႆးၼိူဝ်. - Code:
th. Saw name: Thai. Expected name: ထႆး. - Code:
ur. Saw name: Urdu. Expected name: ဢူရတူ. - Code:
vsn. Saw name: Sanskrit. Expected name: သၢၼ်းသၶရိတ်ႉ. - Code:
yai. Saw name: Yaghnobi. Expected name: Yagnobi. - Code:
za. Saw name: Zhuang. Expected name: ၸွင်ႈ. - Code:
zh. Saw name: Chinese. Expected name: ၶႄႇ.
- The canonical name West Saxon Old English (
ang-wsx) is missing. - The canonical name Barpetia Kamrupi Assamese (
as-bkm) is missing. - The canonical name Nalbaria Kamrupi Assamese (
as-nkm) is missing. - The canonical name Palasbaria Kamrupi Assamese (
as-pkm) is missing. - The canonical name Dnieper Baltic (
bat-dni) is missing. - The canonical name Golyad (
bat-gol) is missing. - The code
bew-oraand the canonical name Betawi Ora should be removed; they are not found in Module:etymology languages/data. - The code
bew-udiand the canonical name Betawi Udik should be removed; they are not found in Module:etymology languages/data. - The canonical name Dhakaiya Vaṅga Bengali (
bn-dvn) is missing. - The canonical name Noakhailla Vaṅga Bengali (
bn-nvn) is missing. - The canonical name Anatri Chuvash (
cv-ana) is missing. - Anatri, the canonical name for the code
cv-ana, is wrong; it should be Anatri Chuvash. - Viryal, the canonical name for the code
cv-vir, is wrong; it should be Viryal Chuvash. - The canonical name Viryal Chuvash (
cv-vir) is missing. - The canonical name Early New High German (
de-ear) is missing. - The canonical name New Zealand English (
en-NZ) is missing. - The canonical name South African English (
en-ZA) is missing. - The canonical name Geordie (
en-geo) is missing. - Geordie English, the canonical name for the code
en-geo, is wrong; it should be Geordie. - The canonical name East Midland Middle English (
enm-emi) is missing. - The canonical name Kentish Middle English (
enm-ken) is missing. - The canonical name Southern Middle English (
enm-sou) is missing. - The canonical name West Midland Middle English (
enm-wmi) is missing. - The canonical name Bolivian Spanish (
es-BO) is missing. - The canonical name Chilean Spanish (
es-CL) is missing. - The canonical name Philippine Spanish (
es-PH) is missing. - Emamzada Esma’ili, the canonical name for the code
fay-eze, is wrong; it should be Emamzada Esmaili. - The canonical name Emamzada Esmaili (
fay-eze) is missing. - The canonical name Proto-Anglo-Frisian (
gmw-afr-pro) is missing. - The canonical name Proto-North Sea Germanic (
gmw-nsg-pro) is missing. - The canonical name Hong Kong Hakka (
hak-HK) is missing. - Biblical Hebrew, the canonical name for the code
hbo, is wrong; it should be ၵျၢမ်းလိၵ်ႈႁီးပရူး. - The canonical name ၵျၢမ်းလိၵ်ႈႁီးပရူး (
hbo) is missing. - The canonical name Lanuvian (
itc-lan) is missing. - The canonical name Praenestine (
itc-pra) is missing. - The canonical name Classical Japanese (
ja-cla) is missing. - The canonical name North Karelian (
krl-nor) is missing. - The canonical name South Karelian (
krl-sou) is missing. - The canonical name African Romance (
la-afr) is missing. - Ecclesiastical Latin, the canonical name for the code
la-ecc, is wrong; it should be ၶျၢတ်ႉၶႅတ်ႉတလိၵ်ႉလတိၼ်ႇ. - The canonical name ၶျၢတ်ႉၶႅတ်ႉတလိၵ်ႉလတိၼ်ႇ (
la-ecc) is missing. - Literary Chinese, the canonical name for the code
lzh-lit, is wrong; it should be Literary Chinese. - The canonical name Traditional Chinese poetry (
lzh-shi) is missing. - The code
mis-idnand the canonical name Idiom Neutral should be removed; they are not found in Module:etymology languages/data. - The code
mis-tdland the canonical name Turduli should be removed; they are not found in Module:etymology languages/data. - The code
mis-tdtand the canonical name Turdetani should be removed; they are not found in Module:etymology languages/data. - The code
mis-xnuand the canonical name Xiongnu should be removed; they are not found in Module:etymology languages/data. - The canonical name Orkhon Turkic (
otk-ork) is missing. - The canonical name Proto-Ketic (
qfa-yke-pro) is missing. - The canonical name Proto-Kottic (
qfa-yko-pro) is missing. - The canonical name Proto-Pumpokolic (
qfa-ypm-pro) is missing. - The canonical name Proto-Arinic (
qfa-yrn-pro) is missing. - a pre-Roman substrate of Iberia, the canonical name for the code
qsb-ibe, is wrong; it should be Paleo-Hispanic. - The canonical name a Paleo-Hispanic substrate (
qsb-ibe) is missing. - The code
qsb-pygand the canonical name a substrate language originally spoken by the Pygmies should be removed; they are not found in Module:etymology languages/data. - The canonical name Cuman (
qwm-cum) is missing. - The canonical name Moldovan (
ro-MD) is missing. - The canonical name Proto-Romance (
roa-pro) is missing. - South Scots, the canonical name for the code
sco-sou, is wrong; it should be Southern Scots. - The canonical name Southern Scots (
sco-sou) is missing. - The canonical name Medieval Tashelhit (
shi-med) is missing. - The canonical name ဢယုတ်ႉထယႃးထႆးၵဝ်ႇ (
th-ayu) is missing. - The code
th-newand the canonical name Hacked Thai should be removed; they are not found in Module:etymology languages/data. - The canonical name Old Thai (
th-old) is missing. - The canonical name Sukhothai Old Thai (
th-suk) is missing. tmh-ght, the code for the canonical name Ghat, is wrong; it should bethv-ght.- The canonical name Língua Geral Amazônica (
tpw-lga) is missing. - The canonical name Proto-Bulgar (
trk-bul-pro) is missing. - The code
trk-cmnand the canonical name Common Turkic should be removed; they are not found in Module:etymology languages/data. - The canonical name Proto-Common Turkic (
trk-cmn-pro) is missing. - The canonical name Proto-Oghur (
trk-ogr-pro) is missing. - The code
tw-abrand the canonical name Bono Twi should be removed; they are not found in Module:etymology languages/data. - The canonical name Canadian Ukrainian (
uk-CA) is missing. - The canonical name Afghan Uzbek (
uz-afg) is missing. - The code
woyand the canonical name Weyto should be removed; they are not found in Module:etymology languages/data. - The canonical name Danube Bulgar (
xbo-dan) is missing. - The canonical name Volga Bulgar (
xbo-vol) is missing. - The canonical name Capenate (
xfa-cap) is missing. - The canonical name Bhaca (
xh-bha) is missing. - The code
xum-herand the canonical name Hernician should be removed; they are not found in Module:etymology languages/data. - The canonical name Middle Belarusian (
zle-mbe) is missing. - The canonical name Middle Ukrainian (
zle-muk) is missing. - The code
zle-obeand the canonical name Old Belarusian should be removed; they are not found in Module:etymology languages/data. - The code
zle-oukand the canonical name Old Ukrainian should be removed; they are not found in Module:etymology languages/data. - The canonical name Russian Church Slavonic (
zls-chs-ru) is missing. - The canonical name Ukrainian Church Slavonic (
zls-chs-uk) is missing. - The canonical name Zarphatic (
zrp) is missing.
- The code
ang-wsx(West Saxon Old English) is missing. - The code
as-bkm(Barpetia Kamrupi Assamese) is missing. - The code
as-nkm(Nalbaria Kamrupi Assamese) is missing. - The code
as-pkm(Palasbaria Kamrupi Assamese) is missing. - The code
bat-dni(Dnieper Baltic) is missing. - The code
bat-gol(Golyad) is missing. - The code
bew-oraand the canonical name Betawi Ora should be removed; they are not found in Module:etymology languages/data. - The code
bew-udiand the canonical name Betawi Udik should be removed; they are not found in Module:etymology languages/data. - The code
bn-dvn(Dhakaiya Vaṅga Bengali) is missing. - The code
bn-nvn(Noakhailla Vaṅga Bengali) is missing. - The code
cls(Classical Sanskrit) is missing. - Anatri, the canonical name for the code
cv-ana, is wrong; it should be Anatri Chuvash. - Viryal, the canonical name for the code
cv-vir, is wrong; it should be Viryal Chuvash. - The code
de-ear(Early New High German) is missing. - The code
en-NZ(New Zealand English) is missing. - The code
en-ZA(South African English) is missing. - Geordie English, the canonical name for the code
en-geo, is wrong; it should be Geordie. - The code
enm-emi(East Midland Middle English) is missing. - The code
enm-ken(Kentish Middle English) is missing. - The code
enm-sou(Southern Middle English) is missing. - The code
enm-wmi(West Midland Middle English) is missing. - The code
es-BO(Bolivian Spanish) is missing. - The code
es-CL(Chilean Spanish) is missing. - The code
es-PH(Philippine Spanish) is missing. - Emamzada Esma’ili, the canonical name for the code
fay-eze, is wrong; it should be Emamzada Esmaili. - The code
gmw-afr-pro(Proto-Anglo-Frisian) is missing. - The code
gmw-nsg-pro(Proto-North Sea Germanic) is missing. - The code
hak-HK(Hong Kong Hakka) is missing. - Biblical Hebrew, the canonical name for the code
hbo, is wrong; it should be ၵျၢမ်းလိၵ်ႈႁီးပရူး. - The code
itc-lan(Lanuvian) is missing. - The code
itc-pra(Praenestine) is missing. - The code
ja-cla(Classical Japanese) is missing. - The code
krl-nor(North Karelian) is missing. - The code
krl-sou(South Karelian) is missing. - The code
la-afr(African Romance) is missing. - Ecclesiastical Latin, the canonical name for the code
la-ecc, is wrong; it should be ၶျၢတ်ႉၶႅတ်ႉတလိၵ်ႉလတိၼ်ႇ. - Literary Chinese, the canonical name for the code
lzh-lit, is wrong; it should be Literary Chinese. - The code
lzh-shi(Traditional Chinese poetry) is missing. - The code
mis-idnand the canonical name Idiom Neutral should be removed; they are not found in Module:etymology languages/data. - The code
mis-tdland the canonical name Turduli should be removed; they are not found in Module:etymology languages/data. - The code
mis-tdtand the canonical name Turdetani should be removed; they are not found in Module:etymology languages/data. - The code
mis-xnuand the canonical name Xiongnu should be removed; they are not found in Module:etymology languages/data. - The code
otk-ork(Orkhon Turkic) is missing. - The code
qfa-yke-pro(Proto-Ketic) is missing. - The code
qfa-yko-pro(Proto-Kottic) is missing. - The code
qfa-ypm-pro(Proto-Pumpokolic) is missing. - The code
qfa-yrn-pro(Proto-Arinic) is missing. - a pre-Roman substrate of Iberia, the canonical name for the code
qsb-ibe, is wrong; it should be Paleo-Hispanic. - The code
qsb-pygand the canonical name a substrate language originally spoken by the Pygmies should be removed; they are not found in Module:etymology languages/data. - The code
qwm-cum(Cuman) is missing. - The code
ro-MD(Moldovan) is missing. - The code
roa-pro(Proto-Romance) is missing. - South Scots, the canonical name for the code
sco-sou, is wrong; it should be Southern Scots. - The code
shi-med(Medieval Tashelhit) is missing. - The code
th-ayu(ဢယုတ်ႉထယႃးထႆးၵဝ်ႇ) is missing. - The code
th-newand the canonical name Hacked Thai should be removed; they are not found in Module:etymology languages/data. - The code
th-old(Old Thai) is missing. - The code
th-suk(Sukhothai Old Thai) is missing. - The code
tpw-lga(Língua Geral Amazônica) is missing. - The code
trk-bul-pro(Proto-Bulgar) is missing. - The code
trk-cmnand the canonical name Common Turkic should be removed; they are not found in Module:etymology languages/data. - The code
trk-cmn-pro(Proto-Common Turkic) is missing. - The code
trk-ogr-pro(Proto-Oghur) is missing. - The code
tw-abrand the canonical name Bono Twi should be removed; they are not found in Module:etymology languages/data. - The code
uk-CA(Canadian Ukrainian) is missing. - The code
uz-afg(Afghan Uzbek) is missing. - The code
vsn(Vedic Sanskrit) is missing. - The code
woyand the canonical name Weyto should be removed; they are not found in Module:etymology languages/data. - The code
xbo-dan(Danube Bulgar) is missing. - The code
xbo-vol(Volga Bulgar) is missing. - The code
xfa-cap(Capenate) is missing. - The code
xh-bha(Bhaca) is missing. - The code
xum-herand the canonical name Hernician should be removed; they are not found in Module:etymology languages/data. - The code
zle-mbe(Middle Belarusian) is missing. - The code
zle-muk(Middle Ukrainian) is missing. - The code
zle-obeand the canonical name Old Belarusian should be removed; they are not found in Module:etymology languages/data. - The code
zle-oukand the canonical name Old Ukrainian should be removed; they are not found in Module:etymology languages/data. - The code
zls-chs-ru(Russian Church Slavonic) is missing. - The code
zls-chs-uk(Ukrainian Church Slavonic) is missing. - The code
zrp(Zarphatic) is missing.
- Abron (
abr) has a canonical name that is not unique; it is also used by the codeabr. - The code
abris not unique; it is also defined in Module:languages/data/3/a. - Classical Japanese (
ja-cla) has the ancestor Early Middle Japanese (ja-mid-ear) listed in its ancestor field, which is redundant, since it is determined to be ancestral automatically. - Literary Chinese (
lzh-lit) has a canonical name that is not unique; it is also used by the codelzh. - Old Ossetic (
oos) has a canonical name that cannot be looked up. - The code
oosis not unique; it is also defined in Module:languages/data/3/o. - The data key
strip_diacriticsfor Middle Russian (zle-mru) is invalid. - The data key
strip_diacriticsfor Middle Polish (zlw-mpl) is invalid. - The
translitfield in the data table for Iranian Persian (fa-ira) specifies the module Module:fa-ira-translit, which does not exist. - The
translitfield in the data table for Afghan Uzbek (uz-afg) specifies the module Module:uz-afg-translit, which does not exist. - The code
wssis not unique; it is also defined in Module:languages/data/3/w. - Wasa (
wss) has a canonical name that is not unique; it is also used by the codewss.
- The canonical name ဢေႃႇသထရူဝ်ႇဢေးသျႃးတိၵ်ႉ languages (
aav) is missing. - Austroasiatic, the canonical name for the code
aav, is wrong; it should be ဢေႃႇသထရူဝ်ႇဢေးသျႃးတိၵ်ႉ. ero, the code for the canonical name Horpa, is wrong; it should beero.- The canonical name မွၼ်း-ၶမဵၼ် languages (
mkh) is missing. - Mon-Khmer, the canonical name for the code
mkh, is wrong; it should be မွၼ်း-ၶမဵၼ်.
- Austroasiatic, the canonical name for the code
aav, is wrong; it should be ဢေႃႇသထရူဝ်ႇဢေးသျႃးတိၵ်ႉ. ero, the code for the canonical name Horpa, is wrong; it should beero.- Mon-Khmer, the canonical name for the code
mkh, is wrong; it should be မွၼ်း-ၶမဵၼ်.
- The code
erois not unique; it is also defined in Module:languages/data/3/e. - Old Indo-Aryan languages (
inc-old) has no child families or languages. - Middle Iranian languages (
ira-mid) has no child families or languages. - Old Iranian languages (
ira-old) has no child families or languages. - creole languages (
qfa-cre) has no child families or languages. - pidgin languages (
qfa-pid) has no child families or languages. - Dalmatian Romance languages (
roa-dal) has no child families or languages. - Emilian-Romagnol languages (
roa-emr) has no child families or languages.
- The canonical name ဢႃႇရၢပ်ႈ (
ar) is missing. - Arabic, the canonical name for the code
ar, is wrong; it should be ဢႃႇရၢပ်ႈ. - The canonical name Badui (
bac) is missing. - Baduy, the canonical name for the code
bac, is wrong; it should be Badui. - The canonical name ပူႇၵႃႇရီႇယႃႇ (
bg) is missing. - Bulgarian, the canonical name for the code
bg, is wrong; it should be ပူႇၵႃႇရီႇယႃႇ. - The canonical name တႆးလမ် (
blt) is missing. - Tai Dam, the canonical name for the code
blt, is wrong; it should be တႆးလမ်. - Western Cham, the canonical name for the code
cja, is wrong; it should be ၸၢမ်ပွတ်းတူၵ်း. - The canonical name ၸၢမ်ပွတ်းတူၵ်း (
cja) is missing. - The canonical name Lautu Chin (
clt) is missing. - Lutuv, the canonical name for the code
clt, is wrong; it should be Lautu Chin. - The canonical name ၶျၢင်းၶူမီး (
cnk) is missing. - Khumi Chin, the canonical name for the code
cnk, is wrong; it should be ၶျၢင်းၶူမီး. - The canonical name ၵျႃႇမၼ်ႇ (
de) is missing. - German, the canonical name for the code
de, is wrong; it should be ၵျႃႇမၼ်ႇ. - The canonical name Dek (
dek) is missing. - English, the canonical name for the code
en, is wrong; it should be ဢိင်းၵလဵတ်ႈ. - The canonical name ဢိင်းၵလဵတ်ႈ (
en) is missing. - Middle English, the canonical name for the code
enm, is wrong; it should be ဢိင်းၵလဵတ်ႈ ပွတ်းၵၢင်. - The canonical name ဢိင်းၵလဵတ်ႈ ပွတ်းၵၢင် (
enm) is missing. - The canonical name Horpa (
ero) is missing. - Finnish, the canonical name for the code
fi, is wrong; it should be ၾိၼ်ႇလႅၼ်ႇ. - The canonical name ၾိၼ်ႇလႅၼ်ႇ (
fi) is missing. - The canonical name ၾရၢင်ႇသဵတ်ႈ (
fr) is missing. - French, the canonical name for the code
fr, is wrong; it should be ၾရၢင်ႇသဵတ်ႈ. - Ancient Greek, the canonical name for the code
grc, is wrong; it should be ၵရိတ်ႈမိူဝ်ႈၵွၼ်ႇ. - The canonical name ၵရိတ်ႈမိူဝ်ႈၵွၼ်ႇ (
grc) is missing. - The canonical name မႅၼ်ႉ (
gv) is missing. - Manx, the canonical name for the code
gv, is wrong; it should be မႅၼ်ႉ. - Hebrew, the canonical name for the code
he, is wrong; it should be ႁီးပရူး. - The canonical name ႁီးပရူး (
he) is missing. - The canonical name ႁိၼ်ႇတီႇ (
hi) is missing. - Hindi, the canonical name for the code
hi, is wrong; it should be ႁိၼ်ႇတီႇ. - The canonical name Hadothi (
hoj) is missing. - Hadoti, the canonical name for the code
hoj, is wrong; it should be Hadothi. - The canonical name ဢီႇတႃႇလီႇ (
it) is missing. - Italian, the canonical name for the code
it, is wrong; it should be ဢီႇတႃႇလီႇ. - Japanese, the canonical name for the code
ja, is wrong; it should be ၵျႃႇပၢၼ်ႇ. - The canonical name ၵျႃႇပၢၼ်ႇ (
ja) is missing. - The canonical name ၵျႃႇဝႃး (
jv) is missing. - Javanese, the canonical name for the code
jv, is wrong; it should be ၵျႃႇဝႃး. - Georgian, the canonical name for the code
ka, is wrong; it should be ၵျေႃႇၵျႃႇ. - The canonical name ၵျေႃႇၵျႃႇ (
ka) is missing. - Lü, the canonical name for the code
khb, is wrong; it should be လိုဝ်ႉ. - The canonical name လိုဝ်ႉ (
khb) is missing. - Khamti, the canonical name for the code
kht, is wrong; it should be ၶမ်းတီႈ. - The canonical name ၶမ်းတီႈ (
kht) is missing. - The canonical name ၶိုၼ် (
kkh) is missing. - Khün, the canonical name for the code
kkh, is wrong; it should be ၶိုၼ်. - The canonical name ၶမဵၼ် (
km) is missing. - Khmer, the canonical name for the code
km, is wrong; it should be ၶမဵၼ်. - The canonical name ၵၢဝ်းလီ (
ko) is missing. - Korean, the canonical name for the code
ko, is wrong; it should be ၵၢဝ်းလီ. - Latin, the canonical name for the code
la, is wrong; it should be လတိၼ်ႇ. - The canonical name လတိၼ်ႇ (
la) is missing. - Lao, the canonical name for the code
lo, is wrong; it should be လၢဝ်း. - The canonical name လၢဝ်း (
lo) is missing. - Middle Chinese, the canonical name for the code
ltc, is wrong; it should be ၶႄႇပွတ်းၵၢင်. - The canonical name ၶႄႇပွတ်းၵၢင် (
ltc) is missing. - The canonical name မၢဝ်းရီႇ (
mi) is missing. - Maori, the canonical name for the code
mi, is wrong; it should be မၢဝ်းရီႇ. - The canonical name မွၼ်း-ၶမဵၼ် ႁူဝ်တီး (
mkh-pro) is missing. - Proto-Mon-Khmer, the canonical name for the code
mkh-pro, is wrong; it should be မွၼ်း-ၶမဵၼ် ႁူဝ်တီး. - Mon, the canonical name for the code
mnw, is wrong; it should be မွၼ်း. - The canonical name မွၼ်း (
mnw) is missing. - The canonical name ထႆးမွၼ်း (
mnw-tha) is missing. - Thai Mon, the canonical name for the code
mnw-tha, is wrong; it should be ထႆးမွၼ်း. - The canonical name မၢၼ်ႈ (
my) is missing. - Burmese, the canonical name for the code
my, is wrong; it should be မၢၼ်ႈ. - Hokkien, the canonical name for the code
nan-hbl, is wrong; it should be ႁွၵ်ႉၵဵၼ်း. - The canonical name ႁွၵ်ႉၵဵၼ်း (
nan-hbl) is missing. - Nocte, the canonical name for the code
njb, is wrong; it should be Nocte Naga. - The canonical name Nocte Naga (
njb) is missing. - The canonical name တတ်ႉၶ်ျ (
nl) is missing. - Dutch, the canonical name for the code
nl, is wrong; it should be တတ်ႉၶ်ျ. - The canonical name လၢၼ်ႉၼႃး (
nod) is missing. - Northern Thai, the canonical name for the code
nod, is wrong; it should be လၢၼ်ႉၼႃး. - The canonical name Nathembo (
nte) is missing. - The canonical name ၶႄႇၵဝ်ႇ (
och) is missing. - Old Chinese, the canonical name for the code
och, is wrong; it should be ၶႄႇၵဝ်ႇ. - Old Khmer, the canonical name for the code
okz, is wrong; it should be ၶမဵၼ်ၵဝ်ႇ. - The canonical name ၶမဵၼ်ၵဝ်ႇ (
okz) is missing. - Old Mon, the canonical name for the code
omx, is wrong; it should be မွၼ်းၵဝ်ႇ. - The canonical name မွၼ်းၵဝ်ႇ (
omx) is missing. - The canonical name Old Ossetic (
oos) is missing. - The canonical name တူႇရၵီႇ ဢူဝ်ႇတူဝ်ႇမႅၼ်ႇ (
ota) is missing. - Ottoman Turkish, the canonical name for the code
ota, is wrong; it should be တူႇရၵီႇ ဢူဝ်ႇတူဝ်ႇမႅၼ်ႇ. - The canonical name တမီးလ်ၵဝ်ႇ (
oty) is missing. - Old Tamil, the canonical name for the code
oty, is wrong; it should be တမီးလ်ၵဝ်ႇ. - The canonical name Pyu (
pby) is missing. - Pyu (New Guinea), the canonical name for the code
pby, is wrong; it should be Pyu. - Phake, the canonical name for the code
phk, is wrong; it should be ၽႃၵေး. - The canonical name ၽႃၵေး (
phk) is missing. - The canonical name ပႃႇလိ (
pi) is missing. - Pali, the canonical name for the code
pi, is wrong; it should be ပႃႇလိ. - Pyu (Myanmar), the canonical name for the code
pyx, is wrong; it should be Tircul. - The canonical name Tircul (
pyx) is missing. - Russian, the canonical name for the code
ru, is wrong; it should be ရတ်ႈသျႃး. - The canonical name ရတ်ႈသျႃး (
ru) is missing. - The canonical name သၢၼ်းသၶရိတ်ႉ (
sa) is missing. - Sanskrit, the canonical name for the code
sa, is wrong; it should be သၢၼ်းသၶရိတ်ႉ. - The canonical name သီႇၼူဝ်ႇ-တိပႅတ်ႉ-ႁူဝ်တီး (
sit-pro) is missing. - Proto-Sino-Tibetan, the canonical name for the code
sit-pro, is wrong; it should be သီႇၼူဝ်ႇ-တိပႅတ်ႉ-ႁူဝ်တီး. - Tamil, the canonical name for the code
ta, is wrong; it should be တမီးလ်. - The canonical name တမီးလ် (
ta) is missing. - The canonical name တႆး-ႁူဝ်တီး (
tai-pro) is missing. - Proto-Tai, the canonical name for the code
tai-pro, is wrong; it should be တႆး-ႁူဝ်တီး. - The canonical name တႆးၸဵင်ႇၸၢၼ်းဝၼ်းတူၵ်း - ႁူဝ်တီး (
tai-swe-pro) is missing. - Proto-Southwestern Tai, the canonical name for the code
tai-swe-pro, is wrong; it should be တႆးၸဵင်ႇၸၢၼ်းဝၼ်းတူၵ်း - ႁူဝ်တီး. - The canonical name တႆးၼိူဝ် (
tdd) is missing. - Tai Nüa, the canonical name for the code
tdd, is wrong; it should be တႆးၼိူဝ်. - Thai, the canonical name for the code
th, is wrong; it should be ထႆး. - The canonical name ထႆး (
th) is missing. - The canonical name ဢူရတူ (
ur) is missing. - Urdu, the canonical name for the code
ur, is wrong; it should be ဢူရတူ. - The code
woyand the canonical name Weyto should be removed; they are not found in a submodule of Module:languages. - The code
xdqand the canonical name Kaitag should be removed; they are not found in a submodule of Module:languages. - Semigallian, the canonical name for the code
xzm, is wrong; it should be Zemgalian. - The canonical name Zemgalian (
xzm) is missing. - Yaghnobi, the canonical name for the code
yai, is wrong; it should be Yagnobi. - The canonical name Yagnobi (
yai) is missing. - The code
ynband the canonical name Yamben should be removed; they are not found in a submodule of Module:languages. - The canonical name ၸွင်ႈ (
za) is missing. - Zhuang, the canonical name for the code
za, is wrong; it should be ၸွင်ႈ. - The canonical name ၶႄႇ (
zh) is missing. - Chinese, the canonical name for the code
zh, is wrong; it should be ၶႄႇ.
- Arabic, the canonical name for the code
ar, is wrong; it should be ဢႃႇရၢပ်ႈ. - Baduy, the canonical name for the code
bac, is wrong; it should be Badui. - Bulgarian, the canonical name for the code
bg, is wrong; it should be ပူႇၵႃႇရီႇယႃႇ. - Tai Dam, the canonical name for the code
blt, is wrong; it should be တႆးလမ်. - Western Cham, the canonical name for the code
cja, is wrong; it should be ၸၢမ်ပွတ်းတူၵ်း. - Lutuv, the canonical name for the code
clt, is wrong; it should be Lautu Chin. - Khumi Chin, the canonical name for the code
cnk, is wrong; it should be ၶျၢင်းၶူမီး. - German, the canonical name for the code
de, is wrong; it should be ၵျႃႇမၼ်ႇ. - The code
dek(Dek) is missing. - English, the canonical name for the code
en, is wrong; it should be ဢိင်းၵလဵတ်ႈ. - Middle English, the canonical name for the code
enm, is wrong; it should be ဢိင်းၵလဵတ်ႈ ပွတ်းၵၢင်. - The code
ero(Horpa) is missing. - Finnish, the canonical name for the code
fi, is wrong; it should be ၾိၼ်ႇလႅၼ်ႇ. - French, the canonical name for the code
fr, is wrong; it should be ၾရၢင်ႇသဵတ်ႈ. - Ancient Greek, the canonical name for the code
grc, is wrong; it should be ၵရိတ်ႈမိူဝ်ႈၵွၼ်ႇ. - Manx, the canonical name for the code
gv, is wrong; it should be မႅၼ်ႉ. - Hebrew, the canonical name for the code
he, is wrong; it should be ႁီးပရူး. - Hindi, the canonical name for the code
hi, is wrong; it should be ႁိၼ်ႇတီႇ. - Hadoti, the canonical name for the code
hoj, is wrong; it should be Hadothi. - Italian, the canonical name for the code
it, is wrong; it should be ဢီႇတႃႇလီႇ. - Japanese, the canonical name for the code
ja, is wrong; it should be ၵျႃႇပၢၼ်ႇ. - Javanese, the canonical name for the code
jv, is wrong; it should be ၵျႃႇဝႃး. - Georgian, the canonical name for the code
ka, is wrong; it should be ၵျေႃႇၵျႃႇ. - Lü, the canonical name for the code
khb, is wrong; it should be လိုဝ်ႉ. - Khamti, the canonical name for the code
kht, is wrong; it should be ၶမ်းတီႈ. - Khün, the canonical name for the code
kkh, is wrong; it should be ၶိုၼ်. - Khmer, the canonical name for the code
km, is wrong; it should be ၶမဵၼ်. - Korean, the canonical name for the code
ko, is wrong; it should be ၵၢဝ်းလီ. - Latin, the canonical name for the code
la, is wrong; it should be လတိၼ်ႇ. - Lao, the canonical name for the code
lo, is wrong; it should be လၢဝ်း. - Middle Chinese, the canonical name for the code
ltc, is wrong; it should be ၶႄႇပွတ်းၵၢင်. - Maori, the canonical name for the code
mi, is wrong; it should be မၢဝ်းရီႇ. - Proto-Mon-Khmer, the canonical name for the code
mkh-pro, is wrong; it should be မွၼ်း-ၶမဵၼ် ႁူဝ်တီး. - Mon, the canonical name for the code
mnw, is wrong; it should be မွၼ်း. - Thai Mon, the canonical name for the code
mnw-tha, is wrong; it should be ထႆးမွၼ်း. - Burmese, the canonical name for the code
my, is wrong; it should be မၢၼ်ႈ. - Hokkien, the canonical name for the code
nan-hbl, is wrong; it should be ႁွၵ်ႉၵဵၼ်း. - Nocte, the canonical name for the code
njb, is wrong; it should be Nocte Naga. - Dutch, the canonical name for the code
nl, is wrong; it should be တတ်ႉၶ်ျ. - Northern Thai, the canonical name for the code
nod, is wrong; it should be လၢၼ်ႉၼႃး. - The code
nte(Nathembo) is missing. - Old Chinese, the canonical name for the code
och, is wrong; it should be ၶႄႇၵဝ်ႇ. - Old Khmer, the canonical name for the code
okz, is wrong; it should be ၶမဵၼ်ၵဝ်ႇ. - Old Mon, the canonical name for the code
omx, is wrong; it should be မွၼ်းၵဝ်ႇ. - The code
oos(Old Ossetic) is missing. - Ottoman Turkish, the canonical name for the code
ota, is wrong; it should be တူႇရၵီႇ ဢူဝ်ႇတူဝ်ႇမႅၼ်ႇ. - Old Tamil, the canonical name for the code
oty, is wrong; it should be တမီးလ်ၵဝ်ႇ. - Pyu (New Guinea), the canonical name for the code
pby, is wrong; it should be Pyu. - Phake, the canonical name for the code
phk, is wrong; it should be ၽႃၵေး. - Pali, the canonical name for the code
pi, is wrong; it should be ပႃႇလိ. - Pyu (Myanmar), the canonical name for the code
pyx, is wrong; it should be Tircul. - Russian, the canonical name for the code
ru, is wrong; it should be ရတ်ႈသျႃး. - Sanskrit, the canonical name for the code
sa, is wrong; it should be သၢၼ်းသၶရိတ်ႉ. - Shan, the canonical name for the code
shn, is wrong; it should be တႆး. - Proto-Sino-Tibetan, the canonical name for the code
sit-pro, is wrong; it should be သီႇၼူဝ်ႇ-တိပႅတ်ႉ-ႁူဝ်တီး. - Tamil, the canonical name for the code
ta, is wrong; it should be တမီးလ်. - Proto-Tai, the canonical name for the code
tai-pro, is wrong; it should be တႆး-ႁူဝ်တီး. - Proto-Southwestern Tai, the canonical name for the code
tai-swe-pro, is wrong; it should be တႆးၸဵင်ႇၸၢၼ်းဝၼ်းတူၵ်း - ႁူဝ်တီး. - Tai Nüa, the canonical name for the code
tdd, is wrong; it should be တႆးၼိူဝ်. - Thai, the canonical name for the code
th, is wrong; it should be ထႆး. - Urdu, the canonical name for the code
ur, is wrong; it should be ဢူရတူ. - The code
woyand the canonical name Weyto should be removed; they are not found in a submodule of Module:languages. - The code
xdqand the canonical name Kaitag should be removed; they are not found in a submodule of Module:languages. - Semigallian, the canonical name for the code
xzm, is wrong; it should be Zemgalian. - Yaghnobi, the canonical name for the code
yai, is wrong; it should be Yagnobi. - The code
ynband the canonical name Yamben should be removed; they are not found in a submodule of Module:languages. - Zhuang, the canonical name for the code
za, is wrong; it should be ၸွင်ႈ. - Chinese, the canonical name for the code
zh, is wrong; it should be ၶႄႇ.
- Norwegian Bokmål (
nb) has Middle Norwegian (gmq-mno) set as an ancestor, but is not in the West Scandinavian languages (gmq-wes). - Norwegian Bokmål (
nb) has Danish (da) set as an ancestor, but is not in the East Scandinavian languages (gmq-eas). - Ossetian (
os) is in the Sarmatian languages (xsc-sar) and has Old Ossetic (oos) set as an ancestor, but it is not possible to form an ancestral chain between them. - The
sort_keyfield in the data table for Tibetan (bo) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Dzongkha (dz) specifies the module Module:Tibt-sortkey, which does not exist. - The
translitfield in the data table for Tigrinya (ti) specifies the module Module:Ethi-translit, which does not exist. - The
translitfield in the data table for Chuvash (cv) specifies the module Module:cv-translit, which does not exist. - The
translitfield in the data table for Tibetan (bo) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Nuosu (ii) specifies the module Module:ii-translit, which does not exist. - The
translitfield in the data table for Telugu (te) specifies the module Module:te-translit, which exists, but does not contain the expected functiontr(). - The
translitfield in the data table for Amharic (am) specifies the module Module:Ethi-translit, which does not exist. - The
translitfield in the data table for Dzongkha (dz) specifies the module Module:Tibt-translit, which does not exist. - Tatar (
tt) has anoverride_translitvalue that is notnil,trueor a string:false
- Alorese (
aol) has its canonical name ("Alorese") repeated in the table ofaliases. - The
entry_namefield in the data table for Assyrian Neo-Aramaic (aii) specifies the module Module:Syrc-entryname, which exists, but does not contain the expected functionmakeEntryName(). - The
sort_keyfield in the data table for Hamer-Banna (amf) specifies the module Module:amf-utilities, which does not exist. - The
sort_keyfield in the data table for Adap (adp) specifies the module Module:Tibt-sortkey, which does not exist. - The
translitfield in the data table for Archi (aqc) specifies the module Module:cau-nec-translit, which does not exist. - The
translitfield in the data table for Ahirani (ahr) specifies the module Module:mr-translit, which does not exist. - The
translitfield in the data table for Northern Altai (atv) specifies the module Module:Altai-translit, which does not exist. - The
translitfield in the data table for Aghul (agx) specifies the module Module:cau-nec-translit, which does not exist. - The
translitfield in the data table for Southern Altai (alt) specifies the module Module:Altai-translit, which does not exist. - The
translitfield in the data table for Andi (ani) specifies the module Module:cau-nec-translit, which does not exist. - The
translitfield in the data table for Akhvakh (akv) specifies the module Module:cau-nec-translit, which does not exist. - The
translitfield in the data table for Adap (adp) specifies the module Module:Tibt-translit, which does not exist.
- The
translitfield in the data table for Botlikh (bph) specifies the module Module:cau-nec-translit, which does not exist. - The
translitfield in the data table for Budukh (bdk) specifies the module Module:cau-nec-translit, which does not exist.
- Tsucuba (
cbq) has its canonical name ("Tsucuba") repeated in the table ofotherNames. - Cafundó (
ccd) has Portuguese (pt) set as an ancestor, but is not in the Galician-Portuguese languages (roa-gap). - Tîrî (
cir) has its canonical name ("Tîrî") repeated in the table ofotherNames. - Puxian Min (
cpx) has its canonical name ("Puxian Min") repeated in the table ofotherNames. - The
entry_namefield in the data table for Chaldean Neo-Aramaic (cld) specifies the module Module:Syrc-entryname, which exists, but does not contain the expected functionmakeEntryName(). - The
sort_keyfield in the data table for Changthang (cna) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Chocangaca (cgk) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Coptic (cop) specifies the module Module:cop-sortkey, which does not exist. - The
translitfield in the data table for Chocangaca (cgk) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Central Kurdish (ckb) specifies the module Module:ckb-translit, which does not exist. - The
translitfield in the data table for Chamalal (cji) specifies the module Module:cau-nec-translit, which does not exist. - The
translitfield in the data table for Changthang (cna) specifies the module Module:Tibt-translit, which does not exist.
- The code
chmis not found in Module:languages/data/3/c, and should be removed from Module:languages/data/3/c/extra. - Northern Pinghua (
cnp) has data in Module:languages/data/3/c, but does not have corresponding data in Module:languages/data/3/c/extra. - Southern Pinghua (
csp) has data in Module:languages/data/3/c, but does not have corresponding data in Module:languages/data/3/c/extra.
- Minderico (
drc) has Portuguese (pt) set as an ancestor, but is not in the Galician-Portuguese languages (roa-gap). - The
sort_keyfield in the data table for Dzala (dzl) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Dakpa (dka) specifies the module Module:Tibt-sortkey, which does not exist. - The
translitfield in the data table for Dakpa (dka) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Tsez (ddo) specifies the module Module:ddo-translit, which does not exist. - The
translitfield in the data table for Dahalik (dlk) specifies the module Module:Ethi-translit, which does not exist. - The
translitfield in the data table for Dzala (dzl) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Doteli (dty) specifies the module Module:ne-translit, which does not exist.
- The
translitfield in the data table for Evenki (evn) specifies the module Module:evn-translit, which does not exist. - The
translitfield in the data table for Etruscan (ett) specifies the module Module:Ital-translit, which does not exist.
- Fala (
fax) has Old Galician-Portuguese (roa-opt) set as an ancestor, but is not in the Galician-Portuguese languages (roa-gap).
- The
sort_keyfield in the data table for Kutang Ghale (ght) specifies the module Module:Tibt-sortkey, which does not exist. - The
translitfield in the data table for Mycenaean Greek (gmy) specifies the module Module:Linb-translit, which does not exist. - The
translitfield in the data table for Nanai (gld) specifies the module Module:gld-translit, which does not exist. - The
translitfield in the data table for Ge'ez (gez) specifies the module Module:Ethi-translit, which does not exist. - The
translitfield in the data table for Kutang Ghale (ght) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Hinukh (gin) specifies the module Module:gin-translit, which does not exist.
- Caribbean Hindustani (
hns) has Bhojpuri (bho) set as an ancestor, but is not in the Bihari languages (inc-bih). - Caribbean Hindustani (
hns) has Awadhi (awa) set as an ancestor, but is not in the Eastern Hindi languages (inc-hie). - The
translitfield in the data table for Gurani (hac) specifies the module Module:ckb-translit, which does not exist. - The
translitfield in the data table for Hunzib (huz) specifies the module Module:huz-translit, which does not exist. - The
translitfield in the data table for Harari (har) specifies the module Module:Ethi-translit, which does not exist.
- The
translitfield in the data table for Minaean (inm) specifies the module Module:Sarb-translit, which does not exist.
- The
translitfield in the data table for Jeju (jje) specifies the module Module:jje-translit, which does not exist. - The
translitfield in the data table for Judeo-Tat (jdt) specifies the module Module:jdt-translit, which does not exist.
- The name တႆးလိုဝ်ႉ is found twice or more in the list of
aliasesfor လိုဝ်ႉ (khb). - The name တႆးလိုဝ်ႉ is found twice or more in the list of
aliasesfor လိုဝ်ႉ (khb). - လိုဝ်ႉ (
khb) has its canonical name ("လိုဝ်ႉ") repeated in the table ofaliases. - The
sort_keyfield in the data table for Bumthangkha (kjz) specifies the module Module:Tibt-sortkey, which does not exist. - The
translitfield in the data table for Eastern Pwo (kjp) specifies the module Module:kjp-translit, which does not exist. - The
translitfield in the data table for Khvarshi (khv) specifies the module Module:khv-translit, which does not exist. - The
translitfield in the data table for Kuvi (kxv) specifies the module Module:kxv-translit, which does not exist. - The
translitfield in the data table for Kui (India) (kxu) specifies the module Module:kxv-translit, which does not exist. - The
translitfield in the data table for Karachay-Balkar (krc) specifies the module Module:krc-translit, which does not exist. - The
translitfield in the data table for Komi-Permyak (koi) specifies the module Module:kv-translit, which does not exist. - The
translitfield in the data table for Bagvalal (kva) specifies the module Module:cau-nec-translit, which does not exist. - The
translitfield in the data table for Karata (kpt) specifies the module Module:kpt-translit, which does not exist. - The
translitfield in the data table for Khinalug (kjj) specifies the module Module:kjj-translit, which does not exist. - The
translitfield in the data table for Bezhta (kap) specifies the module Module:cau-nec-translit, which does not exist. - The
translitfield in the data table for Khakas (kjh) specifies the module Module:kjh-translit, which does not exist. - The
translitfield in the data table for Old Javanese (kaw) specifies the module Module:jv-translit, which does not exist. - The
translitfield in the data table for Koryak (kpy) specifies the module Module:kpy-translit, which does not exist. - The
translitfield in the data table for Bumthangkha (kjz) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Kumyk (kum) specifies the module Module:kum-translit, which does not exist. - The
translitfield in the data table for Korra Koraga (kfd) specifies the module Module:kn-translit, which does not exist. - The
translitfield in the data table for Komi-Zyrian (kpv) specifies the module Module:kv-translit, which does not exist.
- The
sort_keyfield in the data table for Layakha (lya) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Laboya (lmy) specifies the module Module:lmy-sortkey, which does not exist. - The
sort_keyfield in the data table for Lunanakha (luk) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Lak (lbe) specifies the module Module:lbe-sortkey, which does not exist. - The
sort_keyfield in the data table for Ladakhi (lbj) specifies the module Module:Tibt-sortkey, which does not exist. - The
translitfield in the data table for Ladakhi (lbj) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Lunanakha (luk) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Laki (lki) specifies the module Module:lki-translit, which does not exist. - The
translitfield in the data table for Lezgi (lez) specifies the module Module:lez-translit, which does not exist. - The
translitfield in the data table for Lak (lbe) specifies the module Module:lbe-translit, which does not exist. - The
translitfield in the data table for Layakha (lya) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Limbu (lif) specifies the module Module:lif-translit, which does not exist. - The
translitfield in the data table for Lepcha (lep) specifies the module Module:lep-translit, which does not exist.
- The
sort_keyfield in the data table for Middle Irish (mga) specifies the module Module:mga-sortkey, which does not exist. - The
sort_keyfield in the data table for Moksha (mdf) specifies the module Module:mdf-sortkey, which does not exist. - The
sort_keyfield in the data table for Western Mari (mrj) specifies the module Module:mrj-sortkey, which does not exist. - The
translitfield in the data table for Western Mari (mrj) specifies the module Module:chm-translit, which does not exist. - The
translitfield in the data table for Manchu (mnc) specifies the module Module:mnc-translit, which does not exist. - The
translitfield in the data table for Moksha (mdf) specifies the module Module:mdf-translit, which does not exist. - The
translitfield in the data table for Manda (India) (mha) specifies the module Module:kxv-translit, which does not exist. - The
translitfield in the data table for Eastern Mari (mhr) specifies the module Module:chm-translit, which does not exist. - The
translitfield in the data table for Mozarabic (mxi) specifies the module Module:mxi-translit, which does not exist.
- The
sort_keyfield in the data table for Nupe (nup) specifies the module Module:nup-sortkey, which does not exist. - The
sort_keyfield in the data table for Nivkh (niv) specifies the module Module:niv-sortkey, which does not exist. - The
translitfield in the data table for Naskapi (nsk) specifies the module Module:nsk-translit, which does not exist. - The
translitfield in the data table for Nogai (nog) specifies the module Module:nog-translit, which does not exist. - The
translitfield in the data table for North Picene (nrp) specifies the module Module:Ital-translit, which does not exist. - The
translitfield in the data table for Nivkh (niv) specifies the module Module:niv-translit, which does not exist. - The
translitfield in the data table for Nganasan (nio) specifies the module Module:nio-translit, which does not exist.
- Old Dutch (
odt) has the ancestor Frankish (frk) listed in its ancestor field, which is redundant, since it is determined to be ancestral automatically. - Old Ossetic (
oos) lists the invalid language code"os-pro"as its ancestor. - The
sort_keyfield in the data table for Old Nubian (onw) specifies the module Module:cop-sortkey, which does not exist. - The
sort_keyfield in the data table for Old Tibetan (otb) specifies the module Module:Tibt-sortkey, which does not exist. - The
translitfield in the data table for Old Turkic (otk) specifies the module Module:Orkh-translit, which does not exist. - The
translitfield in the data table for Orok (oaa) specifies the module Module:oaa-translit, which does not exist. - The
translitfield in the data table for Old Tibetan (otb) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Middle Korean (okm) specifies the module Module:okm-translit, which does not exist. - The
translitfield in the data table for Moabite (obm) specifies the module Module:Phnx-translit, which does not exist. - The
translitfield in the data table for Old Manipuri (omp) specifies the module Module:Mtei-translit, which does not exist. - The
translitfield in the data table for Omok (omk) specifies the module Module:omk-translit, which does not exist.
- The
translitfield in the data table for Pengo (peg) specifies the module Module:kxv-translit, which does not exist. - The
translitfield in the data table for Old Persian (peo) specifies the module Module:peo-translit, which does not exist. - The
translitfield in the data table for Phoenician (phn) specifies the module Module:Phnx-translit, which does not exist. - The
translitfield in the data table for Primitive Irish (pgl) specifies the module Module:pgl-translit, which does not exist. - The
translitfield in the data table for Gandhari (pgd) specifies the module Module:Khar-translit, which does not exist.
- Rajbanshi (
rjs) has the invalid family code"inc-krn". - Kamta (
rkt) has the invalid family code"inc-krn". - The
sort_keyfield in the data table for Carpathian Rusyn (rue) specifies the module Module:rue-sortkey, which does not exist. - The
translitfield in the data table for Carpathian Rusyn (rue) specifies the module Module:rue-translit, which does not exist. - The
translitfield in the data table for Pannonian Rusyn (rsk) specifies the module Module:rsk-translit, which does not exist.
- The
sort_keyfield in the data table for Inari Sami (smn) specifies the module Module:smn-sortkey, which does not exist. - The
sort_keyfield in the data table for Brokpake (sgt) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Ume Sami (sju) specifies the module Module:sju-sortkey, which does not exist. - The
sort_keyfield in the data table for Maore Comorian (swb) specifies the module Module:bnt-com-sortkey, which does not exist. - The
sort_keyfield in the data table for Pite Sami (sje) specifies the module Module:sje-sortkey, which does not exist. - The
sort_keyfield in the data table for Skolt Sami (sms) specifies the module Module:sms-sortkey, which does not exist. - The
sort_keyfield in the data table for Lule Sami (smj) specifies the module Module:smj-sortkey, which does not exist. - The
sort_keyfield in the data table for Old Irish (sga) specifies the module Module:sga-sortkey, which does not exist. - The
sort_keyfield in the data table for Sikkimese (sip) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Southern Sami (sma) specifies the module Module:sma-sortkey, which does not exist. - The
translitfield in the data table for Samaritan Aramaic (sam) specifies the module Module:Samr-translit, which does not exist. - The
translitfield in the data table for Sholaga (sle) specifies the module Module:kn-translit, which does not exist. - The
translitfield in the data table for Akkala Sami (sia) specifies the module Module:sia-translit, which does not exist. - The
translitfield in the data table for Kildin Sami (sjd) specifies the module Module:sjd-translit, which does not exist. - The
translitfield in the data table for Ter Sami (sjt) specifies the module Module:sjt-translit, which does not exist. - The
translitfield in the data table for Saurashtra (saz) specifies the module Module:saz-translit, which does not exist. - The
translitfield in the data table for Tachawit (shy) specifies the module Module:Tfng-translit, which does not exist. - The
translitfield in the data table for Southern Kurdish (sdh) specifies the module Module:sdh-translit, which does not exist. - The
translitfield in the data table for Shughni (sgh) specifies the module Module:sgh-translit, which does not exist. - The
translitfield in the data table for Svan (sva) specifies the module Module:sva-translit, which does not exist. - The
translitfield in the data table for Samaritan Hebrew (smp) specifies the module Module:Samr-translit, which does not exist. - The
translitfield in the data table for Yakut (sah) specifies the module Module:sah-translit, which does not exist. - The
translitfield in the data table for Brokpake (sgt) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Sikkimese (sip) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Santali (sat) specifies the module Module:Olck-translit, which does not exist.
- The
sort_keyfield in the data table for Tuvan (tyv) specifies the module Module:tyv-sortkey, which does not exist. - The
sort_keyfield in the data table for Tawang Monpa (twm) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Talossan (tzl) specifies the module Module:tzl-sortkey, which does not exist. - The
translitfield in the data table for Tawang Monpa (twm) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Tangut (txg) specifies the module Module:txg-translit, which does not exist. - The
translitfield in the data table for Tuvan (tyv) specifies the module Module:tyv-translit, which does not exist. - The
translitfield in the data table for Tsakhur (tkr) specifies the module Module:tkr-translit, which does not exist. - The
translitfield in the data table for Tigre (tig) specifies the module Module:Ethi-translit, which does not exist.
- The
sort_keyfield in the data table for Ubykh (uby) specifies the module Module:uby-sortkey, which does not exist. - The
sort_keyfield in the data table for Udmurt (udm) specifies the module Module:udm-sortkey, which does not exist. - The
sort_keyfield in the data table for Ulch (ulc) specifies the module Module:ulc-sortkey, which does not exist. - The
translitfield in the data table for Ubykh (uby) specifies the module Module:uby-translit, which does not exist. - The
translitfield in the data table for Udmurt (udm) specifies the module Module:udm-translit, which does not exist.
- The
sort_keyfield in the data table for East Franconian (vmf) specifies the module Module:vmf-sortkey, which does not exist. - The
translitfield in the data table for Vai (vai) specifies the module Module:Vaii-translit, which does not exist.
- The
sort_keyfield in the data table for Ndzwani Comorian (wni) specifies the module Module:bnt-com-sortkey, which does not exist. - The
sort_keyfield in the data table for Mwali Comorian (wlc) specifies the module Module:bnt-com-sortkey, which does not exist. - The
sort_keyfield in the data table for Middle Welsh (wlm) specifies the module Module:wlm-sortkey, which does not exist.
- The
sort_keyfield in the data table for Khengkha (xkf) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Kalmyk (xal) specifies the module Module:xal-sortkey, which does not exist. - The
translitfield in the data table for Jennu Kurumba (xuj) specifies the module Module:kn-translit, which does not exist. - The
translitfield in the data table for Lepontic (xlp) specifies the module Module:Ital-translit, which does not exist. - The
translitfield in the data table for Harami (xha) specifies the module Module:Sarb-translit, which does not exist. - The
translitfield in the data table for Umbrian (xum) specifies the module Module:Ital-translit, which does not exist. - The
translitfield in the data table for Lydian (xld) specifies the module Module:Lydi-translit, which does not exist. - The
translitfield in the data table for Raetic (xrr) specifies the module Module:Ital-translit, which does not exist. - The
translitfield in the data table for Kalmyk (xal) specifies the module Module:xal-translit, which does not exist. - The
translitfield in the data table for Ancient North Arabian (xna) specifies the module Module:Narb-translit, which does not exist. - The
translitfield in the data table for Lemnian (xle) specifies the module Module:Ital-translit, which does not exist. - The
translitfield in the data table for Khengkha (xkf) specifies the module Module:Tibt-translit, which does not exist. - The
translitfield in the data table for Kamassian (xas) specifies the module Module:xas-translit, which does not exist. - The
translitfield in the data table for Hadrami (xhd) specifies the module Module:Sarb-translit, which does not exist. - The
translitfield in the data table for Alu Kurumba (xua) specifies the module Module:kn-translit, which does not exist. - The
translitfield in the data table for Chuvan (xcv) specifies the module Module:xcv-translit, which does not exist. - The
translitfield in the data table for Sabaean (xsa) specifies the module Module:Sarb-translit, which does not exist. - The
translitfield in the data table for Written Oirat (xwo) specifies the module Module:xwo-translit, which does not exist. - The
translitfield in the data table for Aghwan (xag) specifies the module Module:Aghb-translit, which does not exist. - The
translitfield in the data table for Qatabanian (xqt) specifies the module Module:Sarb-translit, which does not exist. - The
translitfield in the data table for Lycian (xlc) specifies the module Module:Lyci-translit, which does not exist. - The
translitfield in the data table for Venetic (xve) specifies the module Module:Ital-translit, which does not exist. - The
translitfield in the data table for Bactrian (xbc) specifies the module Module:xbc-translit, which does not exist. - The
translitfield in the data table for Meroitic (xmr) specifies the module Module:xmr-translit, which does not exist. - The
translitfield in the data table for Edomite (xdm) specifies the module Module:Phnx-translit, which does not exist. - The
translitfield in the data table for Faliscan (xfa) specifies the module Module:Ital-translit, which does not exist. - The
translitfield in the data table for Camunic (xcc) specifies the module Module:Ital-translit, which does not exist. - Alanic (
xln) has Proto-Sarmatian (xsc-sar-pro) set as an ancestor, but is not in the Sarmatian languages (xsc-sar). - Pumpokol (
xpm) has the invalid family code"qfa-yso". - Arin (
xrn) has the invalid family code"qfa-yso". - Assan (
xss) has the invalid family code"qfa-yso".
- The
translitfield in the data table for Northern Yukaghir (ykg) specifies the module Module:ykg-translit, which does not exist. - The
translitfield in the data table for Yamphu (ybi) specifies the module Module:ybi-translit, which does not exist. - The
translitfield in the data table for Sirenik (ysr) specifies the module Module:ysr-translit, which does not exist. - The
translitfield in the data table for Tundra Nenets (yrk) specifies the module Module:yrk-translit, which does not exist. - The
translitfield in the data table for Yazghulami (yah) specifies the module Module:yah-translit, which does not exist. - The
translitfield in the data table for Southern Yukaghir (yux) specifies the module Module:yux-translit, which does not exist. - Jassic (
ysc) is in the Scythian languages (xsc) and has Old Ossetic (oos) set as an ancestor, but it is not possible to form an ancestral chain between them. - Yug (
yug) has the invalid family code"qfa-yno".
- The
sort_keyfield in the data table for Zangskari (zau) specifies the module Module:Tibt-sortkey, which does not exist. - The
sort_keyfield in the data table for Zazaki (zza) specifies the module Module:zza-sortkey, which does not exist. - The
sort_keyfield in the data table for Ngazidja Comorian (zdj) specifies the module Module:bnt-com-sortkey, which does not exist. - The
translitfield in the data table for Moroccan Amazigh (zgh) specifies the module Module:Tfng-translit, which does not exist. - The
translitfield in the data table for Zangskari (zau) specifies the module Module:Tibt-translit, which does not exist. - Kott (
zko) has the invalid family code"qfa-yso".
- Proto-Austroasiatic (
aav-pro) does not have the expected name "Proto-ဢေႃႇသထရူဝ်ႇဢေးသျႃးတိၵ်ႉ", even though it is the proto-language of the ဢေႃႇသထရူဝ်ႇဢေးသျႃးတိၵ်ႉ languages (aav). - Proto-Central Togo (
alv-gtm-pro) does not have the expected name "Proto-Ghana-Togo Mountain", even though it is the proto-language of the Ghana-Togo Mountain languages (alv-gtm). - Proto-Arawa (
auf-pro) does not have the expected name "Proto-Arauan", even though it is the proto-language of the Arauan languages (auf). - Proto-Amuesha-Chamicuro (
awd-amc-pro) has a proto-language code associated with the invalid code"awd-amc". - Proto-Kampa (
awd-kmp-pro) has a proto-language code associated with the invalid code"awd-kmp". - Proto-Paresi-Waura (
awd-prw-pro) has a proto-language code associated with the invalid code"awd-prw". - Proto-Rukai (
dru-pro) has a proto-language code associated with Rukai (dru), which is not a family. - Proto-Basque (
euq-pro) does not have the expected name "Proto-Vasconic", even though it is the proto-language of the Vasconic languages (euq). - Proto-Norse (
gmq-pro) does not have the expected name "Proto-North Germanic", even though it is the proto-language of the North Germanic languages (gmq). - Proto-Kamta (
inc-krd-pro) does not have the expected name "Proto-KRDS lects", even though it is the proto-language of the KRDS lects (inc-krd). - မွၼ်း-ၶမဵၼ် ႁူဝ်တီး (
mkh-pro) does not have the expected name "Proto-မွၼ်း-ၶမဵၼ်", even though it is the proto-language of the မွၼ်း-ၶမဵၼ် languages (mkh). - Proto-Chumash (
nai-chu-pro) does not have the expected name "Proto-Chumashan", even though it is the proto-language of the Chumashan languages (nai-chu). - Proto-Maidun (
nai-mdu-pro) does not have the expected name "Proto-Maiduan", even though it is the proto-language of the Maiduan languages (nai-mdu). - Proto-Mixe-Zoque (
nai-miz-pro) does not have the expected name "Proto-Mixe-Zoquean", even though it is the proto-language of the Mixe-Zoquean languages (nai-miz). - Proto-Pomo (
nai-pom-pro) does not have the expected name "Proto-Pomoan", even though it is the proto-language of the Pomoan languages (nai-pom). - Proto-Mazatec (
omq-maz-pro) does not have the expected name "Proto-Mazatecan", even though it is the proto-language of the Mazatecan languages (omq-maz). - Proto-North Sarawak (
poz-swa-pro) does not have the expected name "Proto-North Sarawakan", even though it is the proto-language of the North Sarawakan languages (poz-swa). - Proto-Salish (
sal-pro) does not have the expected name "Proto-Salishan", even though it is the proto-language of the Salishan languages (sal). - Proto-Puroik (
sit-khp-pro) has a proto-language code associated with the invalid code"sit-khp". - Proto-Northern Naga (
sit-kon-pro) does not have the expected name "Proto-Konyak", even though it is the proto-language of the Konyak languages (sit-kon). - သီႇၼူဝ်ႇ-တိပႅတ်ႉ-ႁူဝ်တီး (
sit-pro) does not have the expected name "Proto-Sino-Tibetan", even though it is the proto-language of the Sino-Tibetan languages (sit). - Proto-Samic (
smi-pro) does not have the expected name "Proto-Sami", even though it is the proto-language of the Sami languages (smi). - The
sort_keyfield in the data table for Proto-Celtic (cel-pro) specifies the module Module:cel-pro-sortkey, which does not exist. - The
sort_keyfield in the data table for Proto-West Germanic (gmw-pro) specifies the module Module:gmw-pro-sortkey, which does not exist. - The
sort_keyfield in the data table for Proto-Bantu (bnt-pro) specifies the module Module:bnt-pro-sortkey, which does not exist. - The
sort_keyfield in the data table for Proto-Germanic (gem-pro) specifies the module Module:gem-pro-sortkey, which does not exist. - တႆး-ႁူဝ်တီး (
tai-pro) does not have the expected name "Proto-Tai", even though it is the proto-language of the Tai languages (tai). - တႆးၸဵင်ႇၸၢၼ်းဝၼ်းတူၵ်း - ႁူဝ်တီး (
tai-swe-pro) does not have the expected name "Proto-Southwestern Tai", even though it is the proto-language of the Southwestern Tai languages (tai-swe). - The
translitfield in the data table for Chaha (sem-cha) specifies the module Module:Ethi-translit, which does not exist. - The
translitfield in the data table for Northern Mansi (mns-nor) specifies the module Module:mns-translit, which does not exist. - The
translitfield in the data table for Central Mansi (mns-cen) specifies the module Module:mns-translit, which does not exist. - The
translitfield in the data table for Northern Khanty (kca-nor) specifies the module Module:kca-translit, which does not exist. - The
translitfield in the data table for Old Kannada (dra-okn) specifies the module Module:kn-translit, which does not exist. - The
translitfield in the data table for Safaitic (sem-saf) specifies the module Module:Narb-translit, which does not exist. - The
translitfield in the data table for Southern Mansi (mns-sou) specifies the module Module:mns-translit, which does not exist. - The
translitfield in the data table for Middle Kannada (dra-mkn) specifies the module Module:kn-translit, which does not exist. - The
translitfield in the data table for Dumaitic (sem-dum) specifies the module Module:Narb-translit, which does not exist. - The
translitfield in the data table for Hasaitic (sem-has) specifies the module Module:Narb-translit, which does not exist. - The
translitfield in the data table for Northern Selkup (sel-nor) specifies the module Module:sel-nor-translit, which does not exist. - The
translitfield in the data table for Old South Arabian (sem-srb) specifies the module Module:Sarb-translit, which does not exist. - The
translitfield in the data table for Middle Bengali (inc-mbn) specifies the module Module:inc-mbn-translit, which does not exist. - The
translitfield in the data table for Thamudic (sem-tha) specifies the module Module:Narb-translit, which does not exist. - The
translitfield in the data table for Proto-Norse (gmq-pro) specifies the module Module:Runr-translit, which does not exist. - The
translitfield in the data table for Ammonite (sem-amm) specifies the module Module:Phnx-translit, which does not exist. - The
translitfield in the data table for Southern Khanty (kca-sou) specifies the module Module:kca-translit, which does not exist. - The
translitfield in the data table for Taymanitic (sem-tay) specifies the module Module:Narb-translit, which does not exist. - The
translitfield in the data table for Southern Selkup (sel-sou) specifies the module Module:sel-sou-translit, which does not exist. - The
translitfield in the data table for Middle Assamese (inc-mas) specifies the module Module:inc-mas-translit, which does not exist. - The
translitfield in the data table for Hismaic (sem-his) specifies the module Module:Narb-translit, which does not exist. - The
translitfield in the data table for Dadanitic (sem-dad) specifies the module Module:Narb-translit, which does not exist. - The
translitfield in the data table for Eastern Khanty (kca-eas) specifies the module Module:kca-translit, which does not exist. - The
translitfield in the data table for Komi-Yazva (urj-kya) specifies the module Module:kv-translit, which does not exist. - The
translitfield in the data table for Forest Nenets (syd-fne) specifies the module Module:syd-fne-translit, which does not exist. - The
translitfield in the data table for Old Telugu (dra-ote) specifies the module Module:te-translit, which exists, but does not contain the expected functiontr(). - The
translitfield in the data table for Early Modern Korean (ko-ear) specifies the module Module:okm-translit, which does not exist. - The
translitfield in the data table for Niya Prakrit (pra-niy) specifies the module Module:Khar-translit, which does not exist. - The
translitfield in the data table for Early Assamese (inc-oas) specifies the module Module:inc-oas-translit, which does not exist. - The
translitfield in the data table for Old Komi (urj-koo) specifies the module Module:urj-koo-translit, which does not exist. - Proto-Saka (
xsc-sak-pro) does not have the expected name "Proto-Sakan", even though it is the proto-language of the Sakan languages (xsc-sak).
apcis set as an ISO 639-3 code on multiple items:Q56593လႄႈQ22809485.kjvis set as an ISO 639-3 code on multiple items:Q838165လႄႈQ31199873.msnis set as an ISO 639-3 code on multiple items:Q3331111လႄႈQ3563857.tttis set as an ISO 639-3 code on multiple items:Q56489လႄႈQ123964178.
- The canonical name Ahom script (
Ahom) is missing. - ဢႃႇႁူမ်ႇ, the canonical name for the code
Ahom, is wrong; it should be Ahom. - The canonical name တႆးထမ်း script (
Lana) is missing. - Tai Tham, the canonical name for the code
Lana, is wrong; it should be တႆးထမ်း. - The canonical name လၢဝ်း script (
Laoo) is missing. - Lao, the canonical name for the code
Laoo, is wrong; it should be လၢဝ်း. - The canonical name လႅတ်ႉတိၼ်ႇ script (
Latn) is missing. - Burmese, the canonical name for the code
Mymr, is wrong; it should be မၢၼ်ႈ. - The canonical name မၢၼ်ႈ script (
Mymr) is missing. - The canonical name တႆးၼိူဝ် script (
Tale) is missing. - Tai Nüa, the canonical name for the code
Tale, is wrong; it should be တႆးၼိူဝ်. - The canonical name တႆးလိုဝ်ႉ script (
Talu) is missing. - New Tai Lue, the canonical name for the code
Talu, is wrong; it should be တႆးလိုဝ်ႉ. - Tamil, the canonical name for the code
Taml, is wrong; it should be တမီးလ်. - The canonical name တမီးလ် script (
Taml) is missing. - The canonical name တႆးဝႅတ်ႉ script (
Tavt) is missing. - Tai Viet, the canonical name for the code
Tavt, is wrong; it should be တႆးဝႅတ်ႉ. - Thai, the canonical name for the code
Thai, is wrong; it should be ထႆး. - The canonical name ထႆး script (
Thai) is missing.
- ဢႃႇႁူမ်ႇ, the canonical name for the code
Ahom, is wrong; it should be Ahom. - Tai Tham, the canonical name for the code
Lana, is wrong; it should be တႆးထမ်း. - Lao, the canonical name for the code
Laoo, is wrong; it should be လၢဝ်း. - Burmese, the canonical name for the code
Mymr, is wrong; it should be မၢၼ်ႈ. - Tai Nüa, the canonical name for the code
Tale, is wrong; it should be တႆးၼိူဝ်. - New Tai Lue, the canonical name for the code
Talu, is wrong; it should be တႆးလိုဝ်ႉ. - Tamil, the canonical name for the code
Taml, is wrong; it should be တမီးလ်. - Tai Viet, the canonical name for the code
Tavt, is wrong; it should be တႆးဝႅတ်ႉ. - Thai, the canonical name for the code
Thai, is wrong; it should be ထႆး.
- Blissymbolic 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. - Hiragana script (
Hira) is not used by any language. - Kana script (
Hrkt) is not used by any language. - Image-rendered script (
Image) is not used by any language and has no characters listed for auto-detection. - International Phonetic Alphabet (
Ipach) is not used by any language and has no characters listed for auto-detection. - Kulitan script (
Kulit) 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 (
Music) is not used by any language. - unspecified script (
None) is not used by any language and has no characters listed for auto-detection. - Proto-Cuneiform script (
Pcun) is not used by any language and has no characters listed for auto-detection. - Proto-Elamite script (
Pelm) is not used by any language and has no characters listed for auto-detection. - Proto-Sinaitic script (
Psin) 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 (
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. - mathematical notation (
Zmth) is not used by any language. - symbolic 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 codes
fa-Arab,ug-Arab,ks-Arab,ps-Arab,ur-Arab,ku-Arab,tt-Arab,ota-Arab,mzn-Arabandsd-Arabare currently alias codes. Only one code should be used in the data. - The codes
ms-Arabandkk-Arabare currently alias codes. Only one code should be used in the data.
Checks performed
[မႄးထတ်း]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
Qand 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
2is notnil, it must a valid Wikidata item ID. - If field
3orfamilyis given and notnil, it must be a valid family code. - If field
4orscriptsis given and notnil, it must be an array, and each string in the array must be a valid script code. - If
ancestorsis given, it must be an array, and each string in the array must be a valid language or etymology language code. - If
familyis given, it must be a valid family code. - If
typeis given, it must be one of the recognised values (regular,reconstructed,appendix-constructed). - If
entry_nameis given, it must be a table that contains either two arrays (fromandto) or a string (remove_diacritics) or both. - If
sort_keyis given, it may either be a string, or at table that in turn contains either two arrays (fromandto) or a string (remove_diacritics). - If
entry_nameorsort_keyis given, thefromarray must be longer or equal in length to thetoarray. - If
standardCharsis 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_translitis set,translitmust also be set, because there must be a transliteration module that can override manual transliteration. - If
link_tris 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
translitis present, it should be the name of a module, and this module should contain atrfunction that takes a pagename (and optionally a language code and script code) as arguments. - If
sort_keyis a string, it should be the name of a module, and this module should contain amakeSortKeyfunction that takes a pagename (and optionally a language code and script code) as arguments. - If
entry_nameorsort_keyis 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:
canonicalNamemust be given.parentmust be given must be a valid language, family or etymology-only language code.- If
ancestorsis 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
familyis 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
characterspattern for script autodetection, and this must form a valid Lua string pattern when placed between square brackets ("[...]"). (It should match all characters in the script, but that cannot be tested.) - Have no data keys besides these:
"canonicalName", "otherNames", "parent", "systems", "wikipedia_article", "characters", "direction".
-- TODO:
-- ietf_subtag field used with a 2/3-letter langauge/family code except qaa-qtz, or a 4-letter script code.
-- Check against files containing up-to-date ISO data, to cross-check validity.
local export = {}
local mw = mw
local require = require
local string = string
local Array = require("Module:array")
local m_en_utilities = require("Module:en-utilities")
local m_etym_languages_canonical_names = require("Module:etymology languages/canonical names")
local m_etym_languages_codes = require("Module:etymology languages/code to canonical name")
local m_etym_languages_data = require("Module:etymology languages/data")
local m_families = require("Module:families")
local m_families_canonical_names = require("Module:families/canonical names")
local m_families_codes = require("Module:families/code to canonical name")
local m_families_data = require("Module:families/data")
local m_languages = require("Module:languages")
local m_languages_canonical_names = require("Module:languages/canonical names")
local m_languages_codes = require("Module:languages/code to canonical name")
local m_languages_data_all = require("Module:languages/data/all")
local m_load = require("Module:load")
local m_scripts = require("Module:scripts")
local m_scripts_canonical_names = require("Module:scripts/canonical names")
local m_scripts_codes = require("Module:scripts/code to canonical name")
local m_scripts_data = require("Module:scripts/data")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local add_indefinite_article = m_en_utilities.add_indefinite_article
local codepoint = m_str_utils.codepoint
local concat = table.concat
local dump = mw.dumpObject
local format = string.format
local gcodepoint = m_str_utils.gcodepoint
local get_data_module_name = m_languages.getDataModuleName
local get_family_by_code = m_families.getByCode
local get_family_by_canonical_name = m_families.getByCanonicalName
local get_indefinite_article = m_en_utilities.get_indefinite_article
local get_language_by_code = m_languages.getByCode
local get_language_by_canonical_name = m_languages.getByCanonicalName
local get_script_by_code = m_scripts.getByCode
local get_script_by_canonical_name = m_scripts.getByCanonicalName
local gmatch = string.gmatch
local gsub = string.gsub
local insert = table.insert
local ipairs = ipairs
local is_callable = require("Module:fun").is_callable
local is_positive_integer = require("Module:math").is_positive_integer
local is_known_language_tag = mw.language.isKnownLanguageTag
local isutf8 = mw.ustring.isutf8
local json_decode = mw.text.jsonDecode
local language_link = require("Module:links").language_link
local list_to_set = m_table.listToSet
local list_to_text = mw.text.listToText
local load_data = m_load.load_data
local log = mw.log
local main_loader = package.loaders[2]
local make_family = m_families.makeObject
local make_lang = m_languages.makeObject
local make_script = m_scripts.makeObject
local match = string.match
local new_title = mw.title.new
local next = next
local pairs = pairs
local pcall = pcall
local remove_comments = m_str_utils.remove_comments
local safe_require = m_load.safe_require
local sorted_pairs = m_table.sortedPairs
local split = m_str_utils.split
local sub = string.sub
local table_len = m_table.length
local tag_text = require("Module:script utilities").tag_text
local type = type
local umatch = m_str_utils.match
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local aliases = require("Module:languages/data").aliases
local messages
local function discrepancy(modname, ...)
local success, result = pcall(function(...)
messages[modname]:insert(format(...))
end, ...)
if not success then
log(result, ...)
end
end
local messages_mt = {}
function messages_mt:__index(k)
local val = Array()
self[k] = val
return val
end
local all_codes = {}
local language_names = {}
local etym_language_names = {}
local family_names = {}
local script_names = {}
local nonempty_families = {}
local allowed_empty_families = {tbq = true}
local nonempty_scripts = {}
local function link(obj, code_first)
return type(obj) == "string" and obj or
code_first and format("<code>%s</code> (%s)", obj:getCode(), obj:makeCategoryLink()) or
format("%s (<code>%s</code>)", obj:makeCategoryLink(), obj:getCode())
end
local function check_data_keys(...)
local valid_keys = Array(...):toSet()
return function (modname, obj, data)
local invalid_keys
for k in pairs(data) do
if not valid_keys[k] then
if not invalid_keys then
invalid_keys = Array(k)
else
invalid_keys:insert(k)
end
end
end
if invalid_keys == nil then
return
end
local plural = #invalid_keys ~= 1
discrepancy(modname,
"The data key%s %s for %s %s invalid.",
plural and "s" or "",
invalid_keys:map(function(key)
return "<code>" .. key .. "</code>"
end):concat(", "),
link(obj),
plural and "are" or "is"
)
end
end
-- Modification of isArray in [[Module:table]].
-- This assumes all keys are either integers or non-numbers.
-- If there are fractional numbers, the results might be incorrect.
-- For instance, find_gap{"a", "b", [0.5] = true} evaluates to 3, but there
-- isn't a gap at 3 in the sense of there being an integer key greater than 3.
local function find_gap(t, can_contain_non_number_keys)
local i = 0
for k in pairs(t) do
if not (can_contain_non_number_keys and type(k) ~= "number") then
i = i + 1
if t[i] == nil then
return i
end
end
end
end
local function check_true_or_string_or_nil(modname, obj, data, key)
local field = data[key]
if not (field == nil or field == true or type(field) == "string") then
discrepancy(modname,
"%s has %s <code>%s</code> value that is not <code>nil</code>, <code>true</code> or a string: <code>%s</code>",
link(obj), get_indefinite_article(key), key, dump(data[key])
)
end
end
local function check_array(modname, obj, data, array_name, parent_array_name, can_contain_non_number_keys)
local parent_table = data
if parent_array_name then
parent_table = assert(data[parent_array_name], parent_array_name)
parent_array_name = "the <code>" .. parent_array_name .. "</code> field in "
else
parent_array_name = ""
end
local array_type = type(parent_table[array_name])
if array_type == "table" then
local gap = find_gap(parent_table[array_name], can_contain_non_number_keys)
if gap then
discrepancy(modname,
"The <code>%s</code> array in %sthe data table for %s has a gap at index %d.",
array_name,
parent_array_name,
link(obj),
gap
)
else
return true
end
else
discrepancy(modname,
"The <code>%s</code> field in %sthe data table for %s should be an array (table) but is %s.",
array_name,
parent_array_name,
link(obj),
array_type == "nil" and "nil" or "a " .. array_type
)
end
end
local function check_no_alias_codes(modname, mod_data)
local lookup, discrepancies = {}, {}
for k, v in pairs(mod_data) do
local check = lookup[v]
if check then
discrepancies[check] = discrepancies[check] or {"<code>" .. check .. "</code>"}
insert(discrepancies[check], "<code>" .. k .. "</code>")
else
lookup[v] = k
end
end
for _, v in pairs(discrepancies) do
discrepancy(modname,
"The codes %s are currently alias codes. Only one code should be used in the data.",
list_to_text(v, ", ", " and ")
)
end
end
local function check_wikidata_item(modname, obj, data, key)
local data_item = data[key]
if data_item == nil or is_positive_integer(data_item) then
return
end
discrepancy(modname,
"%s has a Wikidata item ID that is not a positive integer: <code>%s</code>",
link(obj), dump(data_item)
)
end
local function check_name_field(modname, obj, data, canonical_name, data_key, allow_nested)
local array = data[data_key]
if not array then
return
end
check_array(modname, obj, data, data_key, nil, true)
local names = {}
local function check_other_name(other_name)
if other_name == canonical_name then
discrepancy(modname,
"%s has its canonical name (<code>%s</code>) repeated in the table of <code>%s</code>.",
link(obj), dump(canonical_name), data_key
)
end
if names[other_name] then
discrepancy(modname,
"The name %s is found twice or more in the list of <code>%s</code> for %s.",
other_name, data_key, link(obj)
)
end
names[other_name] = true
end
for _, other_name in ipairs(array) do
if type(other_name) == "table" then
if not allow_nested then
discrepancy(modname,
"A nested table is found in the list of <code>%s</code> for %s, but isn't allowed.",
data_key, link(obj)
)
else
for _, on in ipairs(other_name) do
check_other_name(on)
end
end
else
check_other_name(other_name)
end
end
end
local function check_other_names_aliases_varieties(modname, obj, data, canonical_name)
if data.otherNames then
check_name_field(modname, obj, data, canonical_name, "otherNames")
end
if data.aliases then
check_name_field(modname, obj, data, canonical_name, "aliases")
end
if data.varieties then
check_name_field(modname, obj, data, canonical_name, "varieties", true)
end
end
local function validate_pattern(pattern, modname, obj, standardChars)
if type(pattern) ~= "string" then
return discrepancy(modname,
"\"%s\", the %spattern for %s, is not a string.",
pattern, standardChars and "standard character " or "", link(obj)
)
elseif not isutf8(pattern) then
return discrepancy(modname,
"%s specifies a pattern for for %scharacter detection which is not valid UTF-8: <code>%s</code>",
link(obj), standardChars and "standard " or "", dump(pattern)
)
end
local ranges
for lower, higher in gmatch(pattern, "(.[\128-\191]*)%-%%?(.[\128-\191]*)") do
if codepoint(lower) >= codepoint(higher) then
ranges = ranges or Array()
insert(ranges, { lower, higher })
end
end
if ranges and ranges[1] then
local plural = #ranges ~= 1 and "s" or ""
discrepancy(modname,
"%s specifies an invalid pattern " ..
"for %scharacter detection: <code>%s</code>. The first codepoint%s " ..
"in the range%s %s %s must be less than or equal to the second.",
link(obj), standardChars and "standard " or "", dump(pattern), plural, plural,
ranges:map(function(range)
return format(range[1] .. "-" .. range[2] .. " (U+%X, U+%X)", codepoint(range[1]), codepoint(range[2]))
end):concat(", "),
#ranges ~= 1 and "are" or "is"
)
end
local success, result = pcall(umatch, "", "[" .. pattern .. "]")
if not success then
discrepancy(modname,
"%s specifies an invalid pattern for %scharacter detection: <code>%s</code> (%s)",
link(obj), standardChars and "standard " or "", dump(pattern), result
)
end
end
local remove_exceptions_addition = 0xF0000
local maximum_code_point = 0x10FFFF
local remove_exceptions_maximum_code_point = maximum_code_point - remove_exceptions_addition
-- TODO: check modules exist.
-- TODO: validate script codes and check inner tables.
local function check_replacement_data(modname, obj, data, key, func_name)
local replacements = data[key]
if replacements == nil then
return
end
local replacements_type = type(replacements)
if replacements_type == "string" then
local mod = main_loader("Module:" .. replacements)
if not mod then
discrepancy(modname,
"The <code>%s</code> field in the data table for %s specifies the module [[Module:%s]], which does not exist.",
key, link(obj), replacements
)
else
mod = mod()
if not (type(mod) == "table" and is_callable(mod[func_name])) then
discrepancy(modname,
"The <code>%s</code> field in the data table for %s specifies the module [[Module:%s]], which exists, but does not contain the expected function <code>%s()</code>.",
key, link(obj), replacements, func_name
)
end
end
return
elseif replacements_type ~= "table" then
discrepancy(modname,
"The <code>%s</code> field in the data table for %s must be a string or table, not a %s.",
key, link(obj), replacements_type
)
return
end
local from, to = replacements.from, replacements.to
if (from ~= nil) ~= (to ~= nil) then
discrepancy(modname,
"The <code>from</code> and <code>to</code> arrays in the <code>%s</code> table for %s are not both defined or both undefined.",
key, link(obj)
)
elseif from then
for _, k in ipairs {"from", "to"} do
check_array(modname, obj, data, k, key)
end
end
local remove_diacritics = replacements.remove_diacritics
if not (remove_diacritics == nil or type(remove_diacritics) == "string") then
discrepancy(modname,
"The <code>remove_diacritics</code> field in the <code>%s</code> table for %s table must be a string.",
key, link(obj)
)
end
local remove_exceptions = replacements.remove_exceptions
if remove_exceptions then
if check_array(modname, obj, data, "remove_exceptions", key) then
for sequence_i, sequence in ipairs(remove_exceptions) do
local code_point_i = 0
for code_point in gcodepoint(sequence) do
code_point_i = code_point_i + 1
if code_point > remove_exceptions_maximum_code_point then
discrepancy(modname,
"Code point #%d (0x%04X) in field #%d of the <code>remove_exceptions</code> array for %s is over U+%04X.",
code_point_i, code_point, sequence_i, link(obj), remove_exceptions_maximum_code_point
)
end
end
end
end
end
if from and to and table_len(to) > table_len(from) then
discrepancy(modname,
"The <code>from</code> array in the <code>%s</code> table for %s must be shorter or the same length as the <code>to</code> array.",
key, link(obj)
)
end
end
local function check_replacements_data(modname, obj, data)
for _, replacement_spec in ipairs{
{"translit", "tr"},
{"display_text", "makeDisplayText"},
{"entry_name", "makeEntryName"},
{"sort_key", "makeSortKey"},
} do
check_replacement_data(modname, obj, data, unpack(replacement_spec))
end
end
local function has_ancestor(lang, code)
for _, anc in ipairs(lang:getAncestors()) do
if code == anc:getCode() or has_ancestor(anc, code) then
return true
end
end
end
local function get_default_ancestors(lang)
if lang:hasType("language", "etymology-only") then
local parent = lang:getParent()
if not has_ancestor(parent, lang:getCode()) then
return parent:getAncestorCodes()
end
end
local fam_code, def_anc = lang:getFamilyCode()
while fam_code and fam_code ~= "qfa-not" do
local fam = m_families_data[fam_code]
def_anc = fam.protoLanguage or
m_languages_data_all[fam_code .. "-pro"] and fam_code .. "-pro" or
m_etym_languages_data[fam_code .. "-pro"] and fam_code .. "-pro"
if def_anc and def_anc ~= lang:getCode() then
return {def_anc}
end
fam_code = fam[3]
end
end
local function iterate_ancestor(obj, modname, anc_code)
local anc = get_language_by_code(anc_code, nil, true)
if not anc then
discrepancy(modname,
"%s lists the invalid language code <code>%s</code> as its ancestor.",
link(obj), dump(anc_code)
)
return
end
local anc_fam = anc:getFamily()
if not anc_fam then
discrepancy(modname,
"%s has no family.",
link(anc)
)
return
end
local anc_fam_code = anc_fam:getCode()
local def_ancs = get_default_ancestors(obj)
if def_ancs then
for _, def_anc in ipairs(def_ancs) do
def_anc = get_language_by_code(def_anc, nil, true)
if def_anc and (
anc_code == def_anc:getCode() or
has_ancestor(def_anc, anc_code) or
def_anc:hasParent(anc_code) and not has_ancestor(anc, def_anc:getCode())
) then
discrepancy(modname,
"%s has the ancestor %s listed in its ancestor field, which is redundant, since it is determined to be ancestral automatically.",
link(obj), link(anc)
)
end
end
end
if not obj:inFamily(anc_fam_code) then
discrepancy(modname,
"%s has %s set as an ancestor, but is not in the %s.",
link(obj), link(anc), link(anc_fam)
)
end
local fam, proto = obj
repeat
fam = fam:getFamily()
proto = fam and fam:getProtoLanguage()
until proto or not fam or fam:getCode() == "qfa-not"
if proto and not (
proto:getCode() == anc:getCode() or
proto:hasAncestor(anc:getCode()) or
anc:hasAncestor(proto:getCode())
) then
local fam = obj:getFamily()
discrepancy(modname,
"%s is in the %s and has %s set as an ancestor, but it is not possible to form an ancestral chain between them.",
link(obj), link(fam), link(anc)
)
end
end
local function check_ancestors(modname, obj, data)
local ancestors = data.ancestors
if ancestors == nil then
return
end
local ancestors_type = type(ancestors)
if ancestors_type == "string" then
ancestors = split(ancestors, ",", true, true)
elseif ancestors_type ~= "table" then
discrepancy(modname,
"The <code>ancestors</code> field in the data table for %s must be a string or table, not a %s.",
link(obj), ancestors_type
)
end
for _, anc in ipairs(ancestors) do
iterate_ancestor(obj, modname, anc)
end
end
local function check_wikimedia_codes(modname, obj, data)
local wikimedia_codes = data.wikimedia_codes
if wikimedia_codes == nil then
return
end
local wikimedia_codes_type = type(wikimedia_codes)
if wikimedia_codes_type == "string" then
wikimedia_codes = split(wikimedia_codes, ",", true, true)
elseif wikimedia_codes_type ~= "table" then
discrepancy(modname,
"The <code>wikimedia_codes</code> field in the data table for %s must be a string or table, not a %s.",
link(obj), wikimedia_codes_type
)
end
for _, code in ipairs(wikimedia_codes) do
if not is_known_language_tag(code) then
discrepancy(modname,
"%s lists the invalid Wikimedia code <code>%s</code> in the <code>wikimedia_codes</code> field.",
link(obj), dump(code)
)
end
end
end
local function check_code_to_name_and_name_to_code_maps(
source_module_type,
source_module_description,
code_to_module_map, name_to_code_map,
code_to_name_modname, code_to_name_module,
name_to_code_modname, name_to_code_module
)
local function check_code_and_name(modname, code, canonical_name)
-- Check the code is in code_to_module_map and that it didn't originate from the wrong data module.
local check_mod = code_to_module_map[code] or code_to_module_map[aliases[code]]
if not (check_mod and match(check_mod, "^" .. source_module_type .. "/data")) then
if not name_to_code_map[canonical_name] then
discrepancy(modname,
"The code <code>%s</code> and the canonical name %s should be removed; they are not found in %s.",
code, canonical_name, source_module_description
)
else
discrepancy(modname,
"<code>%s</code>, the code for the canonical name %s, is wrong; it should be <code>%s</code>.",
code, canonical_name, name_to_code_map[canonical_name]
)
end
elseif not name_to_code_map[canonical_name] then
local data_table = require("Module:" .. code_to_module_map[code])[code]
discrepancy(modname,
"%s, the canonical name for the code <code>%s</code>, is wrong; it should be %s.",
canonical_name, code, data_table[1]
)
end
end
for code, canonical_name in pairs(code_to_name_module) do
check_code_and_name(code_to_name_modname, code, canonical_name)
end
for canonical_name, code in pairs(name_to_code_module) do
check_code_and_name(name_to_code_modname, code, canonical_name)
end
end
local function check_extraneous_extra_data(
data_modname, data_module, extra_data_modname, extra_data_module)
for code, _ in pairs(extra_data_module) do
if not data_module[code] then
discrepancy(extra_data_modname,
"The code <code>%s</code> is not found in [[Module:%s]], and should be removed from [[Module:%s]].",
code, data_modname, extra_data_modname
)
end
end
end
-- TODO: add collision check between the canonical names "X" and "X [Ll]anguage".
local function check_languages(frame)
local check_language_data_keys = check_data_keys(
1, 2, 3, 4, -- canonical name, Wikidata item, family, scripts
"display_text", "generate_forms", "entry_name", "sort_key",
"otherNames", "aliases", "varieties", "ietf_subtag",
"type", "ancestors",
"wikimedia_codes", "wikipedia_article", "standardChars",
"translit", "override_translit", "link_tr",
"dotted_dotless_i"
)
local function check_language(modname, code, data, extra_modname, extra_data)
local obj, code_modname, canonical_name = make_lang(code, data, true), get_data_module_name(code), data[1]
-- FIXME: this module should use the prefixed module name throughout.
code_modname = code_modname:gsub("^Module:", "")
if code_modname ~= modname then
if code_modname == "languages/data/2" then
discrepancy(modname,
"%s is a two-letter code, so should be moved to [[Module:%s]].",
link(obj), code_modname
)
elseif code_modname == "languages/data/exceptional" then
discrepancy(modname,
"%s is an exceptional code, as it does not consist of two or three lowercase letters, so should be moved to [[Module:%s]].",
link(obj), code_modname
)
else
discrepancy(modname,
"%s is a three-letter code beginning with '%s', so should be moved to [[Module:%s]].",
link(obj), sub(code, 1, 1), code_modname
)
end
end
check_language_data_keys(modname, obj, data)
if all_codes[code] then
discrepancy(modname,
"The code <code>%s</code> is not unique; it is also defined in [[Module:%s]].",
code, all_codes[code]
)
else
if not m_languages_codes[code] then
discrepancy("languages/code to canonical name",
"The code %s is missing.",
link(obj, true)
)
end
all_codes[code] = modname
end
if sub(code, -4) == "-pro" then
local fam_code = sub(code, 1, -5)
local fam = get_language_by_code(fam_code, nil, true, true)
if not fam then
discrepancy(modname,
"%s has a proto-language code associated with the invalid code <code>%s</code>.",
link(obj), dump(fam_code)
)
elseif not fam:hasType("family") then
discrepancy(modname,
"%s has a proto-language code associated with %s, which is not a family.",
link(obj), link(fam)
)
else
local expected_name = "Proto-" .. fam:getCanonicalName()
if canonical_name ~= expected_name then
discrepancy(modname,
"%s does not have the expected name \"%s\", even though it is the proto-language of the %s.",
link(obj), expected_name, link(fam)
)
end
end
end
if not canonical_name then
discrepancy(modname,
"The code <code>%s</code> has no canonical name specified.",
code
)
elseif language_names[canonical_name] then
local canonical_lang = get_language_by_canonical_name(canonical_name)
if not canonical_lang then
discrepancy(modname,
"%s has a canonical name that cannot be looked up.",
link(obj)
)
elseif data.main_code ~= canonical_lang:getCode() then
discrepancy(modname,
"%s has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
link(obj), language_names[canonical_name]
)
end
else
if not m_languages_canonical_names[canonical_name] then
discrepancy("languages/canonical names",
"The canonical name %s is missing.",
link(obj)
)
end
language_names[canonical_name] = code
end
check_wikidata_item(modname, obj, data, 2)
if extra_data then
check_other_names_aliases_varieties(modname, obj, extra_data, canonical_name)
end
local lang_type = data.type
if lang_type and not (lang_type == "regular" or lang_type == "reconstructed" or lang_type == "appendix-constructed") then
discrepancy(modname,
"%s is of the invalid type <code>%s</code>.",
link(obj), lang_type
)
end
if data.aliases then
discrepancy(modname,
"%s has an <code>aliases</code> key in [[Module:%s]]. This must be moved to [[Module:%s]].",
link(obj), modname, extra_modname
)
end
if data.varieties then
discrepancy(modname,
"%s has the <code>varieties</code> key in [[Module:%s]]. This must be moved to [[Module:%s]].",
link(obj), modname, extra_modname
)
end
if data.otherNames then
discrepancy(modname,
"%s has the <code>otherNames</code> key in [[Module:%s]]. This must be moved to [[Module:%s]].",
link(obj), modname, extra_modname
)
end
if not extra_data then
discrepancy(extra_modname,
"%s has data in [[Module:%s]], but does not have corresponding data in [[Module:%s]].",
link(obj), modname, extra_modname
)
--[[elseif extra_data.otherNames then
discrepancy(extra_modname,
"%s has <code>otherNames</code> key, but these should be changed to either <code>aliases</code> or <code>varieties</code>.",
link(obj)
)]]
end
local sc = data[4]
if sc then
if type(sc) == "string" then
sc = split(sc, "%s*,%s*", true)
end
if type(sc) == "table" then
if not sc[1] then
discrepancy(modname,
"%s has no scripts listed.",
link(obj)
)
else
for _, sccode in ipairs(sc) do
local cur_sc = m_scripts_data[sccode]
if not (cur_sc or sccode == "All" or sccode == "Hants") then
discrepancy(modname,
"%s lists the invalid script code <code>%s</code>.",
link(obj), dump(sccode)
)
--[[elseif not cur_sc.characters then
discrepancy(modname,
"%s lists the %s, which does not have any characters.",
link(obj), link(get_script_by_code(sccode))
)]]
end
nonempty_scripts[sccode] = true
end
end
else
discrepancy(modname,
"The %s field for %s must be a table or string.",
4, link(obj)
)
end
end
if data.ancestors then
check_ancestors(modname, obj, data)
end
if data.wikimedia_codes then
check_wikimedia_codes(modname, obj, data)
end
if data[3] then
local family = data[3]
if not m_families_data[family] then
discrepancy(modname,
"%s has the invalid family code <code>%s</code>.",
link(obj), dump(family)
)
end
nonempty_families[family] = true
end
check_replacements_data(modname, obj, data)
if data.standardChars then
if type(data.standardChars) == "table" then
local sccodes = {}
for _, sccode in ipairs(sc) do
sccodes[sccode] = true
end
for sccode in pairs(data.standardChars) do
if not (sccodes[sccode] or sccode == 1) then
discrepancy(modname,
"The field %s in the <code>standardChars</code> table for %s does not match any script for that language.",
sccode, link(obj)
)
end
end
elseif data.standardChars and type(data.standardChars) ~= "string" then
discrepancy(modname,
"The <code>standardChars</code> field in the data table for %s must be a string or table.",
link(obj)
)
end
end
check_true_or_string_or_nil(modname, obj, data, "override_translit")
check_true_or_string_or_nil(modname, obj, data, "link_tr")
if data.override_translit and not data.translit then
discrepancy(modname,
"%s has the <code>override_translit</code> field set, but no transliteration module",
link(obj)
)
end
end
local function check_module(modname)
local mod_data = load_data("Module:" .. modname)
local extra_modname = modname .. "/extra"
local extra_mod_data = load_data("Module:" .. extra_modname)
for code, data in pairs(mod_data) do
check_language(modname, code, data, extra_modname, extra_mod_data[code])
end
check_no_alias_codes(modname, mod_data)
check_no_alias_codes(extra_modname, extra_mod_data)
check_extraneous_extra_data(modname, mod_data, extra_modname, extra_mod_data)
end
-- Check two-letter codes
check_module(
"languages/data/2"
)
-- Check three-letter codes
for i = 0x61, 0x7A do -- a to z
check_module(
format("languages/data/3/%c", i)
)
end
-- Check exceptional codes
check_module(
"languages/data/exceptional"
)
-- These checks must be done while all_codes only contains language codes:
-- that is, after language data modules have been processed, but before
-- etymology languages, families, and scripts have.
check_code_to_name_and_name_to_code_maps(
"languages",
"a submodule of [[Module:languages]]",
all_codes, language_names,
"languages/code to canonical name", m_languages_codes,
"languages/canonical names", m_languages_canonical_names
)
-- Check [[Template:langname-lite]]
local modname = "Template:langname-lite"
for code, name in gmatch(remove_comments(new_title(modname):getContent()), "\n\t*|#*([^\n]+)=([^\n]*)") do
if #code > 1 and code ~= "default" then
for _, code in pairs(split(code, "|", true)) do
local lang = get_language_by_code(code, nil, true, true)
if match(name, "etymcode") then
local nonEtym_name = frame:preprocess(name)
local nonEtym_real_name = lang:getFullName()
if nonEtym_name ~= nonEtym_real_name then
discrepancy(modname,
"Code: <code>%s</code>. Saw name: %s. Expected name: %s.",
code, nonEtym_name, nonEtym_real_name
)
end
name = frame:preprocess(gsub(name, "{{{allow etym|}}}", "1"))
elseif match(name, "familycode") then
name = match(name, "familycode|(.-)|")
else
name = name
end
if not lang then
discrepancy(modname,
"Code: <code>%s</code>. Saw name: %s. Language not present in data.",
code, name
)
else
local real_name = lang:getCanonicalName()
if name ~= real_name then
discrepancy(modname,
"Code: <code>%s</code>. Saw name: %s. Expected name: %s.",
code, name, real_name
)
end
end
end
end
end
end
local function check_etym_languages()
local modname = "etymology languages/data"
local check_etymology_language_data_keys = check_data_keys(
1, 2, 3, 4, -- canonical name, Wikidata item, family, scripts
"parent", "display_text", "generate_forms", "entry_name", "sort_key",
"otherNames", "aliases", "varieties", "ietf_subtag",
"type", "main_code", "ancestors",
"wikimedia_codes", "wikipedia_article", "standardChars",
"translit", "override_translit", "link_tr",
"dotted_dotless_i"
)
local checked = {}
for code, data in pairs(m_etym_languages_data) do
local obj, canonical_name, parent = make_lang(code, data, true), data[1], data.parent
check_etymology_language_data_keys(modname, obj, data)
if all_codes[code] then
discrepancy(modname,
"The code <code>%s</code> is not unique; it is also defined in [[Module:%s]].",
code, all_codes[code]
)
else
if not m_etym_languages_codes[code] then
discrepancy("etymology languages/code to canonical name",
"The code %s is missing.",
link(obj, true)
)
end
all_codes[code] = modname
end
if not canonical_name then
discrepancy(modname,
"The code <code>%s</code> has no canonical name specified.",
code
)
elseif language_names[canonical_name] then
local canonical_lang = get_language_by_canonical_name(canonical_name, nil, true)
if not canonical_lang then
discrepancy(modname,
"%s has a canonical name that cannot be looked up.",
link(obj)
)
elseif data.main_code ~= canonical_lang:getCode() then
discrepancy(modname,
"%s has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
link(obj), language_names[canonical_name]
)
end
else
if not m_etym_languages_canonical_names[canonical_name] then
discrepancy("etymology languages/canonical names",
"The canonical name %s is missing.",
link(obj)
)
end
etym_language_names[canonical_name] = code
end
check_other_names_aliases_varieties(modname, obj, data, canonical_name)
if parent then
if type(parent) ~= "string" then
discrepancy(modname,
"%s has a parent code that is %s rather than a string.",
link(obj), parent == nil and "nil" or "a " .. type(parent)
)
elseif not (m_languages_data_all[parent] or m_etym_languages_data[parent]) then
discrepancy(modname,
"%s has the invalid parent code <code>%s</code>%s.",
link(obj), dump(parent), m_families_data[parent] and " (a family code)" or ""
)
end
nonempty_families[parent] = true
else
discrepancy(modname,
"%s has no parent code.",
link(obj)
)
end
if data.ancestors then
check_ancestors(modname, obj, data)
end
if data.wikimedia_codes then
check_wikimedia_codes(modname, obj, data)
end
if data[3] then
local family = data[3]
if not m_families_data[family] then
discrepancy(modname,
"%s has the invalid family code <code>%s</code>.",
link(obj), dump(family))
end
nonempty_families[family] = true
end
check_replacements_data(modname, obj, data)
check_wikidata_item(modname, obj, data, 2)
local stack = {}
while data do
if checked[code] then
break
elseif stack[code] then
local parent = data.parent
discrepancy(modname,
"%s has a cyclic parental relationship to %s",
link(make_lang(code, data, true)),
link(get_language_by_code(parent, nil, true))
)
break
end
stack[code] = true
code = data.parent
data = m_etym_languages_data[code]
end
for code in pairs(stack) do
checked[code] = true
end
end
check_no_alias_codes(modname, m_etym_languages_data)
check_code_to_name_and_name_to_code_maps(
"etymology languages",
"[[Module:etymology languages/data]]",
all_codes, etym_language_names,
"etymology languages/code to canonical name", m_etym_languages_codes,
"etymology languages/canonical names", m_etym_languages_canonical_names)
end
-- TODO: add collision check between the canonical names "X" and "X [Ll]anguages".
local function check_families()
local modname = "families/data"
local check_family_data_keys = check_data_keys(
1, 2, 3, -- canonical name, Wikidata item, (parent) family
"type", "ietf_subtag",
"protoLanguage", "otherNames", "aliases", "varieties"
)
local checked, double_check_if_empty = {["qfa-not"] = true}, {}
for code, data in pairs(m_families_data) do
local obj, canonical_name, family, protolang = make_family(code, data), data[1], data[3], data.protoLanguage
check_family_data_keys(modname, obj, data)
if all_codes[code] then
discrepancy(modname,
"The code <code>%s</code> is not unique; it is also defined in [[Module:%s]].",
code, all_codes[code]
)
else
if not m_families_codes[code] then
discrepancy("families/code to canonical name",
"The code %s is missing.",
link(obj, true)
)
end
all_codes[code] = modname
end
if not canonical_name then
discrepancy(modname,
"The code <code>%s</code> has no canonical name specified.",
code
)
elseif family_names[canonical_name] then
local canonical_family = get_family_by_canonical_name(canonical_name)
if not canonical_family then
discrepancy(modname,
"%s has a canonical name that cannot be looked up.",
link(obj)
)
elseif data.main_code ~= canonical_family:getCode() then
discrepancy(modname,
"%s has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
link(obj), family_names[canonical_name]
)
end
else
if not m_families_canonical_names[canonical_name] then
discrepancy("families/canonical names",
"The canonical name %s is missing.",
link(obj)
)
end
family_names[canonical_name] = code
end
check_other_names_aliases_varieties(modname, obj, data, canonical_name)
if family then
if family == code and code ~= "qfa-not" then
discrepancy(modname,
"%s has itself as its family.",
link(obj)
)
elseif not m_families_data[family] then
discrepancy(modname,
"%s has the invalid parent family code <code>%s</code>.",
link(obj), dump(family)
)
end
nonempty_families[family] = true
end
if protolang then
local protolang_obj = get_language_by_code(protolang, nil, true)
if not protolang_obj then
discrepancy(modname,
"%s has the invalid proto-language code <code>%s</code>.",
link(obj), dump(protolang)
)
elseif protolang == code .. "-pro" then
discrepancy(modname,
"%s has %s listed as its proto-language, which is redundant, since it is determined to be the proto-language automatically.",
link(obj), link(protolang_obj)
)
elseif sub(protolang, -4) == "-pro" then
discrepancy(modname,
"%s has %s listed as its proto-language, which is supposed to be the proto-language for the family <code>%s</code>.", link(obj), link(protolang_obj), sub(protolang, 1, -5)
)
end
end
check_wikidata_item(modname, obj, data, 2)
-- Could be a false-positive if a child family occurs on a later
-- iteration, so set aside any that fail for a second check. This avoids
-- having to iterate through the whole list of families once
-- nonempty_families has been fully populated.
if not (nonempty_families[code] or allowed_empty_families[code]) then
double_check_if_empty[code] = obj
end
local stack = {}
while data do
if checked[code] then
break
elseif stack[code] then
local parent = data[3]
discrepancy(modname,
"%s has a cyclic familial relationship to %s",
link(make_family(code, data)),
link(get_family_by_code(parent))
)
break
end
stack[code] = true
code = data[3]
data = m_families_data[code]
end
for code in pairs(stack) do
checked[code] = true
end
end
-- Any languages set aside as candidates for having no children are checked
-- again, now that nonempty_families is definitely complete.
for code, obj in next, double_check_if_empty do
if not (nonempty_families[code] or allowed_empty_families[code]) then
discrepancy(modname,
"%s has no child families or languages.",
link(obj)
)
end
end
check_no_alias_codes(modname, m_families_data)
check_code_to_name_and_name_to_code_maps(
"families",
"[[Module:families/data]]",
all_codes, family_names,
"families/code to canonical name", m_families_codes,
"families/canonical names", m_families_canonical_names)
end
-- TODO: add collision check between the canonical names "X" and "X [Ss]cript".
local function check_scripts()
local modname = "scripts/data"
local check_script_data_keys = check_data_keys(
1, 2, 3, -- canonical name, Wikidata item, writing systems
"otherNames", "aliases", "varieties", "parent", "ietf_subtag", "type",
"wikipedia_article", "ranges", "characters", "spaces", "capitalized", "translit", "direction",
"character_category", "normalizationFixes", "sort_by_scraping"
)
-- Just to satisfy requirements of check_code_to_name_and_name_to_code_maps.
local script_code_to_module_map = {}
for code, data in pairs(m_scripts_data) do
local obj, canonical_name = make_script(code, data), data[1]
if not m_scripts_codes[code] and #code == 4 then
discrepancy("scripts/code to canonical name",
"The code %s is missing",
link(obj, true)
)
end
check_script_data_keys(modname, obj, data)
if not canonical_name then
discrepancy(modname,
"The code <code>%s</code> has no canonical name specified.",
code
)
elseif script_names[canonical_name] then
local canonical_script = get_script_by_canonical_name(canonical_name)
if not canonical_script then
discrepancy(modname,
"%s has a canonical name that cannot be looked up.",
link(obj)
)
--[[elseif data.main_code ~= canonical_script:getCode() then
discrepancy(modname,
"%s has a canonical name that is not unique; it is also used by the code <code>%s</code>.",
link(obj), script_names[canonical_name]
)]]
end
else
if not m_scripts_canonical_names[canonical_name] and #code == 4 then
discrepancy("scripts/canonical names",
"The canonical name %s is missing.",
link(obj)
)
end
script_names[canonical_name] = code
end
check_other_names_aliases_varieties(modname, obj, data, canonical_name)
if not nonempty_scripts[code] then
discrepancy(modname,
"%s is not used by any language%s.",
link(obj), data.characters and ""
or " and has no characters listed for auto-detection")
--[[elseif not data.characters then
discrepancy(modname,
"%s has no characters listed for auto-detection.",
link(obj)
)--]]
end
if data.characters then
validate_pattern(data.characters, modname, obj, false)
end
check_wikidata_item(modname, obj, data, 2)
script_code_to_module_map[code] = modname
end
check_no_alias_codes(modname, m_scripts_data)
check_code_to_name_and_name_to_code_maps(
"scripts",
"a submodule of [[Module:scripts]]",
script_code_to_module_map, script_names,
"scripts/code to canonical name", m_scripts_codes,
"scripts/canonical names", m_scripts_canonical_names)
end
-- FIXME: this is quite messy.
local function check_wikidata_languages()
local data = json_decode(new_title("Module:languages/data/wikidata.json"):getContent())
local seen = {{}, {}, {}, [5] = {}}
for _, item in ipairs(data) do
local id = item.id
for k, v in pairs(item) do
if k ~= "id" then
local _seen = seen[k]
for _, code in ipairs(v) do
local _code = code[1]
local _type = type(_seen[_code])
if _type == "table" then
insert(_seen[_code], id)
elseif _type == "string" then
_seen[_code] = {_seen[_code], id}
else
_seen[_code] = id
end
end
end
end
end
local modname = "languages/data/wikidata.json"
for k, v in pairs(seen) do
for code, ids in pairs(v) do
if type(ids) == "table" then
local t = {}
for i, id in ipairs(ids) do
t[i] = format("<code>[[d:%s|%s]]</code>", id, id)
end
discrepancy(modname,
"<code>%s</code> is set as an ISO 639-%d code on multiple items: %s.",
code, k, list_to_text(t)
)
end
end
end
end
local function check_labels()
local check_label_data_keys = check_data_keys(
"display", "Wikipedia", "glossary",
"plain_categories", "topical_categories", "pos_categories", "regional_categories", "sense_categories",
"omit_preComma", "omit_postComma", "omit_preSpace",
"deprecated", "track"
)
local function check_label(modname, code, data)
local _type = type(data)
if _type == "table" then
check_label_data_keys(modname, code, data)
elseif _type ~= "string" then
discrepancy(modname,
"The data for the label <code>%s</code> is %s %s; only tables and strings are allowed.",
code, add_indefinite_article(_type)
)
end
end
for _, module in ipairs{"", "/regional", "/topical"} do
local modname = "Module:labels/data" .. module
module = require(modname)
for label, data in pairs(module) do
check_label(modname, label, data)
end
end
for code in pairs(m_languages_codes) do
local modname = "Module:labels/data/lang/" .. code
local module = safe_require(modname)
if module then
for label, data in pairs(module) do
check_label(modname, label, data)
end
end
end
end
local function check_zh_trad_simp()
local m_ts = require("Module:zh/data/ts")
local m_st = require("Module:zh/data/st")
local ruby = require("Module:ja-ruby").ruby_auto
local lang = get_language_by_code("zh")
local Hant = get_script_by_code("Hant")
local Hans = get_script_by_code("Hans")
local data = {[0] = m_st, m_ts}
local mod = {[0] = "st", "ts"}
local var = {[0] = "Simp.", "Trad."}
local sc = {[0] = Hans, Hant}
local function find_stable_loop(chars, other, j)
local display = ruby({["markup"] = "[" .. other .. "](" .. var[(j+1)%2] .. ")"})
display = language_link{term = other, alt = display, lang = lang, sc = sc[(j+1)%2], tr = "-"}
insert(chars, display)
if data[(j+1)%2][other] == other then
insert(chars, other)
return chars, 1
elseif not data[(j+1)%2][other] then
insert(chars, "not found")
return chars, 2
elseif data[j%2][data[(j+1)%2][other]] ~= other then
return find_stable_loop(chars, data[(j+1)%2][other], j + 1)
else
local display = ruby({["markup"] = "[" .. data[(j+1)%2][other] .. "](" .. var[j%2] .. ")"})
display = language_link{term = data[(j+1)%2][other], alt = display, lang = lang, sc = sc[j%2], tr = "-"}
insert(chars, display .. " (")
display = ruby({["markup"] = "[" .. data[j%2][data[(j+1)%2][other]] .. "](" .. var[(j+1)%2] .. ")"})
display = language_link{term = data[j%2][data[(j+1)%2][other]], alt = display, lang = lang, sc = sc[(j+1)%2], tr = "-"}
insert(chars, display .. " etc.)")
return chars, 3
end
return chars
end
for i = 0, 1, 1 do
for ch, other_ch in pairs(data[i]) do
if data[(i+1)%2][other_ch] ~= ch then
local chars, issue = {}
local display = ruby({["markup"] = "[" .. ch .. "](" .. var[i] .. ")"})
display = language_link{term = ch, alt = display, lang = lang, sc = sc[i], tr = "-"}
insert(chars, display)
chars, issue = find_stable_loop(chars, other_ch, i)
if issue == 1 or issue == 2 then
local sc_this, mod_this, j = {}
if match(chars[#chars-1], var[(i+1)%2]) then
j = 1
else
j = 0
end
mod_this = mod[(i+j)%2]
sc_this = {[0] = sc[(i+j)%2], sc[(i+j+1)%2]}
for k, ch in ipairs(chars) do
chars[k] = tag_text(ch, lang, sc_this[k%2], "term")
end
local modname = "zh/data/" .. mod_this
if issue == 1 then
discrepancy(modname,
"character references itself: %s",
concat(chars, " → ")
)
elseif issue == 2 then
discrepancy(modname,
"missing character: %s",
concat(chars, " → ")
)
end
elseif issue == 3 then
for j, ch in ipairs(chars) do
chars[j] = tag_text(ch, lang, sc[(i+j)%2], "term")
end
discrepancy("zh/data/" .. mod[i],
"possible mismatched character: %s",
concat(chars, " → ")
)
end
end
end
end
end
local function check_serialization(modname)
local serializers = {
["Hani-sortkey/data/serialized"] = "Hani-sortkey/serializer",
}
if not serializers[modname] then
return nil
end
local serializer = serializers[modname]
local current_data = require("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:%s]] to update it. If you have made any changes to the underlying data, the serialized data <u>must</u> be updated before these changes will take effect.</strong>",
serializer
)
end
end
local find_code = require("Module:memoize")(function(message)
return match(message, "<code>([^<]+)</code>")
end)
local function compare_messages(message1, message2)
local code1, code2 = find_code(message1), find_code(message2)
if code1 and code2 then
return code1 < code2
else
return message1 < message2
end
end
-- Warning: cannot be called twice in the same module invocation because
-- some module-global variables are not reset between calls.
local function do_checks(frame, modules)
messages = setmetatable({}, messages_mt)
if modules["zh/data/ts"] or modules["zh/data/st"] then
check_zh_trad_simp()
end
check_languages(frame)
check_etym_languages()
-- families and scripts must be checked AFTER languages; languages checks fill out
-- the nonempty_families and nonempty_scripts tables, used for testing if a family/script
-- is ever used in the data
check_families()
check_scripts()
check_wikidata_languages()
if modules["labels/data"] then
check_labels()
end
for module in pairs(modules) do
check_serialization(module)
end
setmetatable(messages, nil)
for _, msglist in pairs(messages) do
msglist:sort(compare_messages)
end
local ret = messages
messages = nil
return ret
end
local function format_message(modname, msglist)
local header; if match(modname, "^Module:") or match(modname, "^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_t(frame)
local args = frame.args
local modules = list_to_set(args)
local ret = Array()
local messages = do_checks(frame, modules)
for _, module in ipairs(args) do
local msglist = messages[module]
if msglist then
ret:insert(format_message(module, msglist))
end
end
return ret:concat("\n")
end
function export.perform(frame)
local messages = do_checks(frame, {})
-- Format the messages
local ret = Array()
for modname, msglist in sorted_pairs(messages) do
ret:insert(format_message(modname, msglist))
end
-- Are there any messages?
-- TODO: check how many messages there are.
if false then --if i == 1 then
return "<b class=\"success\">Glory to Arstotzka.</b>"
else
ret:insert(1, "<b class=\"warning\">Discrepancies detected:</b>")
return ret:concat("\n")
end
end
return export