Wikikamus
mswiktionary
https://ms.wiktionary.org/wiki/Wikikamus:Laman_Utama
MediaWiki 1.47.0-wmf.19
case-sensitive
Media
Khas
Perbincangan
Pengguna
Perbincangan pengguna
Wikikamus
Perbincangan Wikikamus
Fail
Perbincangan fail
MediaWiki
Perbincangan MediaWiki
Templat
Perbincangan templat
Bantuan
Perbincangan bantuan
Kategori
Perbincangan kategori
Lampiran
Perbincangan lampiran
Rima
Perbincangan rima
Tesaurus
Perbincangan tesaurus
Indeks
Perbincangan indeks
Petikan
Perbincangan petikan
Rekonstruksi
Perbincangan rekonstruksi
Padanan isyarat
Perbincangan padanan isyarat
Konkordans
Perbincangan konkordans
TimedText
TimedText talk
Modul
Perbincangan modul
Acara
Perbincangan acara
Modul:families/data
828
9762
373560
373477
2026-09-11T12:39:29Z
Hakimi97
2668
Simpan terjemahan daripada versi sebelumnya, akan disemak lagi sekali
373560
Scribunto
text/plain
--[=[
This module contains definitions for all language family codes on Wiktionary.
]=]--
local m = {}
m["aav"] = {
"Austroasia",
33199,
aliases = {"Austro-Asiatik"},
}
m["aav-khs"] = {
"Khasi",
3073734,
"aav",
aliases = {"Khasik"},
}
m["aav-nic"] = {
"Nicobar",
217380,
"aav",
}
m["aav-pkl"] = {
"Pnar-Khasi-Lyngngam",
nil,
"aav-khs",
}
m["afa"] = {
"Afroasia",
25268,
aliases = {"Afroasiatik"},
}
m["alg"] = {
"Algonquin",
33392,
"aql",
}
m["alg-abp"] = {
"Abenaki-Penobscot",
197936,
"alg-eas",
}
m["alg-ara"] = {
"Arapaho",
2153686,
"alg",
}
m["alg-eas"] = {
"Algonquin Timur",
2257525,
"alg",
}
m["alg-sfk"] = {
"Sac-Fox-Kickapoo",
1440172,
"alg",
}
m["alv"] = {
"Atlantik-Congo",
771124,
"nic",
}
m["alv-aah"] = {
"Ayere-Ahan",
750953,
"alv-von",
}
m["alv-ada"] = {
"Adamawa",
32906,
"alv-sav",
}
m["alv-bag"] = {
"Baga",
2746083,
"alv-mel",
}
m["alv-bak"] = {
"Bak",
1708174,
"alv-sng",
}
m["alv-bam"] = {
"Bambuka",
4853456,
"alv-ada",
aliases = {"Yungur-Jen"},
}
m["alv-bny"] = {
"Banyum",
2892477,
"alv-nyn",
}
m["alv-bua"] = {
"Bua",
4982094,
"alv-mbd",
}
m["alv-bwj"] = {
"Bikwin-Jen",
84542501,
"alv-bam",
}
m["alv-cng"] = {
"Cangin",
1033184,
"alv-fwo",
}
m["alv-ctn"] = {
"Tano Tengah",
1658486,
"alv-ptn",
aliases = {"Akan"},
}
m["alv-dlt"] = {
"Edoid Delta",
nil,
"alv-edo",
}
m["alv-dur"] = {
"Duru",
5316788,
"alv-lni",
}
m["alv-ede"] = {
"Ede",
35368,
"alv-yor",
}
m["alv-edk"] = {
"Edekiri",
5336735,
"alv-yrd",
}
m["alv-edo"] = {
"Edoid",
1287469,
"alv-von",
}
m["alv-eeo"] = {
"Edo-Esan-Ora",
12630439,
"alv-nce",
}
m["alv-fli"] = {
"Fali",
3450166,
"alv",
}
m["alv-fwo"] = {
"Fula-Wolof",
12631267,
"alv-sng",
}
m["alv-gbe"] = {
"Gbe",
668284,
"alv-von",
}
m["alv-gda"] = {
"Ga-Dangme",
3443338,
"alv-kwa",
}
m["alv-gng"] = {
"Guang",
684009,
"alv-ptn",
}
m["alv-gtm"] = {
"Ghana-Togo Mountain",
493020,
"alv-kwa",
aliases = {"Togo Remnant", "Togo Tengah"},
}
m["alv-hei"] = {
"Heiban",
108752116,
"alv-the",
}
m["alv-ido"] = {
"Idomoid",
974196,
"alv-von",
}
m["alv-igb"] = {
"Igboid",
1429100,
"alv-von",
}
m["alv-jfe"] = {
"Jola-Felupe",
1708174,
"alv-jol",
aliases = {"Ejamat"},
}
m["alv-jol"] = {
"Jola",
35176,
"alv-bak",
aliases = {"Diola"},
}
m["alv-kim"] = {
"Kim",
6409701,
"alv-mbd",
}
m["alv-kis"] = {
"Kissi",
35696,
"alv-mel",
}
m["alv-krb"] = {
"Karaboro",
4213541,
"alv-snf",
}
m["alv-ktg"] = {
"Ka-Togo",
5972796,
"alv-gtm",
}
m["alv-kul"] = {
"Kulango",
16977424,
"alv-sav",
aliases = {"Kulango-Lorhon", "Kulango-Lorom"},
}
m["alv-kwa"] = {
"Kwa",
33430,
"nic-vco",
}
m["alv-lag"] = {
"Lagoon",
111210042,
"alv-kwa",
}
m["alv-lek"] = {
"Leko",
6520642,
other_names = {"Sambaic"},
"alv-lni",
}
m["alv-lim"] = {
"Limba",
35825,
"alv",
}
m["alv-lni"] = {
"Leko-Nimbari",
1708170,
"alv-ada",
other_names = {"Adamawa Tengah"},
aliases = {"Chamba-Mumuye"},
}
m["alv-mbd"] = {
"Mbum-Day",
6799816,
"alv-ada",
}
m["alv-mbm"] = {
"Mbum",
6799814,
"alv-mbd",
}
m["alv-mel"] = {
"Mel",
12122355,
"alv",
}
m["alv-mum"] = {
"Mumuye",
84607009,
"alv-mye",
}
m["alv-mye"] = {
"Mumuye-Yendang",
6935539,
"alv-lni",
}
m["alv-nal"] = {
"Nalu",
nil,
"alv-sng",
}
m["alv-nce"] = {
"Edoid Utara-Tengah",
16110869,
"alv-edo",
}
m["alv-ngb"] = {
"Nupe-Gbagyi",
12638649,
"alv-nup",
aliases = {"Nupe-Gbari"},
}
m["alv-ntg"] = {
"Na-Togo",
nil,
"alv-gtm",
}
m["alv-nup"] = {
"Nupoid",
1429143,
"alv-von",
}
m["alv-nwd"] = {
"Edo Barat Laut",
16111012,
"alv-edo",
}
m["alv-nyn"] = {
"Nyun",
nil,
"alv-fwo",
}
m["alv-pap"] = {
"Papel",
7132562,
"alv-bak",
}
m["alv-pph"] = {
"Phla-Pherá",
3849625,
"alv-gbe",
}
m["alv-ptn"] = {
"Potou-Tano",
1475003,
"alv-kwa",
}
m["alv-sav"] = {
"Savana",
4403672,
"nic-vco",
aliases = {"Savannas"},
}
m["alv-sma"] = {
"Suppire-Mamara",
4446348,
"alv-snf",
aliases = {"Suppire-Mamara"},
}
m["alv-snf"] = {
"Senufo",
33795,
"alv",
aliases = {"Senufic", "Senoufo", "Sénoufo"},
}
m["alv-sng"] = {
"Senegambia",
1708753,
"alv",
}
m["alv-snr"] = {
"Senari",
4416084,
"alv-snf",
}
m["alv-swd"] = {
"Edoid Barat Daya",
12633903,
"alv-edo",
}
m["alv-tal"] = {
"Talodi",
12643302,
"alv-the",
}
m["alv-tdj"] = {
"Tagwana-Djimini",
7675362,
"alv-snf",
}
m["alv-ten"] = {
"Tenda",
3217535,
"alv-fwo",
}
m["alv-the"] = {
"Talodi-Heiban",
1521145,
"alv",
}
m["alv-von"] = {
"Volta-Niger",
34177,
"nic-vco",
}
m["alv-wan"] = {
"Wara-Natyoro",
7968830,
"alv-sav",
}
m["alv-wjk"] = {
"Waja-Kam",
nil,
"alv-ada",
}
m["alv-yek"] = {
"Yekhee",
nil,
"alv-nce",
}
m["alv-yor"] = {
"Yoruba",
nil,
"alv-edk",
}
m["alv-yrd"] = {
"Yoruboid",
1789745,
"alv-von",
}
m["alv-yun"] = {
"Yungur",
84601642,
"alv-bam",
aliases = {"Bena-Mboi"},
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation".
m["apa"] = {
"Apache",
27758,
"ath",
aliases = {"Athabaskan Selatan"},
}
m["aqa"] = {
"Alacalufan",
1288430,
}
m["aql"] = {
"Algik",
721612,
aliases = {"Algonquian-Ritwan", "Algonquian-Wiyot-Yurok"},
}
m["art"] = {
"buatan",
33215,
"qfa-not",
aliases = {"artificial", "planned"},
}
m["ath"] = {
"Athabaska",
27475,
"xnd",
}
m["ath-nor"] = {
"Athabaska Utara",
20738,
"ath",
aliases = {"Athabaskan Utara"},
}
m["ath-pco"] = {
"Athabaska Pesisir Pasifik",
20654,
"ath",
}
m["auf"] = {
"Arawa",
626772,
aliases = {"Arahuan", "Arauán", "Arawa", "Arawan", "Arawán"},
}
--[=[
Kod bahasa dan keluarga luar biasa untuk bahasa Aborigin Australia
boleh menggunakan awalan "aus-", walaupun "aus" bukan lagi kod keluarga itu sendiri.
]=]--
m["aus-arn"] = {
"Arnhem",
2581700,
aliases = {"Gunwinyguan", "Macro-Gunwinyguan"},
}
m["aus-bub"] = {
"Bunuba",
2495148,
aliases = {"Bunaban"},
}
m["aus-cww"] = {
"New South Wales Tengah",
5061507,
"aus-pam",
}
m["aus-dal"] = {
"Daly",
2478079,
}
m["aus-dyb"] = {
"Dyirbal",
1850666,
"aus-pam",
}
m["aus-gar"] = {
"Garawan",
5521951,
}
m["aus-gun"] = {
"Gunwinyguan",
2581700,
"aus-arn",
aliases = {"Gunwingguan"},
}
m["aus-jar"] = {
"Jarrakan",
2039423,
}
m["aus-kar"] = {
"Karnic",
4215578,
"aus-pam",
}
m["aus-mir"] = {
"Mirndi",
4294095,
}
m["aus-nga"] = {
"Ngayarda",
16153490,
"aus-psw",
}
m["aus-nyu"] = {
"Nyulnyulan",
2039408,
}
m["aus-pam"] = {
"Pama-Nyunga",
33942,
}
m["aus-pmn"] = {
"Pama",
2640654,
"aus-pam",
}
m["aus-psw"] = {
"Pama-Nyunga Barat Daya",
2258160,
"aus-pam",
}
m["aus-rnd"] = {
"Arandic",
4784071,
"aus-pam",
}
m["aus-tnk"] = {
"Tangkic",
1823065,
}
m["aus-wdj"] = {
"Iwaidjan",
4196968,
aliases = {"Yiwaidjan"},
}
m["aus-wor"] = {
"Worrorran",
2038619,
}
m["aus-yid"] = {
"Yidinyic",
4205849,
"aus-pam",
}
m["aus-yng"] = {
"Yangmanic",
42727644,
}
m["aus-yol"] = {
"Yolngu",
2511254,
"aus-pam",
aliases = {"Yolŋu", "Yolngu Matha"},
}
m["aus-yuk"] = {
"Yuin-Kuri",
3833021,
"aus-pam",
}
m["awd"] = {
"Arawak",
626753,
aliases = {"Arawakan", "Maipurean", "Maipuran"},
}
m["awd-nwk"] = {
"Nawiki",
nil,
"awd",
aliases = {"Newiki"},
}
m["awd-taa"] = {
"Ta-Arawak",
7672731,
"awd",
aliases = {"Ta-Arawakan", "Ta-Maipurean"},
}
m["azc"] = {
"Uto-Aztek",
34073,
aliases = {"Uto-Aztekan"},
}
m["azc-cup"] = {
"Cupan",
19866871,
"azc-tak",
}
m["azc-dur"] = {
"Nahuatl Durango",
2386361,
"azc-nah",
aliases = {"Mexicanero"}
}
m["azc-hua"] = {
"Nahuatl Huasteca",
3832950,
"azc-nah",
}
m["azc-nah"] = {
"Nahua",
11965602,
"azc",
aliases = {"Aztecan"},
}
m["azc-num"] = {
"Numi",
2657541,
"azc",
}
m["azc-pim"] = {
"Piman",
7194600,
"azc",
aliases = {"Tepiman"},
}
m["azc-tak"] = {
"Takic",
1280305,
"azc",
}
m["azc-trc"] = {
"Taracahitic",
4245032,
"azc",
aliases = {"Taracahitan"},
}
m["bad"] = {
"Banda",
806234,
"nic-ubg",
}
m["bad-cnt"] = {
"Banda Tengah",
3438391,
"bad",
}
m["bai"] = {
"Bamileke",
806005,
"nic-gre",
}
m["bat"] = {
"Baltik",
33136,
"ine-bsl",
}
m["bat-eas"] = {
"Baltik Timur",
149944,
"bat",
}
m["bat-wes"] = {
"Baltik Barat",
149946,
"bat",
}
m["ber"] = {
"Barbar",
25448,
"afa",
aliases = {"Tamazight"},
}
m["bnt"] = {
"Bantu",
33146,
"nic-bds",
}
m["bnt-baf"] = {
"Bafia",
799784,
"bnt",
}
m["bnt-bbo"] = {
"Bafo-Bonkeng",
nil,
"bnt-saw",
}
m["bnt-bdz"] = {
"Boma-Dzing",
1729203,
"bnt",
}
m["bnt-bek"] = {
"Bekwilic",
nil,
"bnt-ndb",
}
m["bnt-bki"] = {
"Bena-Kinga",
16113307,
"bnt-bne",
}
m["bnt-bmo"] = {
"Bangi-Moi",
nil,
"bnt-bnm",
}
m["bnt-bne"] = {
"Bantu Timur Laut",
7057832,
"bnt",
}
m["bnt-bnm"] = {
"Bangi-Ntomba",
806477,
"bnt-bte",
}
m["bnt-boa"] = {
"Boan",
4931250,
"bnt",
aliases = {"Buan", "Ababuan"},
}
m["bnt-bot"] = {
"Botatwe",
4948532,
"bnt",
}
m["bnt-bsa"] = {
"Basaa",
809739,
"bnt",
}
m["bnt-bsh"] = {
"Bushoong",
5001551,
"bnt-bte",
}
m["bnt-bso"] = {
"Bantu Selatan",
980498,
"bnt",
}
m["bnt-bta"] = {
"Bati-Angba",
4869303,
"bnt-boa",
other_names = {"Late Bomokandian"},
aliases = {"Bwa"},
}
m["bnt-btb"] = {
"Beti",
35118,
"bnt",
}
m["bnt-bte"] = {
"Bangi-Tetela",
4855181,
"bnt",
}
m["bnt-bun"] = {
"Buja-Ngombe",
4986733,
"bnt-mbb",
}
m["bnt-chg"] = {
"Chaga",
33016,
"bnt-cht",
}
m["bnt-cht"] = {
"Chaga-Taita",
nil,
"bnt-bne",
}
m["bnt-clu"] = {
"Chokwe-Luchazi",
3339273,
"bnt",
}
m["bnt-com"] = {
"Comoros",
33077,
"bnt-sab",
}
m["bnt-glb"] = {
"Bantu Tasik-Tasik Besar",
5599420,
"bnt-bne",
}
m["bnt-haj"] = {
"Haya-Jita",
25502360,
"bnt-glb",
}
m["bnt-kak"] = {
"Kako",
nil,
"bnt-pob",
}
m["bnt-kav"] = {
"Kavango",
116544179,
"bnt-ksb",
}
m["bnt-kbi"] = {
"Komo-Bira",
6428591,
"bnt-boa",
}
m["bnt-kel"] = {
"Kele",
1738162,
"bnt-kts",
aliases = {"Sheke"},
}
m["bnt-kil"] = {
"Kilombero",
6408121,
"bnt",
}
m["bnt-kka"] = {
"Kikuyu-Kamba",
16114410,
"bnt-bne",
aliases = {"Thagiicu"},
}
m["bnt-kmb"] = {
"Kimbundu",
16947687,
"bnt",
}
m["bnt-kng"] = {
"Kongo",
6429214,
"bnt",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["bnt-kpw"] = {
"Kpwe",
36428,
"bnt-saw",
}
m["bnt-ksb"] = {
"Bantu Kavango-Barat Daya",
6379098,
"bnt",
}
m["bnt-kts"] = {
"Kele-Tsogo",
6385577,
"bnt",
}
m["bnt-lbn"] = {
"Luban",
4536504,
"bnt",
}
m["bnt-leb"] = {
"Lebonya",
6511395,
"bnt",
}
m["bnt-lgb"] = {
"Lega-Binja",
6517694,
"bnt",
}
m["bnt-lok"] = {
"Logooli-Kuria",
nil,
"bnt-glb",
}
m["bnt-lub"] = {
"Luba",
nil,
"bnt-lbn",
}
m["bnt-lun"] = {
"Lunda",
6704091,
"bnt",
}
m["bnt-mak"] = {
"Makua",
6740431,
"bnt-bso",
aliases = {"Makhuwa"},
}
m["bnt-mbb"] = {
"Mboshi-Buja",
6799764,
"bnt",
}
m["bnt-mbe"] = {
"Mbole-Enya",
6799728,
"bnt",
}
m["bnt-mbi"] = {
"Mbinga",
nil,
"bnt-rur",
}
m["bnt-mbo"] = {
"Mboshi",
6799763,
"bnt-mbb",
}
m["bnt-mbt"] = {
"Mbete",
1346910,
"bnt-tmb",
aliases = {"Mbere"},
}
m["bnt-mby"] = {
"Mbeya",
nil,
"bnt-ruk",
}
m["bnt-mij"] = {
"Mijikenda",
6845474,
"bnt-sab",
}
m["bnt-mka"] = {
"Makaa",
nil,
"bnt-ndb",
}
m["bnt-mne"] = {
"Manenguba",
31147471,
"bnt",
aliases = {"Mbo", "Ngoe"},
}
m["bnt-mnj"] = {
"Makaa-Njem",
1603899,
"bnt-pob",
}
m["bnt-mon"] = {
"Mongo",
nil,
"bnt-bnm",
}
m["bnt-mra"] = {
"Mbugwe-Rangi",
6799795,
"bnt",
}
m["bnt-msl"] = {
"Masaba-Luhya",
12636428,
"bnt-glb",
}
m["bnt-mwi"] = {
"Mwika",
nil,
"bnt-ruk",
}
m["bnt-ncb"] = {
"Bantu Pesisir Timur Laut",
7057848,
"bnt-bne",
}
m["bnt-ndb"] = {
"Ndzem-Bomwali",
nil,
"bnt-mnj",
}
m["bnt-ngn"] = {
"Ngondi-Ngiri",
7022532,
"bnt-mbb",
}
m["bnt-ngu"] = {
"Nguni",
961559,
"bnt-bso",
aliases = {"Ngoni"},
}
m["bnt-nya"] = {
"Nyali",
7070832,
"bnt-leb",
}
m["bnt-nyb"] = {
"Nyanga-Buyi",
7070882,
"bnt",
}
m["bnt-nyg"] = {
"Nyoro-Ganda",
12638666,
"bnt-glb",
}
m["bnt-nys"] = {
"Nyasa",
7070921,
"bnt",
}
m["bnt-nze"] = {
"Nzebi",
1755498,
"bnt-tmb",
aliases = {"Njebi"},
}
m["bnt-ova"] = {
"Ovambo",
36489,
"bnt-swb",
aliases = {"Oshivambo", "Oshiwambo", "Owambo"},
}
m["bnt-par"] = {
"Pare",
nil,
"bnt-ncb",
}
m["bnt-pen"] = {
"Pende",
7162373,
"bnt",
}
m["bnt-pob"] = {
"Pomo-Bomwali",
nil,
"bnt",
}
m["bnt-ruk"] = {
"Rukwa",
7378902,
"bnt",
}
m["bnt-run"] = {
"Rungwe",
nil,
"bnt-ruk",
}
m["bnt-rur"] = {
"Rufiji-Ruvuma",
7377947,
"bnt",
}
m["bnt-ruv"] = {
"Ruvu",
nil,
"bnt-ncb",
}
m["bnt-rvm"] = {
"Ruvuma",
nil,
"bnt-rur",
}
m["bnt-sab"] = {
"Sabaki",
2209395,
"bnt-ncb",
}
m["bnt-saw"] = {
"Sawabantu",
532003,
"bnt",
}
m["bnt-sbi"] = {
"Sabi",
7396071,
"bnt",
}
m["bnt-seu"] = {
"Seuta",
nil,
"bnt-ncb",
}
m["bnt-shh"] = {
"Shi-Havu",
nil,
"bnt-glb",
}
m["bnt-sho"] = {
"Shona",
2904660,
"bnt",
}
m["bnt-sir"] = {
"Sira",
1436372,
"bnt",
aliases = {"Shira-Punu"},
}
m["bnt-ske"] = {
"Soko-Kele",
nil,
"bnt-bte",
}
m["bnt-sna"] = {
"Sena",
nil,
"bnt-nys",
}
m["bnt-sts"] = {
"Sotho-Tswana",
2038386,
"bnt-bso",
}
m["bnt-swb"] = {
"Bantu Barat Daya",
116543539,
"bnt-ksb",
}
m["bnt-swh"] = {
"Swahili",
nil,
"bnt-sab",
}
m["bnt-tek"] = {
"Teke",
36528,
"bnt-tmb",
}
m["bnt-tet"] = {
"Tetela",
7706059,
"bnt-bte",
}
m["bnt-tkc"] = {
"Teke Tengah",
36473,
"bnt-tek",
}
m["bnt-tkm"] = {
"Takama",
nil,
"bnt-bne",
}
m["bnt-tmb"] = {
"Teke-Mbede",
7695332,
"bnt",
aliases = {"Teke-Mbere"},
}
m["bnt-tso"] = {
"Tsogo",
2458420,
other_names = {"Okani"}, -- nampaknya merupakan alias dalam Glottolog
"bnt-kts",
}
m["bnt-tsr"] = {
"Tswa-Ronga",
12643962,
"bnt-bso",
}
m["bnt-yak"] = {
"Yaka",
8047027,
"bnt",
}
m["bnt-yko"] = {
"Yasa-Kombe",
nil,
"bnt-saw",
}
m["bnt-zbi"] = {
"Zamba-Binza",
nil,
"bnt-bnm",
}
m["btk"] = {
"Batak",
1998595,
"poz-nws",
}
--[=[
Kod bahasa dan keluarga luar biasa untuk bahasa Peribumi Amerika Tengah
boleh menggunakan awalan "cai-", walaupun "cai" bukan lagi kod keluarga itu sendiri.
]=]--
--[=[
Kod bahasa dan keluarga luar biasa untuk bahasa Kaukasia boleh menggunakan
awalan "cau-", walaupun "cau" bukan lagi kod keluarga itu sendiri.
]=]--
m["cau-abz"] = {
"Abkhaz-Abaza",
4663617,
"cau-nwc",
other_names = {"Abkhaz-Tapanta"},
aliases = {"Abazgi"},
}
m["cau-and"] = {
"Andi",
492152,
"cau-ava",
aliases = {"Andik"},
}
m["cau-ava"] = {
"Avar-Andi",
4055404,
"cau-nec",
aliases = {"Avar-Andian", "Avar-Andi", "Avar-Andik"},
}
m["cau-cir"] = {
"Circassia",
858543,
"cau-nwc",
aliases = {"Cherkess"},
}
m["cau-drg"] = {
"Dargwa",
5222637,
"cau-nec",
other_names = {"Dargin"},
}
m["cau-esm"] = {
"Samur Timur",
nil,
"cau-sam",
}
m["cau-ets"] = {
"Tsez Timur",
121437666,
"cau-tsz",
aliases = {"Tsezik Timur", "Didoik Timur"},
}
m["cau-lzg"] = {
"Lezgi",
2144370,
"cau-nec",
aliases = {"Lezgi", "Lezgian", "Lezgik"},
}
m["cau-nkh"] = {
"Nakh",
24441,
"cau-nec",
aliases = {"Kaukasia Utara-Tengah"},
}
m["cau-nec"] = {
"Kaukasus Timur Laut",
27387,
aliases = {"Dagestani", "Nakho-Dagestani", "Kaspia"},
}
m["cau-nwc"] = {
"Kaukasus Barat Laut",
33852,
aliases = {"Abkhaz-Adyghe", "Abkhazo-Adyghean", "Pontik"},
}
m["cau-sam"] = {
"Samur",
15229151,
"cau-lzg",
}
m["cau-ssm"] = {
"Samur Selatan",
nil,
"cau-sam",
}
m["cau-tsz"] = {
"Tsez",
1651530,
"cau-nec",
aliases = {"Tsezik", "Didoik"},
}
m["cau-vay"] = {
"Vainakh",
4102486,
"cau-nkh",
aliases = {"Veinakh", "Vaynakh"},
}
m["cau-wsm"] = {
"Samur Barat",
nil,
"cau-sam",
}
m["cau-wts"] = {
"Tsez Barat",
121437697,
"cau-tsz",
aliases = {"Tsezik Barat", "Didoik Barat"},
}
m["cba"] = {
"Chibcha",
520478,
"qfa-mch", -- atau tiada jika Makro-Chibchan dianggap tidak terbukti
}
m["ccs"] = {
"Kartvelia",
34030,
aliases = {"Kaukasia Selatan"},
}
m["ccs-gzn"] = {
"Georgia-Zan",
34030,
"ccs",
aliases = {"Karto-Zan"},
}
m["ccs-zan"] = {
"Zan",
2606912,
"ccs-gzn",
aliases = {"Zanuri", "Colchian"},
}
m["cdc"] = {
"Chad",
33184,
"afa",
}
m["cdc-cbm"] = {
"Chad Tengah",
2251547,
"cdc",
aliases = {"Biu-Mandara"},
}
m["cdc-est"] = {
"Chad Timur",
2276221,
"cdc",
}
m["cdc-mas"] = {
"Masa",
2136092,
"cdc",
}
m["cdc-wst"] = {
"Chad Barat",
2447774,
"cdc",
}
m["cdd"] = {
"Caddo",
1025090,
}
m["cel"] = {
"Keltik",
25293,
"ine",
}
m["cel-bry"] = {
"Briton",
156877,
"cel-ins",
aliases = {"Brittonic"},
}
m["cel-brs"] = {
"Briton Barat Daya",
2612853,
"cel-bry",
aliases = {"Brittonic Barat Daya"},
}
m["cel-brw"] = {
"Briton Barat",
593069,
"cel-bry",
aliases = {"Brittonic Barat"},
}
m["cel-gae"] = {
"Goidel",
56433,
"cel-ins",
aliases = {"Gaelik"},
protoLanguage = "pgl",
}
m["cel-his"] = {
"Hispano-Keltik",
4204136,
"cel",
}
m["cel-ins"] = {
"Keltik Kepulauan",
214506,
"cel",
}
m["chi"] = {
"Chimakuan",
1073088,
}
m["chm"] = {
"Mari",
973685,
"urj",
}
m["cmc"] = {
"Chamik",
2997506,
"poz-mcm",
}
m["crp"] = {
"kreol atau pijin",
19682167,
"qfa-cnt",
}
m["csu"] = {
"Sudan Tengah",
190822,
"ssa",
}
m["csu-bba"] = {
"Bongo-Bagirmi",
3505042,
"csu",
}
m["csu-bbk"] = {
"Bongo-Baka",
4941917,
"csu-bba",
}
m["csu-bgr"] = {
"Bagirmi",
4841948,
"csu-bba",
aliases = {"Bagirmik"},
}
m["csu-bkr"] = {
"Birri-Kresh",
nil,
"csu",
}
m["csu-ecs"] = {
"Sudan Tengah Timur",
16911698,
"csu",
aliases = {"Sudanik Timur Tengah", "Sudanik Tengah Timur", "Lendu-Mangbetu"},
}
m["csu-kab"] = {
"Kaba",
6343715,
"csu-bba",
}
m["csu-lnd"] = {
"Lendu",
6522357,
"csu-ecs",
aliases = {"Lenduik"},
}
m["csu-maa"] = {
"Mangbetu",
6748874,
"csu-ecs",
aliases = {"Mangbetu-Asoa", "Mangbetu-Asua"},
}
m["csu-mle"] = {
"Mangbutu-Lese",
17009406,
"csu-ecs",
aliases = {"Mangbutu-Efe", "Mangbutu", "Membi-Mangbutu-Efe"},
}
m["csu-mma"] = {
"Moru-Madi",
6915156,
"csu-ecs",
}
m["csu-sar"] = {
"Sara",
2036691,
"csu-bba",
}
m["csu-val"] = {
"Vale",
7909520,
"csu-bba",
}
m["cus"] = {
"Kusyi",
33248,
"afa",
}
m["cus-cen"] = {
"Kusyi Tengah",
56569,
"cus",
}
m["cus-eas"] = {
"Kusyi Timur",
56568,
"cus",
}
m["cus-hec"] = {
"Kusyi Timur Tanah Tinggi",
56524,
"cus-eas",
}
m["cus-som"] = {
"Somaloid",
56774,
"cus-eas",
aliases = {"Sam", "Makro-Somali"},
}
m["cus-sou"] = {
"Kusyi Selatan",
56525,
"cus",
}
m["day"] = {
"Dayak Darat",
2760613,
"poz",
}
m["del"] = {
"Lenape",
2665761,
"alg-eas",
aliases = {"Delaware"},
}
m["den"] = {
"Slavey",
13272,
"ath-nor",
aliases = {"Slave", "Slavé"},
}
m["dmn"] = {
"Mande",
33681,
"nic",
}
m["dmn-bbu"] = {
"Bisa-Busa",
12627956,
"dmn-mde",
}
m["dmn-emn"] = {
"Manding Timur",
nil,
"dmn-man",
}
m["dmn-jje"] = {
"Jogo-Jeri",
nil,
"dmn-mjo",
}
m["dmn-man"] = {
"Manding",
35772,
"dmn-mmo",
}
m["dmn-mda"] = {
"Mano-Dan",
nil,
"dmn-mse",
}
m["dmn-mdc"] = {
"Mande Tengah",
5972907,
"dmn-mdw",
}
m["dmn-mde"] = {
"Mande Timur",
12633080,
"dmn",
}
m["dmn-mdw"] = {
"Mande Barat",
16113831,
"dmn",
}
m["dmn-mjo"] = {
"Manding-Jogo",
12636153,
"dmn-mdc",
}
m["dmn-mmo"] = {
"Manding-Mokole",
nil,
"dmn-mva",
}
m["dmn-mnk"] = {
"Maninka",
36186,
"dmn-emn",
}
m["dmn-mnw"] = {
"Mande Barat Laut",
5972910,
"dmn-mdw",
}
m["dmn-mok"] = {
"Mokole",
16935447,
"dmn-mmo",
}
m["dmn-mse"] = {
"Mande Tenggara",
5972912,
"dmn-mde",
}
m["dmn-msw"] = {
"Mande Barat Daya",
12633904,
"dmn-mdw",
}
m["dmn-mva"] = {
"Manding-Vai",
nil,
"dmn-mjo",
}
m["dmn-nbe"] = {
"Nwa-Beng",
nil,
"dmn-mse",
}
m["dmn-sam"] = {
"Samo",
36327,
"dmn-bbu",
aliases = {"Samuik"},
}
m["dmn-smg"] = {
"Samogo",
7410000,
"dmn-mnw",
aliases = {"Duun-Seenku"},
}
m["dmn-snb"] = {
"Soninke-Bobo",
16111680,
"dmn-mnw",
}
m["dmn-sya"] = {
"Susu-Yalunka",
nil,
"dmn-mdc",
}
m["dmn-vak"] = {
"Vai-Kono",
nil,
"dmn-mva",
}
m["dmn-wmn"] = {
"Manding Barat",
nil,
"dmn-man",
}
m["dra"] = {
"Dravidia",
33311,
}
m["dra-cen"] = {
"Dravidia Tengah",
12628823,
"dra",
}
m["dra-gki"] = {
"Gondi-Kui",
12631610,
"dra-sdt",
}
m["dra-gon"] = {
"Gondi",
55639812,
"dra-gki",
}
m["dra-imd"] = {
"Irula-Muduga",
nil,
"dra-tkn",
}
m["dra-kan"] = {
"Kannadoid",
6363888,
"dra-tkn",
protoLanguage = "dra-okn",
}
m["dra-kki"] = {
"Konda-Kui",
nil,
"dra-gki",
}
m["dra-kml"] = {
"Kurukh-Malto",
68002822,
"dra-nor",
}
m["dra-knk"] = {
"Kolami-Naiki",
10547037,
"dra-cen",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["dra-kod"] = {
"Kodagu",
67983106,
"dra-tkd",
}
m["dra-kor"] = {
"Koraga",
33394,
"dra-tlk",
}
m["dra-mal"] = {
"Malayalamoid",
6741581,
"dra-tml",
}
m["dra-mdy"] = {
"Madiya",
27602,
"dra-gon",
}
m["dra-mlo"] = {
"Malto",
nil,
"dra-kml",
}
m["dra-mur"] = {
"Muria",
6938499,
"dra-gon",
}
m["dra-nor"] = {
"Dravidia Utara",
16110967,
"dra",
}
m["dra-pgd"] = {
"Parji-Gadaba",
10620428,
"dra-cen",
}
m["dra-sdo"] = {
"Dravidia Selatan I",
16112843, -- "South Dravidian" Wikipedia ialah Dravida Selatan I dalam skema ini.
"dra-sou",
aliases = {"Dravida Selatan"}, -- Inilah sebabnya I dan II digunakan.
}
m["dra-sdt"] = {
"Dravidia Selatan II",
12633975,
"dra-sou",
aliases = {"Dravida Selatan-Tengah"},
}
m["dra-sou"] = {
"Dravidia Selatan",
128886618,
"dra",
aliases = {"Dravida Selatan"},
}
m["dra-tam"] = {
"Tamiloid",
7681417,
"dra-tml",
protoLanguage = "oty",
}
m["dra-tel"] = {
"Telugu",
nil,
"dra-sdt",
protoLanguage = "dra-ote",
}
m["dra-tkd"] = {
"Tamil-Kodagu",
25494510,
"dra-tkn",
}
m["dra-tkn"] = {
"Tamil-Kannada",
6478506,
"dra-sdo",
}
m["dra-tkt"] = {
"Toda-Kota",
67983857,
"dra-tkd",
}
m["dra-tlk"] = {
"Tulu-Koraga",
nil,
"dra-sdo",
}
m["dra-tml"] = {
"Tamil-Malayalam",
10690507,
"dra-tkd",
}
m["egx"] = {
"Mesir",
50868,
"afa",
protoLanguage = "egy",
}
m["ero"] = {
"Horpa",
56854,
"sit-wgy",
}
m["esx"] = {
"Eskimo-Aleut",
25946,
}
m["esx-esk"] = {
"Eskimo",
25946,
"esx",
}
m["esx-inu"] = {
"Inuit",
27796,
"esx-esk",
}
m["euq"] = {
"Vasco",
4669240,
}
m["gba"] = {
"Gbaya",
3099986,
"alv-sav",
}
m["gba-eas"] = {
"Gbaya Timur",
nil,
"gba",
}
m["gba-sou"] = {
"Gbaya Selatan",
nil,
"gba",
}
m["gba-wes"] = {
"Gbaya Barat",
nil,
"gba",
}
m["gem"] = {
"Jermanik",
21200,
"ine",
}
m["gio"] = {
"Gelao",
56401,
"qfa-kra",
}
m["gme"] = {
"Jermanik Timur",
108662,
"gem",
}
m["gmq"] = {
"Jermanik Utara",
106085,
"gem",
}
m["gmq-eas"] = {
"Skandinavia Timur",
3090263,
"gmq",
protoLanguage = "non-oen",
}
m["gmq-ins"] = {
"Skandinavia Kepulauan",
nil,
"gmq-wes",
}
m["gmq-wes"] = {
"Skandinavia Barat",
1792570,
"gmq",
protoLanguage = "non-own",
}
m["gmw"] = {
"Jermanik Barat",
26721,
"gem",
}
m["gmw-afr"] = {
"Anglo-Frisia",
5329170,
"gmw-nsg",
}
m["gmw-ang"] = {
"Anglia",
1346342,
"gmw-afr",
protoLanguage = "ang",
}
m["gmw-fri"] = {
"Frisia",
25325,
"gmw-afr",
protoLanguage = "ofs",
}
m["gmw-frk"] = {
"Franconia Tanah Rendah",
153050,
"gmw",
protoLanguage = "frk",
}
m["gmw-hgm"] = {
"Jerman Tanah Tinggi",
52040,
"gmw",
protoLanguage = "goh",
}
m["gmw-ian"] = {
"Anglo-Norman Ireland",
120719384,
"gmw-ang",
protoLanguage = "enm",
}
m["gmw-lgm"] = {
"Jerman Tanah Rendah",
25433,
"gmw-nsg",
protoLanguage = "osx",
}
m["gmw-nsg"] = {
"Jermanik Laut Utara",
30134,
"gmw",
aliases = {"Ingvaeonik"},
}
m["gn"] = {
"Guarani",
35876,
"tup-gua",
aliases = {"Guaraní"},
}
m["grb"] = {
"Grebo tepat",
35257,
"kro-grb",
}
m["grk"] = {
"Hellenik",
2042538,
"ine",
aliases = {"Yunani"},
}
m["him"] = {
"Western Pahari",
10939493,
"inc-pah",
aliases = {"Himachali"},
}
m["hmn"] = {
"Hmong",
3307894,
"hmx",
}
m["hmx"] = {
"Hmong-Mien",
33322,
aliases = {"Miao-Yao"},
}
m["hmx-mie"] = {
"Mien",
7992695,
"hmx",
}
m["hok"] = {
"Hokan",
33406,
}
m["hyx"] = {
"Armenia",
8785,
"ine",
}
m["iir"] = {
"Indo-Iran",
33514,
"ine",
}
m["iir-nur"] = {
"Nuristani",
161804,
"iir",
}
m["nur-nor"] = {
"Nuristan Utara",
nil,
"iir-nur",
}
m["nur-sou"] = {
"Nuristan Selatan",
nil,
"iir-nur",
}
m["ijo"] = {
"Ijoid",
1325759,
"nic",
other_names = {"Ijaw"}, -- Ijaw mungkin satu subkeluarga
}
m["inc"] = {
"Indo-Arya",
33577,
"iir",
aliases = {"Indik"},
}
m["inc-bas"] = {
"Benggali–Assam",
4179137,
"inc-eas",
aliases = {"Assam-Bengali", "Gauda-Kamarupa"},
}
m["inc-bhi"] = {
"Bhil",
4901727,
"inc-cen",
}
m["inc-bih"] = {
"Bihar",
135305,
"inc-eas",
}
m["inc-cen"] = {
"Indo-Arya Pusat",
10979187,
"inc",
protoLanguage = "inc-asa",
}
m["inc-chi"] = {
"Chitral",
11732797,
"inc-dar",
}
m["inc-dar"] = {
"Dard",
161101,
"inc",
protoLanguage = "inc-ash",
}
m["inc-dre"] = {
"Dard Timur",
nil,
"inc-dar",
}
m["inc-dng"] = {
"Dangari",
nil,
"inc-shn",
}
m["inc-eas"] = {
"Indo-Arya Timur",
12593391,
"inc",
protoLanguage = "inc-aav",
}
m["inc-hal"] = {
"Halbic",
16910593,
"inc-eas",
aliases = {"Halbi"},
}
m["inc-hie"] = {
"Hindi Timur",
4126648,
"inc-cen",
aliases = {"Purabiyā"},
protoLanguage = "inc-oaw",
}
m["inc-hiw"] = {
"Hindi Barat",
12600937,
"inc-cen",
protoLanguage = "inc-ohi",
}
m["inc-hnd"] = {
"Hindustan",
11051,
"inc-hiw",
aliases = {"Hindi-Urdu"},
protoLanguage = "hi-mid",
}
m["inc-ins"] = {
"Indo-Arya Kepulauan",
12179302,
"inc",
protoLanguage = "inc-apa",
}
m["inc-kas"] = {
"Kashmir",
nil,
"inc-dre",
aliases = {"Kashmiri"},
}
m["inc-koh"] = {
"Kohistani",
13018610,
"inc-dre",
}
m["inc-krd"] = {
"Bahasa-bahasa KRDS",
6356154,
"inc-eas",
aliases = {"Kamta, Rajbanshi, Deshi dan Surjapuri", "Bahasa-bahasa KRNB", "Kamta, Rajbanshi dan Bangla Deshi Utara"},
}
m["inc-kun"] = {
"Kunar",
nil,
"inc-dar",
}
m["inc-mid"] = {
"Indo-Arya Tengah",
3236316,
"inc",
aliases = {"Indik Pertengahan"},
}
m["inc-nwe"] = {
"Indo-Arya Barat Laut",
16111018,
"inc",
protoLanguage = "inc-apa",
}
m["inc-nor"] = {
"Indo-Arya Utara",
946077,
"inc",
protoLanguage = "inc-aka",
}
m["inc-old"] = {
"Indo-Arya Kuno",
118976896,
"inc",
aliases = {"Indik Kuno"},
}
m["inc-pac"] = {
"Pahari Tengah",
nil,
"inc-pah",
}
m["inc-pae"] = {
"Pahari Timur",
nil,
"inc-pah",
}
m["inc-pah"] = {
"Pahari",
946077,
"inc-nor",
aliases = {"Pahadi"},
protoLanguage = "inc-aka",
}
m["inc-pan"] = {
"Punjabi",
2656685,
"inc-nwe",
aliases = {"Punjabik Raya"},
protoLanguage = "inc-opa",
}
m["inc-pas"] = {
"Pashayi",
36670,
"inc-dar",
aliases = {"Pashai"},
}
m["inc-rom"] = {
"Romani",
13201,
"inc-wes",
aliases = {"Romany", "Gipsi"},
}
m["inc-sad"] = {
"Sadanik",
109546827,
"inc-bih",
aliases = {"Sadani"},
}
m["inc-shn"] = {
"Shinaic",
12646125,
"inc-dre",
}
m["inc-snd"] = {
"Sindhi",
7522212,
"inc-nwe",
protoLanguage = "inc-avr",
}
m["inc-sou"] = {
"Indo-Arya Selatan",
10856062,
"inc",
protoLanguage = "inc-ama",
}
m["inc-tha"] = {
"Tharu",
34035,
"inc-eas",
}
m["inc-wes"] = {
"Indo-Arya Barat",
nil,
"inc",
protoLanguage = "inc-agu",
}
m["ine"] = {
"Indo-Eropah",
19860,
aliases = {"Indo-Jermanik"},
}
m["ine-ana"] = {
"Anatolia",
147085,
"ine",
}
m["ine-bsl"] = {
"Balto-Slavik",
147356,
"ine",
}
m["ine-luw"] = {
"Luwic",
115748615,
"ine-ana",
aliases = {"Luvik"},
}
m["ine-toc"] = {
"Tocharia",
37029,
"ine",
aliases = {"Tokharian"},
}
m["ira"] = {
"Iran",
33527,
"iir",
}
m["ira-csp"] = {
"Caspian",
5049123,
"ira-mpr",
}
m["ira-cen"] = {
"Iran Pusat",
nil,
"ira",
}
m["ira-kms"] = {
"Komisenian",
nil,
"ira-mpr",
aliases = {"Semnani"},
}
m["ira-lur"] = {
"Lurik",
nil, -- ?
"ira-swi",
}
m["ira-mid"] = {
"Iran Tengah",
6841465,
"ira",
}
m["ira-mny"] = {
"Munji-Yidgha",
nil,
"ira-sym",
aliases = {"Yidgha-Munji"},
}
m["ira-msh"] = {
"Mazanderani-Shahmirzadi",
nil,
"ira-csp",
}
m["ira-nei"] = {
"Iran Timur Laut",
10775567,
"ira",
}
m["ira-nwi"] = {
"Iran Barat Laut",
390576,
"ira-wes",
}
m["ira-old"] = {
"Iran Kuno",
23301845,
"ira",
}
m["ira-orp"] = {
"Ormuri-Parachi",
nil,
"ira-sei",
}
m["ira-pat"] = {
"Pathan",
nil,
"ira-sei",
}
m["ira-sbc"] = {
"Sogdo-Bactria",
nil,
"ira-nei",
}
m["ira-mpr"] = {
"Medo-Parthia",
nil,
"ira-nwi",
aliases = {"Partho-Media"},
}
m["ira-sgi"] = {
"Sanglechi-Ishkashimi",
18711232,
"ira-sei",
}
m["ira-shr"] = {
"Shughni-Roshani",
11732824,
"ira-shy",
}
m["ira-shy"] = {
"Shughni-Yazghulami",
nil,
"ira-sym",
}
m["ira-sgc"] = {
"Sogdia",
nil,
"ira-sbc",
aliases = {"Sogdian"},
}
m["ira-sei"] = {
"Iran Tenggara",
3833002,
"ira",
}
m["ira-swi"] = {
"Iran Barat Daya",
390424,
"ira-wes",
}
m["ira-sym"] = {
"Shughni-Yazghulami-Munji",
nil,
"ira-sei",
}
m["ira-wes"] = {
"Iran Barat",
129850,
"ira",
}
m["ira-zgr"] = {
"Zaza-Gorani",
167854,
"ira-mpr",
aliases = {"Zaza-Gurani", "Gorani-Zaza"},
}
m["iro"] = {
"Iroquois",
33623,
}
m["iro-nor"] = {
"Iroquois Utara",
nil,
"iro",
}
m["itc"] = {
"Italik",
131848,
"ine",
}
m["itc-laf"] = {
"Latino-Falisci",
33478,
"itc",
aliases = {"Latinian"},
}
m["itc-sbl"] = {
"Osco-Umbria",
515194,
"itc",
aliases = {"Sabelik", "Sabelian"},
}
m["jpx"] = {
"Jepunik",
33612,
aliases = {"Jepun", "Jepun-Ryukyu"},
}
m["jpx-nry"] = {
"Ryukyu Utara",
20862796,
"jpx-ryu",
}
m["jpx-ryu"] = {
"Ryukyu",
56393,
"jpx",
}
m["jpx-sry"] = {
"Ryukyu Selatan",
18392243,
"jpx-ryu",
}
m["kar"] = {
"Karen",
1364815,
"sit",
}
m["kca"] = {
"Khanty",
33563,
"urj-ugr",
aliases = {"Khantyik", "Khantik"},
}
--[=[
Kod bahasa dan keluarga luar biasa bagi bahasa Khoisan dan Kordofania boleh menggunakan
awalan "khi-" dan "kdo-" masing-masing, walaupun ia bukan lagi kod keluarga itu sendiri.
]=]--
m["khi-kal"] = {
"Kalahari Khoe",
nil,
"khi-kho",
}
m["khi-khk"] = {
"Khoekhoe",
nil,
"khi-kho",
}
m["khi-kkw"] = {
"Khoe-Kwadi",
60785084,
aliases = {"Kwadi-Khoe"},
}
m["khi-kho"] = {
"Khoe",
2736449,
"khi-kkw",
aliases = {"Khoisan Tengah"},
}
m["khi-kxa"] = {
"Kx'a",
6450587,
aliases = {"Kxa", "Ju-ǂHoan"},
}
m["khi-tuu"] = {
"Tuu",
631046,
aliases = {"Kwi", "Taa-Kwi", "Khoisan Selatan", "Taa-ǃKwi", "Taa-ǃUi", "ǃUi-Taa"},
}
m["kro"] = {
"Kru",
33535,
"nic-vco",
}
m["kro-aiz"] = {
"Aizi",
4699431,
"kro",
}
m["kro-bet"] = {
"Bété",
32956,
"kro-ekr",
}
m["kro-did"] = {
"Dida",
32685,
"kro-ekr",
}
m["kro-ekr"] = {
"Eastern Kru",
5972899,
"kro",
}
m["kro-grb"] = {
"Grebo",
5601537,
"kro-wkr",
}
m["kro-wee"] = {
"Wee",
nil,
"kro-wkr",
}
m["kro-wkr"] = {
"Kru Barat",
5972897,
"kro",
}
m["ku"] = {
"Kurdi",
36368,
"ira-nwi",
}
m["kv"] = {
"Komi",
36126, -- "Bahasa Komi" di Wikipedia tetapi merujuk khusus kepada Komi-Zyrian; tiada item Wikidata untuk keluarga Komi
"urj-prm",
}
m["map"] = {
"Austronesia",
49228,
}
m["map-ata"] = {
"Atayal",
716610,
"map",
}
m["mjg"] = {
"Monguor",
34214,
"xgn-shr",
}
m["mkh"] = {
"Mon-Khmer",
33199,
"aav",
}
m["mkh-asl"] = {
"Asli",
3111082,
"mkh",
}
m["mkh-ban"] = {
"Bahnar",
56309,
"mkh",
}
m["mkh-kat"] = {
"Katu",
56697,
"mkh",
}
m["mkh-khm"] = {
"Khmu",
1323245,
"mkh",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["mkh-kmr"] = {
"Khmer",
nil,
"mkh",
}
m["mkh-mnc"] = {
"Mon",
3217497,
"mkh",
}
m["mkh-mng"] = {
"Mang",
3509556,
"mkh",
}
m["mkh-nbn"] = {
"Bahnar Utara",
56309,
"mkh-ban",
}
m["mkh-pal"] = {
"Palaung",
2391173,
"mkh",
}
m["mkh-pea"] = {
"Pear",
3073022,
"mkh",
}
m["mkh-pkn"] = {
"Pakan",
nil,
"mkh-mng",
}
m["mkh-vie"] = {
"Viet",
2355546,
"mkh",
}
m["mno"] = {
"Manobo",
3217483,
"phi",
}
m["mns"] = {
"Mansi",
33759,
"urj-ugr",
aliases = {"Mansik"},
}
m["mun"] = {
"Munda",
33892,
"aav",
}
m["myn"] = {
"Maya",
33738,
}
--[=[
Kod bahasa dan keluarga luar biasa bagi bahasa-bahasa Peribumi Amerika Utara
boleh menggunakan awalan "nai-", walaupun "nai" bukan lagi kod keluarga itu sendiri.
]=]--
m["nai-cat"] = {
"Catawba",
3446638,
"nai-sca",
}
m["nai-chu"] = {
"Chumashan",
1288420,
}
m["nai-ckn"] = {
"Chinook",
610586,
}
m["nai-coo"] = {
"Coosan",
940278,
}
m["nai-jcq"] = {
"Jicaquean",
12179308,
"hok",
}
m["nai-ker"] = {
"Keresan",
35878,
}
m["nai-klp"] = {
"Kalapuyan",
1569040,
}
m["nai-kta"] = {
"Kiowa-Tanoan",
386288,
}
m["nai-len"] = {
"Lenca",
36189,
aliases = {"Lenca"},
}
m["nai-mdu"] = {
"Maiduan",
33502,
}
m["nai-miz"] = {
"Mixe-Zoque",
954016,
aliases = {"Mixe-Zoque"},
}
m["nai-min"] = {
"Misumalpa",
281693,
"qfa-mch",
aliases = {"Misuluan", "Misumalpa"},
}
m["nai-mus"] = {
"Muscogee",
902978,
aliases = {"Muskhogean"},
}
m["nai-pak"] = {
"Pakawan",
65085487,
"hok",
}
m["nai-pal"] = {
"Palaihnihan",
1288332,
}
m["nai-plp"] = {
"Pen-Uti Penara",
2307476,
}
m["nai-pom"] = {
"Pomo",
2618420,
"hok",
aliases = {"Pomo", "Kulanapan"},
}
m["nai-sca"] = {
"Sioux-Catawba",
34181,
}
m["nai-shp"] = {
"Sahaptian",
114782,
"nai-plp",
}
m["nai-shs"] = {
"Shastan",
2991735,
"hok",
}
m["nai-tot"] = {
"Totozoquean",
7828419,
}
m["nai-ttn"] = {
"Totonacan",
34039,
aliases = {"Totonak-Tepehua", "Totonakan-Tepehuan"},
varieties = {"Totonak"},
}
m["nai-tqn"] = {
"Tequistlatecan",
1568317,
"hok",
aliases = {"Tequistlatec", "Chontal", "Chontalan", "Chontal Oaxaca", "Chontal dari Oaxaca"},
}
m["nai-tsi"] = {
"Tsimshian",
34134,
}
m["nai-utn"] = {
"Uti",
13371763,
"nai-you",
aliases = {"Miwok-Costanoan", "Mutsun"},
}
m["nai-wtq"] = {
"Wintuan",
1294259,
aliases = {"Wintun"},
}
m["nai-xin"] = {
"Xinca",
1546494,
aliases = {"Xinca"},
}
m["nai-ykn"] = {
"Yuki",
2406722,
aliases = {"Yuki-Wappo"},
}
m["nai-you"] = {
"Yok-Uti",
2886186,
}
m["nai-yuc"] = {
"Yuman-Cochimí",
579137,
}
m["ngf"] = {
"Trans-New Guinea",
34018,
}
m["ngf-ais"] = {
"Aisian",
nil,
"ngf-eso",
}
m["ngf-ang"] = {
"Angan",
3217366,
"ngf",
aliases = {"Banjaran Kratke"}, -- Usher
}
m["ngf-ank"] = {
"Angal-Kewa",
12626916, -- wujud dalam dewiki dan hrwiki
"ngf-sak",
}
m["ngf-ask"] = {
"Asmat-Kamoro",
3031400,
"ngf",
-- Wikipedia menggunakan Asmat-Kamoro untuk merujuk kepada kelompok yang lebih sempit tanpa bahasa-bahasa Sabakor (Buruwai dan Kamberau,
-- yang dipecahkan oleh Glottolog kepada Kamrau Utara dan Kamrau Selatan [sic]), dan menggunakan Asmat-Kamrau untuk merujuk kepada apa yang kita
-- dan Glottolog panggil Asmat-Kamoro. Glottolog tidak mengiktiraf pengelompokan yang lebih sempit ini.
aliases = {"Asmat-Kamrau", -- Wikipedia
"Teluk Asmat-Kamrau", -- Usher
},
}
m["ngf-asm"] = {
"Asmat",
4807421,
"ngf-ask",
}
m["ngf-ata"] = {
"Ankave-Tainae-Akoye",
nil,
"ngf-ang",
aliases = {"Banjaran Kratke Barat Daya"}, -- Usher
}
m["ngf-awd"] = {
"Awyu-Dumut", -- [[w:Awyu-Dumut languages]] dilencongkan ke [[w:Greater Awyu languages]]
4830163, -- wujud dalam eswiki, hrwiki dan ruwiki
"ngf-gaw",
aliases = {"Sungai Digul Tengah"}, -- Usher
}
m["ngf-awy"] = {
"Awyu",
96372866,
"ngf-awd",
}
m["ngf-bda"] = {
"Becking-Dawi",
nil, -- Q55993716 ([[Category:Becking–Dawi languages]]) wujud dalam enwiki
"ngf-gaw",
aliases = {"Sungai Becking dan Dawi"}, -- Usher
}
m["ngf-bin"] = {
"Binanderean",
3217374, -- Wikidata tidak membezakan Binanderean daripada Binanderean Raya
"ngf-gbi",
aliases = {"Oro"}, -- Usher (2020)
}
m["ngf-boa"] = {
"Boane",
nil,
"ngf-era",
aliases = {"Boana", -- nama Glottolog
"Wain"}, -- tiada dalam Usher; "Wain" sering mengecualikan Mungkip, mungkin kerana kurang didokumentasikan
}
m["ngf-bos"] = {
"Bosavi",
4947122,
"ngf",
aliases = {"Penara Papua"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["ngf-bsi"] = {
"Baruya-Simbari",
nil,
"ngf-ang",
aliases = {"Banjaran Kratke Barat Laut"}, -- Usher
}
m["ngf-cda"] = {
"Dani Tengah",
nil,
"ngf-dan",
aliases = {"Dani"}, -- Usher
}
m["ngf-chw"] = {
"Chimbu-Wahgi",
3217383,
"ngf",
aliases = {"Simbu-Tanah Tinggi Barat"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["ngf-dag"] = {
"Dagan",
5208454,
"ngf", -- tidak diterima sebagai TNG oleh Glottolog tetapi diterima oleh sumber-sumber lain
aliases = {"Banjaran Meneao"},
}
m["ngf-dal"] = {
"Dallman",
nil,
"ngf-huo",
aliases = {"Kinalakna-Kumukio", -- Pawley-Hammarström, yang mengecualikan Nomu, namun mereka hanya mempunyai senarai angka bahasa tersebut untuk dirujuk
"Huon Timur Laut"}, -- Usher
}
m["ngf-dan"] = {
"Dani",
3217389,
"ngf",
-- Wikipedia menamakan semula bahasa-bahasa Dani kepada bahasa-bahasa Lembah Baliem dan kadangkala (tetapi tidak konsisten)
-- mengekalkan nama Dani (atau "Dani tepat") untuk kelompok yang lebih sempit mengecualikan Wano dan bahasa-bahasa Ngalik
-- yang kurang didokumentasikan (Nduga, Silimo, dan gugusan dialek Yali, yang mana kita, menurut Ethnologue dan Glottolog, bahagikan kepada
-- Yali Anggurk, Yali Ninia dan Yali Lembah Pass). Glottolog tidak mengiktiraf pengelompokan yang lebih sempit ini.
aliases = {"Lembah Baliem", -- Wikipedia
"Lembah Balim"}, -- Usher
}
m["ngf-dum"] = {
"Dumut", -- [[w:Dumut languages]] dilencongkan ke [[w:Greater Awyu languages]]
nil,
"ngf-awd",
aliases = {"Wambon"}, -- Usher
}
m["ngf-ehu"] = {
"Huon Timur", -- Glottolog menambah Ono dan Sialum, Pawley-Hammarström menambah Dedua
10567087,
"ngf-huo",
aliases = {"Huon Timur"}, -- Usher
}
m["ngf-eku"] = {
"Kutubuan Timur",
5328752,
"ngf", -- Tidak dalam TNG mengikut Glottolog tetapi diterima oleh yang lain. Kadangkala dikelompokkan bersama Fasu membentuk keluarga Kutubuan.
aliases = {"Kutubu Timur"}, -- nama Glottolog
}
m["ngf-enc"] = {
"Engik",
nil,
"ngf-eng",
aliases = {"Engan", -- Glottolog
"Engan tepat", -- Wikipedia
"Engan Utara", -- nama alternatif yang diberikan oleh Wikipedia
"Trans-Enga"}, -- Usher
}
m["ngf-eng"] = {
"Engan",
3217449,
"ngf",
aliases = {"Enga-Kewa-Huli", -- Glottolog, Pawley-Hammarström
"Enga-Tanah Tinggi Selatan"}, -- Usher
}
m["ngf-era"] = {
"Erap",
nil,
"ngf-fin",
aliases = {"Sungai Erap"}, -- Usher?
}
m["ngf-eso"] = {
"Sogeram Timur",
nil,
"ngf-sog",
}
m["ngf-est"] = {
"Strickland Timur",
5329440,
"ngf",
aliases = {"Sungai Strickland"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["ngf-eva"] = {
"Evapia",
nil,
"ngf-rai",
aliases = {"Sungai Evapia"}, -- Usher
}
m["ngf-fgi"] = {
"Fore-Gimi",
nil,
"ngf-gor",
aliases = {"Goroka Selatan"}, -- Usher
}
m["ngf-fhu"] = {
"Finisterre-Huon",
3217453,
"ngf",
aliases = {"Banjaran Finisterre-Semenanjung Huon"}, -- per Usher
}
m["ngf-fin"] = {
"Finisterre",
5450373,
"ngf-fhu",
aliases = {"Finisterre-Saruwaged", -- nama Glottolog
"Banjaran Finisterre"}, -- per Usher
}
m["ngf-gah"] = {
"Gahuku",
nil,
"ngf-gor",
aliases = {"Sungai Alekano-Asaro"}, -- Usher
}
m["ngf-gau"] = {
"Gauwa",
nil,
"ngf-kai",
aliases = {"Kainantu Barat"}, -- Usher
}
m["ngf-gaw"] = {
"Awyu Raya",
12627424,
"ngf",
aliases = {"Sungai Digul"}, -- digunakan oleh Usher (2020)
}
m["ngf-gbi"] = {
"Binanderean Raya",
3217374, -- Wikidata tidak membezakan Binanderean daripada Binanderean Raya
"ngf", -- tidak diletakkan dalam Trans-New Guinea dalam Usher (2020)
aliases = {"Guhu-Oro"}, -- Guhu-Oro digunakan dalam Usher (2020)
}
m["ngf-gko"] = {
"Gaena-Korafe",
11732347, -- dianggap sebagai bahasa Korafe tunggal oleh Wikipedia
"ngf-bin",
aliases = {"Gaina-Korafe"}, -- Usher
}
m["ngf-gmo"] = {
"Gusap-Mot",
16110857,
"ngf-fin",
aliases = {"Sungai Mot"}, -- Usher?
}
m["ngf-gor"] = {
"Goroka",
15478597,
"ngf-kgo",
}
m["ngf-gsu"] = {
"Gogodala-Suki",
5577428,
"ngf", -- Kemungkinan dalam keluarga Teluk Papua yang dicadangkan. Bukan dalam TNG per Glottolog tetapi diterima oleh semua yang lain.
aliases = {"Suki-Gogodala", -- nama Glottolog
"Sungai Suki-Aramia"}, -- digunakan dalam Usher (2020)
}
m["ngf-gum"] = {
"Gum",
5618008,
"ngf-mab",
}
m["ngf-gvd"] = {
"Dani Lembah Besar", -- dianggap sebagai bahasa tunggal oleh Wikipedia
5595219,
"ngf-cda",
}
m["ngf-hag"] = {
"Hagen", -- [[w:Hagen languages]] dilencongkan ke [[w:Chimbu–Wahgi languages]]
nil,
"ngf-chw",
aliases = {"Sungai Melpa-Kaugel"}, -- Usher
}
m["ngf-han"] = {
"Hanseman",
5651020,
"ngf-mab",
aliases = {"Banjaran Hansemann"}, -- Usher
}
m["ngf-huo"] = {
"Huon",
5946109,
"ngf-fhu",
aliases = {"Semenanjung Huon"}, -- per Usher
}
m["ngf-jim"] = {
"Jimi", -- [[w:Jimi languages]] dan [[w:Jimi River languages]] dilencongkan ke [[w:Chimbu–Wahgi languages]]
nil,
"ngf-chw",
aliases = {"Sungai Jimi"}, -- Usher
}
m["ngf-kab"] = {
"Kabwum",
nil,
"ngf-huo",
aliases = {"Timbe-Selepet-Komba", -- Pawley-Hammarström
"Huon Barat Laut"}, -- Usher
}
m["ngf-kai"] = {
"Kainantu", -- Kambaira: di bawah "Kainantu tidak terkelas" (Glottolog), Tairora (Pawley-Hammarström), Gauwa (Usher)
15478590,
"ngf-kgo",
aliases = {"Gadsup-Auyana-Awa-Tairora"}, -- Wurm
}
m["ngf-kak"] = {
"Kalam-Kobon",
6350303,
"ngf-ksa",
aliases = {"Kalam",
"Sungai Kaironk"}, -- Usher (2020)
}
m["ngf-kau"] = {
"Kaukombar",
nil,
"ngf-nad",
aliases = {"Kaukombaran", -- Glottolog mengikut Z'graggen (1975)
"Sungai Kaukombar"}, -- istilah Usher
}
m["ngf-kbm"] = {
"Kosorong-Burum-Mindik",
nil,
"ngf-huo",
aliases = {"Sungai Bulum"}, -- Usher
}
m["ngf-kgo"] = {
"Kainantu-Goroka",
3217463,
"ngf",
aliases = {"Tanah Tinggi Timur"}, -- per Usher (2020)
}
m["ngf-khu"] = {
"Kewa-Huli",
nil,
"ngf-eng",
aliases = {"Huli-Tanah Tinggi Selatan"}, -- Usher
}
m["ngf-kma"] = {
"Kâte-Mape",
nil,
"ngf-ehu",
aliases = {"Kate-Mape-Sene", -- Pawley-Hammarström (dengan Sene)
"Huon Tenggara"}, -- Usher
}
m["ngf-kme"] = {
"Kapau-Menya",
nil,
"ngf-ang",
aliases = {"Banjaran Kratke Tenggara"}, -- Usher
}
m["ngf-koi"] = {
"Koiarian",
11154240,
"ngf", -- tidak diterima sebagai TNG oleh Glottolog tetapi diterima oleh yang lain
aliases = {"Penara Koiari-Managalas"},
}
m["ngf-kok"] = {
"Kokon", -- Usher memanggilnya Mabuso Selatan tetapi memasukkan Gum ke dalamnya
nil,
"ngf-mab",
}
m["ngf-kow"] = {
"Kowan",
6435004,
"ngf-mad",
aliases = {"Selat Isumrud"}, -- per Usher (2020)
}
m["ngf-ksa"] = {
"Kalam-Adelbert Selatan",
nil,
"ngf-mad",
aliases = {"Kalamik-Adelbert Selatan", -- Glottolog
"Madang Barat"}, -- Usher (2020)
}
m["ngf-kto"] = {
"Kube-Tobo", -- mengikut Glottolog, satu bahasa "Kulungtfu-Yuanggeng-Tobo"
1173235, -- kod bagi bahasa Tobo-Kube
"ngf-huo",
aliases = {"Tobo-Kube"},
}
m["ngf-kts"] = {
"Komyandaret-Tsaukambo",
nil,
"ngf-bda",
aliases = {"Sungai Becking"}, -- Usher
}
m["ngf-kum"] = {
"Kumil",
nil,
"ngf-nad",
aliases = {"Kumilan", -- Pawley-Hammarström mengikut Z'graggen (1975)
"Sungai Kumil"}, -- istilah Usher
}
m["ngf-kya"] = {
"Kamano-Yagaria",
nil,
"ngf-gor",
aliases = {"Henganofi", -- Usher
"Kamano-Yagaria-Keigana",
},
}
m["ngf-lok"] = {
"Ok Tanah Rendah",
nil,
"ngf-okk",
}
m["ngf-mab"] = {
"Mabuso",
6721668,
"ngf-mad",
}
m["ngf-mad"] = {
"Madang",
11217556,
"ngf",
aliases = {"Banjaran Madang-Adelbert"}, -- Z'graggen (1975), sepadan dengan Madang kini kecuali tiadanya Kalam dan Gants
}
m["ngf-mek"] = {
"Mek",
6810515,
"ngf",
aliases = {"Goliath"}, -- nama alternatif lapuk yang diberikan oleh Wikipedia
}
m["ngf-min"] = {
"Mindjim",
86749913,
"ngf-mad",
aliases = {"Minjim Bawah", -- Glottolog, diletakkan dalam Pesisir Rai oleh Glottolog dan Pawley-Hammarström; Mindjim
-- Glottolog mengandungi 6 bahasa, termasuk "Minjim Atas" (Rerau dan Sgi Bara)
"Sungai Mindjim", -- Usher
"Minjim", "Sungai Minjim",
},
}
-- Tambah jika Molet diasingkan daripada Asaro'o
-- m["ngf-moa"] = {
-- "Molet-Asaro'o",
-- nil,
-- "ngf-war",
-- }
m["ngf-mok"] = {
"Ok Pergunungan", -- [[w:Mountain Ok languages]] dilencongkan ke [[w:Ok languages]]
nil,
"ngf-okk",
}
m["ngf-mom"] = {
"Mombum",
6897077,
"ngf", -- tidak diterima sebagai TNG oleh Glottolog tetapi diterima oleh yang lain
aliases = {"Mombum-Koneraw", "Komolom", "Selat Muli"}, -- Pawley-Hammarström menggunakan Komolom, Usher menggunakan Selat Muli
}
m["ngf-msu"] = {
"Mian-Suganga", -- dianggap sebagai satu bahasa Mian oleh Wikipedia
12952846,
"ngf-mok",
aliases = {"Mianik"}, -- Glottolog
}
m["ngf-nad"] = {
"Adelbert Utara", -- tidak diterima oleh Pawley-Hammarström
16952821, -- kod untuk perangkaian Croisilles
"ngf-mad",
aliases = {"Banjaran Adelbert-Selat Isumrud", -- Usher (2020)
"Adelbert Utara",
"Pihom-Isumrud"}, -- Ross?
}
m["ngf-nbi"] = {
"Binanderean Utara",
nil,
"ngf-bin",
aliases = {"Suena-Zia"}, -- Usher
}
m["ngf-nde"] = {
"Ndeiram", -- [[w:Ndeiram River languages]] dilencongkan ke [[w:Greater Awyu languages]]
nil,
"ngf-awd",
aliases = {"Sungai Ndeiram"}, -- Usher?
}
m["ngf-ngn"] = {
"Ngalik-Nduga", -- [[w:Ngalik languages]] dilencongkan ke [[w:Baliem Valley languages]] = bahasa-bahasa Dani
nil,
"ngf-dan",
aliases = {"Ngalik"}, -- Usher
}
m["ngf-nso"] = {
"Sogeram Utara",
nil,
"ngf-sog",
aliases = {"Mum-Sirva", -- Usher
"Sogeram Tengah Utara", -- digunakan oleh mereka yang menerima Sogeram Tengah (= Sogeram Utara + Apali dan Manat)
"Sogeram Tengah-Utara", -- lebih jarang berbanding tanpa tanda sengkang
"Sikan"}, -- Z’graggen (1975?)
}
m["ngf-num"] = {
"Numugen",
nil,
"ngf-nad",
aliases = {"Numugenan", -- Glottolog mengikut Z'graggen 1975
"Sungai Numugen"}, -- istilah Usher
}
m["ngf-nur"] = {
"Nuru", -- Usher mengecualikan Yangulam, Pawley-Hammarström memasukkan Jilim dan Rerau
nil,
"ngf-rai",
aliases = {"Sungai Nuru"}, -- Usher?
}
m["ngf-nwh"] = {
"Hanseman Barat Laut", -- Usher
nil,
"ngf-han",
aliases = {"Wamas-Samosa-Murupi-Mosimo"}, -- Glottolog, Greenhill, dan Pawley-Hammarström mengikut Z'graggen; nama paling umum, tetapi sangat panjang
}
m["ngf-oen"] = {
"Engan Luar", -- dianggap sebagai bahasa Nete tunggal oleh Wikipedia
6998869,
"ngf-enc",
aliases = {"Nete-Bisorio"}, -- Usher
}
m["ngf-okk"] = {
"Ok",
7081687,
"ngf",
}
m["ngf-omo"] = {
"Omosan", -- tidak dimasukkan dalam (Raya) Adelbert Utara oleh Glottolog, tetapi saudara
nil,
"ngf-nad",
}
m["ngf-oro"] = {
"Orokaivik",
7103752, -- dianggap sebagai bahasa Orokaiva tunggal oleh Wikipedia
"ngf-bin",
aliases = {"Oro Tengah"}, -- Usher
}
m["ngf-pan"] = {
"Tasik Paniai",
6035631,
"ngf",
aliases = {"Tasik Wissel", "Tasik Wissel-Sungai Kemandoga"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["ngf-pek"] = {
"Peka",
nil,
"ngf-rai",
aliases = {"Sungai Peka"}, -- Usher?
}
m["ngf-pom"] = {
"Pomoikan",
nil,
"ngf-sad",
}
m["ngf-rai"] = {
"Pesisir Rai",
7283663,
"ngf-mad",
aliases = {"Madang Selatan"}, -- Usher
}
m["ngf-sab"] = {
"Sabakor", -- [[w:Sabakor languages]] dilencongkan ke [[w:Asmat–Kamrau languages]]
nil, -- 55994614 adalah untuk [[Category:Kamrau Bay languages]], yang wujud dalam enwiki
"ngf-ask",
aliases = {"Teluk Kamrau"}, -- Usher
}
m["ngf-sad"] = {
"Adelbert Selatan",
12633980,
"ngf-ksa",
aliases = {"Adelbert Selatan", -- Glottolog
"Banjaran Adelbert Selatan", -- Z'graggen (1980)
"Sungai Sogeram dan Tomul"}, -- Usher (2020)?
}
m["ngf-sak"] = {
"Sau-Angal-Kewa",
nil,
"ngf-khu",
aliases = {"Tanah Tinggi Selatan"}, -- Usher
}
m["ngf-san"] = {
"Sankwep",
nil,
"ngf-huo",
aliases = {"Nabak-Momolili", -- Pawley-Hammarström
"Huon Barat Daya"}, -- Usher
}
m["ngf-sbh"] = {
"South Bird's Head",
7566330,
"ngf",
}
m["ngf-sim"] = {
"Simbu",
nil,
"ngf-chw",
}
m["ngf-sog"] = {
"Sogeram",
86750419,
"ngf-sad",
aliases = {"Sungai Sogeram", -- Usher
"Wanang"},
}
m["ngf-sop"] = {
"Sopac",
nil,
"ngf-ehu",
aliases = {"Momare-Migabac", -- Pawley-Hammarström
"Sungai Masaweng"}, -- Usher
}
m["ngf-taa"] = {
"Tainae-Akoye",
nil,
"ngf-ata",
aliases = {"Akoye-Tainae"}, -- Usher
}
m["ngf-tai"] = {
"Tairora",
nil,
"ngf-kai",
aliases = {"Tairorik", -- Glottolog
"Kainantu Timur"}, -- Usher
}
m["ngf-tib"] = {
"Tiboran",
nil,
"ngf-nad",
aliases = {"Tibor Nuklear", -- Glottolog, mengecualikan Wanambre/Mokati
"Sungai Tiboran", -- Usher (2020)
"Tibor"}, -- Pick (2020) dan Glottolog memasukkan Wanambre/Mokati
}
m["ngf-tna"] = {
"Tangko-Nakai",
nil,
"ngf-okk",
aliases = {"Ok Tengah"}, -- Usher
}
m["ngf-uru"] = {
"Uruwa",
nil,
"ngf-fin",
aliases = {"Sungai Uruwa"}, -- Usher?
}
m["ngf-usi"] = {
"Utu-Silopi",
nil,
"ngf-han",
aliases = {"Silopi-Utu"}, -- Usher
}
m["ngf-waa"] = {
"Wantoat-Awara", -- tiada dalam Usher tetapi Wantoat dan Awara membentuk rantaian dialek
nil,
"ngf-wan",
aliases = {"Awara-Wantoat"}, -- per Wikipedia
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["ngf-wah"] = {
"Wahgi", -- [[w:Wahgi languages]] dilencongkan ke [[w:Chimbu–Wahgi languages]]
nil,
"ngf-chw",
aliases = {"Lembah Wahgi"}, -- Usher
}
m["ngf-wan"] = {
"Wantoatik",
nil,
"ngf-fin",
aliases = {"Wantoat",
"Sungai Wantoat", -- Usher?
},
}
m["ngf-war"] = {
"Warup",
12645082,
"ngf-fin",
aliases = {"Sungai Warup"}, -- Usher?
}
m["ngf-woj"] = {
"Wojokesik",
nil,
"ngf-ang",
aliases = {"Banjaran Kratke Timur Laut"}, -- Usher
}
m["ngf-wok"] = {
"Ok Barat",
nil,
"ngf-okk",
aliases = {"Kwer-Kopkaka-Burumakok"}, -- Glottolog, Pawley-Hammarström
}
m["ngf-wso"] = {
"Sogeram Barat",
nil,
"ngf-sog",
aliases = {"Mand-Nend", -- Usher
"Atan", -- Wurm mengikut Z'graggen
},
}
m["ngf-yag"] = {
"Yaganon", -- diletakkan dalam Pesisir Rai oleh Glottolog dan Pawley-Hammarström
35323986,
"ngf-mad",
aliases = {"Sungai Yaganon"}, -- Usher
}
m["ngf-yal"] = {
"Yali", -- dianggap sebagai bahasa tunggal oleh Wikipedia
8047468,
"ngf-ngn",
aliases = {"Ngalik"}, -- Glottolog, Pawley-Hammarström
}
m["ngf-yar"] = {
"Yareban",
16977672,
"ngf", -- tidak diterima sebagai TNG oleh Glottolog tetapi diterima oleh semua yang lain
aliases = {"Sungai Musa"},
}
m["ngf-ynu"] = {
"Yau-Nungon",
12953319, -- untuk bahasa Yau tunggal dalam Wikipedia ([[w:Yau language (Trans–New Guinea)]])
"ngf-uru",
}
m["ngf-yup"] = {
"Yupna",
nil,
"ngf-fin",
aliases = {"Sungai Yupna"}, -- Usher?
}
m["nic"] = {
"Niger-Congo",
33838,
aliases = {"Niger-Kordofania"},
}
m["nic-alu"] = {
"Alumic",
4737355,
"nic-plt",
}
m["nic-bas"] = {
"Basa",
4866154,
"nic-knj",
}
m["nic-bbe"] = {
"Beboid Timur",
nil,
"nic-beb",
}
m["nic-bco"] = {
"Benue-Congo",
33253,
"nic-vco",
}
m["nic-bcr"] = {
"Bantoid-Cross",
806983,
"nic-bco",
}
m["nic-bdn"] = {
"Bantoid Utara",
nil,
"nic-bod",
aliases = {"Bantoid Utara"},
}
m["nic-bds"] = {
"Bantoid Selatan",
3183152,
"nic-bod",
aliases = {"Bantu Luas", "Bin"},
}
m["nic-beb"] = {
"Beboid",
813549,
"nic-bds",
}
m["nic-ben"] = {
"Bendi",
4887065,
"nic-bcr",
}
m["nic-beo"] = {
"Berom",
4894642,
"nic-plt",
}
m["nic-bod"] = {
"Bantoid",
806992,
"nic-bcr",
}
m["nic-buk"] = {
"Buli-Koma",
nil,
"nic-ovo",
}
m["nic-bwa"] = {
"Bwa",
12628562,
"nic-gur",
other_names = {"Bwamu", "Bomu"},
}
m["nic-cde"] = {
"Central Delta",
3813191,
"nic-cri",
}
m["nic-cri"] = {
"Cross River",
1141096,
"nic-bcr",
}
m["nic-dag"] = {
"Dagbani",
nil,
"nic-wov",
}
m["nic-dak"] = {
"Dakoid",
1157745,
"nic-bdn",
}
m["nic-dge"] = {
"Escarpment Dogon",
5397128,
"qfa-dgn",
}
m["nic-dgw"] = {
"Dogon Barat",
nil,
"qfa-dgn",
}
m["nic-eko"] = {
"Ekoid",
1323395,
"nic-bds",
}
m["nic-eov"] = {
"Oti-Volta Timur",
nil,
"nic-ovo",
aliases = {"Samba"},
}
m["nic-fru"] = {
"Furu",
5509783,
"nic-bds",
}
m["nic-gne"] = {
"Eastern Gurunsi",
12633072,
"nic-gns",
aliases = {"Grũsi Timur"},
}
m["nic-gnn"] = {
"Northern Gurunsi",
nil,
"nic-gns",
aliases = {"Grũsi Utara"},
}
m["nic-gnw"] = {
"Western Gurunsi",
nil,
"nic-gns",
aliases = {"Grũsi Barat"},
}
m["nic-gns"] = {
"Gurunsi",
721007,
"nic-gur",
aliases = {"Grũsi"},
}
m["nic-gre"] = {
"Eastern Grassfields",
5330160,
"nic-grf",
}
m["nic-grf"] = {
"Grassfields",
750932,
"nic-bds",
aliases = {"Bantu Grassfields", "Grassfields Luas"},
}
m["nic-grm"] = {
"Gurma",
30587833,
"nic-ovo",
}
m["nic-grs"] = {
"Southwest Grassfields",
7571285,
"nic-grf",
}
m["nic-gur"] = {
"Gur",
33536,
"alv-sav",
aliases = {"Voltaik"},
}
m["nic-ief"] = {
"Ibibio-Efik",
2743643,
"nic-lcr",
}
m["nic-jer"] = {
"Jera",
nil,
"nic-kne",
}
m["nic-jkn"] = {
"Jukunoid",
1711622,
"nic-pla",
}
m["nic-jrn"] = {
"Jarawan",
1683430,
"nic-mba",
}
m["nic-jrw"] = {
"Jarawa",
35423,
"nic-jrn",
}
m["nic-kam"] = {
"Kambari",
6356294,
"nic-knj",
}
m["nic-ktl"] = {
"Katloid",
nil,
"nic",
}
m["nic-kau"] = {
"Kauru",
nil,
"nic-kne",
}
m["nic-kmk"] = {
"Kamuku",
6359821,
"nic-knj",
}
m["nic-kne"] = {
"East Kainji",
5328687,
"nic-knj",
}
m["nic-knj"] = {
"Kainji",
681495,
"nic-pla",
}
m["nic-knn"] = {
"Northwest Kainji",
7060098,
"nic-knj",
}
m["nic-ktl"] = {
"Katloid",
6377681,
"nic",
aliases = {"Katla", "Katla-Tima"},
}
m["nic-lcr"] = {
"Cross River Hilir",
3813193,
"nic-cri",
}
m["nic-mam"] = {
"Mamfe",
2005898,
"nic-bds",
aliases = {"Nyang"},
}
m["nic-mba"] = {
"Mbam",
687826,
"nic-bds",
}
m["nic-mbc"] = {
"Mba",
6799561,
"nic-ubg",
}
m["nic-mbw"] = {
"West Mbam",
nil,
"nic-mba",
}
m["nic-mmb"] = {
"Mambiloid",
1888151,
other_names = {"Bantoid Utara"}, -- mengikut Wikipedia, Bantoid Utara ialah keluarga induk
"nic-bdn",
}
m["nic-mom"] = {
"Momo",
6897393,
"nic-grf",
}
m["nic-mre"] = {
"Moré",
nil,
"nic-wov",
}
m["nic-ngd"] = {
"Ngbandi",
36439,
"nic-ubg",
}
m["nic-nge"] = {
"Ngemba",
7022271,
"nic-gre",
}
m["nic-ngk"] = {
"Ngbaka",
3217499,
"nic-ubg",
}
m["nic-nin"] = {
"Ninzic",
7039282,
"nic-plt",
}
m["nic-nka"] = {
"Nkambe",
7042520,
"nic-gre",
}
m["nic-nkb"] = {
"Baka",
nil,
"nic-nkw",
}
m["nic-nke"] = {
"Eastern Ngbaka",
nil,
"nic-ngk",
}
m["nic-nkg"] = {
"Gbanziri",
nil,
"nic-nkw",
}
m["nic-nkk"] = {
"Kpala",
nil,
"nic-nkw",
}
m["nic-nkm"] = {
"Mbaka",
nil,
"nic-nkw",
}
m["nic-nkw"] = {
"Ngbaka Barat",
nil,
"nic-ngk",
}
m["nic-npd"] = {
"North Plateau Dogon",
nil,
"qfa-dgn",
}
m["nic-nun"] = {
"Nun",
13654297,
"nic-gre",
}
m["nic-nwa"] = {
"Nanga-Walo",
nil,
"qfa-dgn",
}
m["nic-ogo"] = {
"Ogoni",
2350726,
"nic-cri",
aliases = {"Ogonoid"},
}
m["nic-ovo"] = {
"Oti-Volta",
1157178,
"nic-gur",
}
m["nic-pla"] = {
"Platoid",
453244,
"nic-bco",
aliases = {"Nigeria Tengah"},
}
m["nic-plc"] = {
"Central Plateau",
5061668,
"nic-plt",
}
m["nic-pld"] = {
"Plains Dogon",
nil,
"qfa-dgn",
}
m["nic-ple"] = {
"East Plateau",
5329154,
"nic-plt",
}
m["nic-pls"] = {
"South Plateau",
7568236,
"nic-plt",
aliases = {"Jilik-Eggonik"},
}
m["nic-plt"] = {
"Plateau",
1267471,
"nic-pla",
}
m["nic-ras"] = {
"Rashad",
3401986,
"nic",
}
m["nic-rnc"] = {
"Central Ring",
nil,
"nic-rng",
}
m["nic-rng"] = {
"Ring",
2269051,
"nic-grf",
aliases = {"Ring Road"},
}
m["nic-rnn"] = {
"Northern Ring",
nil,
"nic-rng",
}
m["nic-rnw"] = {
"Western Ring",
nil,
"nic-rng",
}
m["nic-ser"] = {
"Sere",
7453058,
"nic-ubg",
}
m["nic-shi"] = {
"Shiroro",
7498953,
"nic-knj",
aliases = {"Pongu"},
}
m["nic-sis"] = {
"Sisaala",
36532,
"nic-gnw",
}
m["nic-tar"] = {
"Tarokoid",
2394472,
"nic-plt",
}
m["nic-tiv"] = {
"Tivoid",
752377,
"nic-bds",
}
m["nic-tvc"] = {
"Tivoid Tengah",
nil,
"nic-tiv",
}
m["nic-tvn"] = {
"Tivoid Utara",
nil,
"nic-tiv",
}
m["nic-ubg"] = {
"Ubangi",
33932,
"nic-vco", -- atau tiada
}
m["nic-uce"] = {
"Cross River Hulu Timur-Barat",
nil,
"nic-ucr",
}
m["nic-ucn"] = {
"Cross River Hulu Utara-Selatan",
nil,
"nic-ucr",
}
m["nic-ucr"] = {
"Cross River Hulu",
4108624,
"nic-cri",
aliases = {"Cross Atas"},
}
m["nic-vco"] = {
"Volta-Congo",
37228,
"alv",
}
m["nic-wov"] = {
"Oti-Volta Barat",
nil,
"nic-ovo",
aliases = {"Moré-Dagbani"},
}
m["nic-ykb"] = {
"Yukuben",
16909196,
"nic-plt",
aliases = {"Oohum"},
}
m["nic-ymb"] = {
"Yambasa",
nil,
"nic-mba",
}
m["nic-yon"] = {
"Yom-Nawdm",
nil,
"nic-ovo",
aliases = {"Moré-Dagbani"},
}
m["njo"] = {
"Ao",
28433,
"sit-aao",
aliases = {"Ao Naga"},
}
m["nub"] = {
"Nubian",
1517194,
"sdv-nes",
}
m["nub-hil"] = {
"Hill Nubian",
5762211,
"nub",
aliases = {"Nubia Kordofan"},
}
m["omq"] = {
"Oto-Mangue",
33669,
}
m["omq-cha"] = {
"Chatino",
35111,
"omq-zap",
}
m["omq-chi"] = {
"Chinantecan",
35828,
"omq",
}
m["omq-cui"] = {
"Cuicatec",
616024,
"omq-mix",
}
m["omq-maz"] = {
"Mazatecan",
36230,
"omq",
aliases = {"Mazatec"},
}
m["omq-mix"] = {
"Mixtecan",
21083066,
"omq",
}
m["omq-mxt"] = {
"Mixtec",
36363,
"omq-mix",
}
m["omq-otp"] = {
"Oto-Pamean",
1270220,
"omq",
}
m["omq-pop"] = {
"Popolocan",
5132273,
"omq",
}
m["omq-tri"] = {
"Trique",
780200,
"omq-mix",
aliases = {"Trique"},
}
m["omq-zap"] = {
"Zapotecan",
8066463,
"omq",
}
m["omq-zpc"] = {
"Zapotec",
13214,
"omq-zap",
}
m["omv"] = {
"Omo",
33860,
"afa",
}
m["omv-aro"] = {
"Aroid",
3699526,
"omv",
aliases = {"Ari-Banna", "Omotik Selatan", "Somotik"},
}
m["omv-diz"] = {
"Dizoid",
430251,
"omv",
aliases = {"Maji", "Majoid"},
}
m["omv-eom"] = {
"East Ometo",
20527288,
"omv-ome",
}
m["omv-gon"] = {
"Gonga",
4143043,
"omv",
aliases = {"Kefoid"},
}
m["omv-mao"] = {
"Mao",
1351495,
"omv",
}
m["omv-nom"] = {
"Ometo Utara",
nil,
"omv-ome",
}
m["omv-ome"] = {
"Ometo",
36310,
"omv",
}
m["oto"] = {
"Otomian",
130372545,
"omq-otp",
}
m["oto-otm"] = {
"Otomi",
36355,
"oto",
}
m["paa"] = {
"Papua",
236425,
"qfa-not",
}
m["paa-aia"] = {
"Aian",
4767739, -- Bahasa-bahasa Annaberg
"paa-ram",
aliases = {"Ramu Tengah", -- Foley (dengan Rao),
"Annaberg", -- dengan Rao
"Aram-Aren", -- Usher
},
}
m["paa-alp"] = {
"Alor-Pantar",
3502429,
"paa-tap",
}
m["paa-amu"] = {
"Amto-Musan",
480281,
aliases = {"Sungai Samaia"},
}
m["paa-ani"] = {
"Anim",
55603991,
aliases = {"Sungai Fly"},
}
m["paa-ara"] = {
"Arapesh",
4784223,
"paa-koa",
aliases = {"Arapeshan"}, -- Foley
}
m["paa-arf"] = {
"Arafundi",
4783702,
}
m["paa-ata"] = {
"Ataitan",
4812652,
"paa-ram",
aliases = {"Tangu", -- Foley
"Tanggu", -- nama alternatif yang diberikan oleh Wikipedia
"Sungai Moam", -- Usher
},
}
m["paa-baa"] = {
"Bayono-Awbono",
2424781,
}
m["paa-bai"] = {
"Baining",
748487,
aliases = {"New Britain Timur"},
}
m["paa-baw"] = {
"Bosngun-Awar",
nil,
"paa-ott",
aliases = {"Pesisir Ramu Timur", -- Usher
"Bosman-Awar", -- Wikipedia
},
}
m["paa-bew"] = {
"Bewani", -- [[w:Bewani languages]] dilencongkan ke [[w:Border languages (New Guinea)]]; namun Wikipedia Bahasa Croatia mempunyai entri
16113460,
"paa-bor",
aliases = {"Sungai Poal"}, -- Usher
}
m["paa-boa"] = {
"Boazi",
48803717,
"paa-mby",
aliases = {"Tasik Murray"}, -- Usher
}
m["paa-bor"] = {
"Border",
1752158,
aliases = {"Tami Atas",
"Banjaran Bewani-Sungai Tami", -- Usher
},
}
m["paa-bul"] = {
"Sungai Bulaka",
4987195,
aliases = {"Yelmek-Maklew", "Jabga"}, -- Yelmek-Maklew dalam Evans (2018) dan Gregor (2021)
}
m["paa-bvi"] = {
"Betaf-Vitou", -- Glottolog
nil,
"paa-tor",
aliases = {"Vitou-Betaf", -- Wikipedia
"Fitou-Tena", -- Usher
"Manirem",
},
}
m["paa-clp"] = {
"Dataran Tasik Tengah", -- [[w:Central Lakes Plain languages]] dilencongkan ke [[w:Lakes Plain languages]]
nil, -- Q86780132 adalah untuk kategori berkaitan yang wujud dalam enwiki
"paa-lpl",
aliases = {"Tariku Timur", -- Glottolog
"Dataran Tasik Tengah", -- Usher
},
}
m["paa-dtu"] = {
"Doso-Turumsa",
16917784,
-- berkemungkinan berkaitan dengan bahasa-bahasa Strickland Timur
aliases = {"Sungai Soari"}, -- istilah Usher
}
m["paa-ebh"] = {
"Kepala Burung Timur",
338064,
aliases = {"Mantion-Meax", "Mantion-Meyah", -- Mantion-Meax ialah istilah Wikipedia
"Kepala Burung Tenggara", -- Usher (2020)
},
}
m["paa-eel"] = {
"Eleman Timur",
nil,
"paa-ele",
aliases = {"Eleman Timur"},
}
m["paa-egb"] = {
"East Geelvink Bay",
1497678,
aliases = {"Teluk Geelvink", "Cenderawasih Timur"}, -- Teluk Geelvink mengikut Glottolog
}
m["paa-eke"] = {
"Keram Timur",
nil,
"paa-ker",
}
m["paa-ele"] = {
"Eleman",
3034298,
aliases = {"Teluk Kerema"},
}
m["paa-elp"] = {
"Dataran Tasik Timur", -- [[w:East Lakes Plain languages]] dilencongkan ke [[w:Lakes Plain languages]]; namun Wikipedia Bahasa Croatia mempunyai entri
12633078,
"paa-lpl",
aliases = {"Dataran Tasik Timur"}, -- Usher
}
m["paa-epw"] = {
"Pauwasi Timur",
16115496,
aliases = {"Pauwasi Timur"},
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["paa-etf"] = {
"Trans-Fly Timur",
5330530,
aliases = {"Oriomo"}, -- semakin banyak digunakan kebelakangan ini, kemungkinan bermula dalam Evans (2018)
}
m["paa-eti"] = {
"Timor Timur",
15496066,
"paa-tap",
aliases = {"Oirata-Makasae", -- nama Wikipedia
"Timor Timur", -- nama alternatif yang diberikan oleh Wikipedia
"Fataluku-Makasai", "Oirata-Makasai", -- nama-nama alternatif yang diberikan oleh Wikidata
},
}
m["paa-fas"] = {
"Fas",
3502658,
aliases = {"Baibai-Fas"}, -- nama Glottolog
}
m["paa-flp"] = {
"Dataran Tasik Barat Jauh", -- [[w:Wapoga River languages]] dilencongkan ke [[w:Lakes Plain languages]]
nil, -- Q86808337 adalah untuk kategori bahasa Wapoga berkaitan, yang wujud dalam enwiki
"paa-lpl",
aliases = {"Rasawa", -- Clouse (1997)
"Sungai Wapoga", -- Usher, termasuk Kehu/Keuw (tidak terkelas oleh yang lain)
},
}
m["paa-gkw"] = {
"Kwerba Raya",
12635134,
aliases = {"Banjaran Foja Barat", -- Usher
"Kwerbik", -- Wikipedia
"Kwerba", -- Foley (2018)
},
}
m["paa-gto"] = {
"Galela-Tobelo",
nil,
"paa-nnh",
aliases = {"Halmahera Utara Tanah Besar", -- Glottolog
"Tanah Besar Halmahera Utara", "Halmahera Timur Laut", -- nama-nama alternatif
"Halmahera Timur Laut", -- Wikipedia, daripada Verhoeve 1988
},
}
m["paa-hya"] = {
"Heyo-Yahang",
nil,
"paa-mam",
aliases = {"Yahang-Heyo"}, -- nama Wikipedia
}
m["paa-ing"] = {
"Teluk Pedalaman",
6034783,
"paa-ani",
aliases = {"Teluk Papua Pedalaman"}, -- Glottolog
}
m["paa-isk"] = {
"Sko Pedalaman",
65043889,
"paa-sko",
aliases = {"Skouik", -- Glottolog
"Pesisir Vanimo Barat", -- Usher
"Skou Barat", -- Wikipedia
"Skou Pedalaman", "Skou Nuklear", -- nama-nama alternatif yang diberikan oleh Wikipedia
},
}
m["paa-iwa"] = {
"Iwam",
15147853,
"paa-sep",
}
m["paa-kae"] = {
"Kamula-Elevala",
130390498,
-- kerap diletakkan dalam TNG
aliases = {"Sungai Kamula-Elevala"},
}
m["paa-kan"] = {
"Kanum", -- dikeluarkan daripada Tonda oleh Glottolog
nil,
"paa-ton",
}
m["paa-kay"] = {
"Kayagarik",
7566330,
aliases = {"Kayagar", -- dahulunya lazim
"Sungai Cook"}, -- per Usher (2020)
}
m["paa-ker"] = {
"Keram",
48768173,
-- kerap dikelompokkan dalam atau setara dengan bahasa-bahasa Ramu
aliases = {"Sungai Keram"},
}
m["paa-kiw"] = {
"Kiwaian",
338449,
aliases = {"Kiwai"}, -- dahulunya lazim, masih digunakan kadangkala
}
m["paa-kko"] = {
"Kaure-Kosare", -- ditolak oleh Pawley-Hammarström tetapi diterima oleh Glottolog, Foley (2018) dan Usher (2020)
48767891,
aliases = {"Sungai Nawa"}, -- istilah Usher
}
m["paa-koa"] = {
"Kombio-Arapesh",
16115049,
"paa-trr",
aliases = {"Kombio-Arapeshan", -- Laycock, yang memasukkan Wom
"Kombio-Arapesh-Urat", -- Glottolog, termasuk Urat
},
}
m["paa-kol"] = {
"Kolopom",
6427807,
}
m["paa-kom"] = {
"Kombio",
65044238,
"paa-koa",
aliases = {"Kombian", -- Laycock
"Kombio-Yambes", -- Glottolog
},
}
m["paa-kun"] = {
"Kunimaipan",
134973258,
aliases = {"Banjaran Wharton Barat Laut"}, -- per Usher (2020)
-- sering dianggap sebagai subkeluarga Goilalan
}
m["paa-kwa"] = {
"Kwalean",
6450053,
aliases = {"Humene-Uare"},
}
m["paa-kwe"] = {
"Kwerba tepat",
12635134,
"paa-gkw",
aliases = {"Kwerba", -- Usher
"Kwerbaik", -- Glottolog
},
}
m["paa-kwo"] = {
"Kwomtari",
2075415,
aliases = {"Kwomtari-Nai"}, -- Sungai Senu ialah cadangan lebih besar yang belum terbukti
}
m["paa-lla"] = {
"Loloda-Laba", -- bahasa tunggal dalam Glottolog (Loloda-Laba) dan Wikipedia (Loloda)
11732388, -- bagi bahasa Loloda
"paa-gto",
aliases = {"Loloda"}, -- nama Wikipedia
}
m["paa-lma"] = {
"May Kiri",
614468,
aliases = {"Sungai Arai"}, -- per Usher (2020)
-- Kadangkala dalam keluarga andaian Arai-Samaia bersama Amto-Musan dan bahasa Pyu
}
m["paa-lmu"] = {
"Lepki-Murkim", -- Kembra diterima oleh Glottolog dan Usher; tidak oleh Foley (2020) tetapi tidak menolak kemungkinan hubungan
85776285,
-- keluarga bebas per Glottolog, sebahagian daripada keluarga Sungai Pauwasi Selatan (di bawah Pauwasi) per Usher (2020)
aliases = {"Lepki-Murkim-Kembra"}, -- Glottolog
}
m["paa-lpl"] = {
"Dataran Tasik",
6478969,
aliases = {"Dataran Tasik"},
}
m["paa-lra"] = {
"Ramu Bawah",
65089469,
"paa-ram",
aliases = {"Ottilien-Misegian"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["paa-lse"] = {
"Sepik Bawah",
7061700,
aliases = {"Nor-Pondo"},
}
m["paa-mai"] = {
"Mairasi",
6736896,
aliases = {"Mairasik"}, -- per Glottolog
}
m["paa-mal"] = {
"Mailuan",
6735839,
aliases = {"Teluk Cloudy"},
}
m["paa-mam"] = {
"Maimai", -- Maimai Foley diperluas
53679325, -- ini adalah kod bagi Maimai yang diperluas dengan 6 bahasa, berbanding 3 dalam "Maimai Nuklear"
"paa-trr",
aliases = {"Maimai Nuklear", -- nama Glottolog
"Maimai tepat", -- nama Wikipedia
},
}
m["paa-man"] = {
"Manubaran",
6752335,
aliases = {"Gunung Brown"},
}
m["paa-mar"] = {
"Marienberg",
1570589,
"paa-trr",
aliases = {"Bukit Marienberg"}, -- Usher
}
m["paa-may"] = {
"Maybratik",
4830892, -- kod untuk bahasa Maybrat dalam Wikipedia, yang merangkumi dua bahasa dalam keluarga ini
-- diandaikan termasuk dalam Papua Barat tetapi umumnya dianggap sebagai keluarga terpencil
aliases = {"Maybrat-Karon"},
}
m["paa-mbi"] = {
"Mbaham-Iha",
85784512,
"qfa-dis", -- Bahasa-bahasa Papua; Glottolog mengelompokkan Karas (Kalamang) dengan Mbaham-Iha ke dalam keluarga Bomberai Barat (tanah besar)
-- dan berhenti di situ; Wikipedia, mengikut Usher dan Schapper (2022), mengelompokkan Karas, Mbaham-Iha
-- dan keluarga besar Timor-Alor-Pantar ke dalam keluarga Bomberai Barat (Raya), menyatakan bahawa Karas tidak lebih
-- dekat dengan Mbaham-Iha berbanding dengan Timor-Alor-Pantar.
aliases = {"Mbahaam-Iha", -- digunakan oleh Wikidata
"Bomberai Barat Nuklear", -- nama Glottolog
},
}
m["paa-mby"] = {
"Marind-Boazi-Yaqay",
3217484,
"paa-ani",
aliases = {"Marind-Boazi-Yaqai", -- Glottolog
"Marind-Yakhai", -- Usher, tanpa Boazi
"Marind-Yaqai", -- Wikidata
"Marind", -- nama alternatif yang diberikan oleh Wikipedia
"Marind-Arandai", -- nama alternatif yang diberikan oleh Wikipedia Bahasa Sepanyol
},
}
m["paa-mmu"] = {
"Mandi-Muniwara",
nil,
"paa-mar",
aliases = {"Bukit Marienberg Barat"}, -- Usher
}
m["paa-mon"] = {
"Monumbo", -- per Glottolog: "Tiada bukti untuk bahasa-bahasa Bogia (Monumbo) berkaitan dengan bahasa-bahasa Torricelli lain pernah dikemukakan"
16928417,
aliases = {"Bogia", -- Glottolog
"Teluk Bogia", -- Usher (2020)
},
}
m["paa-mri"] = {
"Marindik", -- [[w:Marindic languages]] dilencongkan ke [[w:Marind–Yaqai languages]]
nil,
"paa-mby",
aliases = {"Marind"}, -- Usher; bahasa tunggal
}
m["paa-nam"] = {
"Nambu",
6961418,
"paa-yam",
aliases = {"Sungai Morehead Timur"}, -- Usher
}
m["paa-nbo"] = {
"Bougainville Utara",
749496,
}
m["paa-ndu"] = {
"Ndu",
3217498,
"paa-sep", -- Tidak diterima oleh Glottolog
aliases = {"Ndu-Nggala"}, -- Usher
}
m["paa-ngk"] = {
"Ngkolmpu", -- dianggap sebagai bahasa tunggal oleh Wikipedia
5908646,
"paa-kan",
aliases = {"Ngkantr", -- Glottolog
"Kanum Ngkolmpu", -- Wikipedia
"Ngkontar", -- nama alternatif yang diberikan oleh Wikipedia
"Kanum", -- digunakan oleh Wikidata
},
}
m["paa-nha"] = {
"Halmahera Utara",
3217358,
-- kemungkinan dalam keluarga Papua Barat yang dicadangkan atau keluarga bebas
}
m["paa-nim"] = {
"Nimboran",
12638426,
aliases = {"Nimboranik", -- per Glottolog
"Sungai Grime", -- per Usher (2020)
}
}
m["paa-nnd"] = {
"Ndu Nuklear",
nil,
"paa-ndu",
aliases = {"Ndu", -- Usher, dengan Boiken/Boikin
"Ndu tepat", -- Wikipedia
},
}
m["paa-nnh"] = {
"Halmahera Utara Bahagian Utara",
nil,
"paa-nha",
aliases = {"Halmahera Utara Bahagian Utara", -- Glottolog
"Halmahera", -- Usher
"Halmahera Teras", -- Wikipedia
},
}
m["paa-nto"] = {
"Namla-Tofanma",
16918187,
-- keluarga bebas per Glottolog dan Foley (2018), sebahagian daripada keluarga Pauwasi Barat (di bawah Pauwasi) per Usher (2020)
}
m["paa-ott"] = {
"Ottilien",
7109477,
"paa-lra",
aliases = {"Pesisir Ramu", -- Usher
"Watam-Awar-Gamay", -- nama alternatif yang diberikan oleh Wikipedia
},
}
m["paa-pah"] = {
"Sungai Pahoturi",
17049141,
aliases = {"Pahoturi"}, -- per Glottolog
}
m["paa-pal"] = {
"Palei", -- Laycock menambah Agi dan Nabi/Nambi(-Metan)
65089113,
"paa-wpa",
aliases = {"Palai Nuklear"},
}
m["paa-pia"] = {
"Piawi", -- mengikut Wikipedia, dikelompokkan dengan bahasa-bahasa Arafundi untuk membentuk Yuat Atas, yang merupakan saudara kepada Madang
7190400,
aliases = {"Banjaran Schraeder", -- Usher?
"Waibuk"},
}
m["paa-pio"] = {
"Sungai Piore",
65043152,
"paa-sko",
aliases = {"Lagun Barupu", -- Glottolog
"Lagun", -- nama alternatif yang diberikan oleh Wikipedia
},
}
m["paa-por"] = {
"Porapora", -- Foley memasukkan Ambakich (yang mana kita, Glottolog, dan Usher layan sebagai Keram)
65044258,
"paa-ram",
aliases = {"Agoan", -- Glottolog
"Sungai Porapora", -- Usher
"Grass teras", -- nama alternatif yang diberikan oleh Wikipedia
},
}
m["paa-ram"] = {
"Ramu",
3442808,
aliases = {"Sungai Ramu"}, -- per Usher (2020)
}
m["paa-rsa"] = {
"Rasawa-Saponi", -- [[w:Rasawa-Saponi languages]] dilencongkan ke [[w:Lakes Plain languages]]
nil, -- Q9859418 adalah untuk kategori berkaitan yang wujud dalam Wikipedia Bahasa Piedmont
"paa-flp",
aliases = {"Sungai Rombak"}, -- Usher
}
m["paa-rub"] = {
"Ruboni",
6875319,
"paa-lra",
aliases = {"Misegian", -- nama Wikipedia
"Mikarew", -- nama alternatif yang diberikan oleh Wikipedia
"Banjaran Ruboni"}, -- Usher
}
m["paa-saa"] = {
"Samarokena-Airoran",
96417699,
"paa-gkw",
aliases = {"Pesisir Apauwar"}, -- Usher
}
m["paa-sah"] = {
"Sahu",
nil,
"paa-nnh",
}
m["paa-sbo"] = {
"South Bougainville",
3217380,
}
m["paa-sen"] = {
"Sentani",
17044584,
-- tiada konsensus mengenai pertalian yang lebih tinggi, jika ada
aliases = {"Sentanik", "Demta-Sentani", "Demta-Tasik Sentani"}, -- Sentanik mengikut Glottolog, Demta-Sentani mengikut Wikipedia
}
m["paa-sep"] = {
"Sepik",
3508772,
}
m["paa-shi"] = {
"Bukit Serra",
65043154,
"paa-sko",
}
m["paa-sko"] = {
"Sko",
953509,
aliases = {"Skou"},
}
m["paa-sng"] = {
"Senagi",
2066550,
}
m["paa-taa"] = {
"Taikat-Awyi", -- [[w:Taikat languages]] dilencongkan ke [[w:Border languages (New Guinea)]]; namun Wikipedia Bahasa Croatia mempunyai entri
12643265,
"paa-bor",
aliases = {"Taikat", -- Foley
"Sungai Tami Atas"}, -- Usher
}
m["paa-tam"] = {
"Tamolan",
7681634,
"paa-ram",
aliases = {"Sungai Guam"}, -- Usher
}
m["paa-tap"] = {
"Timor-Alor-Pantar",
16590002,
}
m["paa-teb"] = {
"Teberan",
7692052,
-- Kerap dikelompokkan dengan Trans-New Guinea, tetapi mengikut Pawley-Hammarström (2018), ia mempunyai "tuntutan keahlian yang lebih lemah atau dipertikaikan dalam TNG".
aliases = {"Dadibi-Folopa"},
}
m["paa-tir"] = {
"Tirio",
7809225,
"paa-ani",
aliases = {"Fly Bawah Nuklear", -- Pawley-Hammarström ("Fly Bawah" termasuk Abom)
"Tirio Nuklear", -- Glottolog ("Tirio" termasuk Abom)
"Sungai Fly Bawah", -- Usher (tanpa Abom)
},
}
m["paa-tki"] = {
"Turama-Kikori",
7853680,
aliases = {"Turama-Kikorian", "Sungai Rumu-Omati"},
}
m["paa-ton"] = {
"Tonda",
8581005,
"paa-yam",
aliases = {"Sungai Morehead Barat"}, -- Usher
}
m["paa-too"] = {
"Tor-Orya",
16590099,
aliases = {"Orya-Tor"},
}
m["paa-tor"] = {
"Tor", -- [[w:Tor languages]] dilencongkan ke [[w:Orya–Tor languages]]
nil,
"paa-too",
}
m["paa-trr"] = {
"Torricelli",
1333831,
}
m["paa-tti"] = {
"Ternate-Tidore",
nil,
"paa-nnh",
}
m["paa-wal"] = {
"Walio",
16919872,
-- Kerap diletakkan dalam Sepik (cth. oleh Laycock dan Z'graggen (1975)), tetapi tidak oleh Foley (2018), dan tidak diterima oleh Glottolog.
aliases = {"Walioik", -- Glottolog
"Sungai Leonhard Schultze Tengah",
},
}
m["paa-wap"] = {
"Wapei", -- Glottolog memasukkan Nabi/Nambi(-Metan) dalam Wapeik
65089115,
"paa-wpa",
aliases = {"Wapeik"}, -- Glottolog
}
m["paa-war"] = {
"Waris", -- [[w:Waris languages]] dilencongkan ke [[w:Border languages (New Guinea)]]; namun Wikipedia Bahasa Croatia mempunyai entri
12645076,
"paa-bor",
aliases = {"Warisik", -- Glottolog
"Sungai Bapi"}, -- Usher (tanpa Manem atau Senggi)
}
m["paa-wbh"] = {
"Kepala Burung Barat",
5330530,
-- Kuwani kadangkala dimasukkan; berkemungkinan berkaitan dengan bahasa-bahasa Halmahera Utara.
}
m["paa-wel"] = {
"Eleman Barat",
nil,
"paa-ele",
aliases = {"Eleman Barat"},
}
m["paa-wig"] = {
"Teluk Pedalaman Barat",
nil,
"paa-ing",
aliases = {"Teluk Papua Pedalaman Barat"}, -- Glottolog
}
m["paa-wke"] = {
"Keram Barat",
nil,
"paa-ker",
aliases = {"Koam", "Mongol-Langam", "Ulmapo"}, -- Koam digunakan oleh Foley, Ulmapo digunakan oleh Glottolog
}
m["paa-wko"] = {
"Wára-Kómnzo", -- memandangkan kita mengasingkan Kómnzo sebagai bahasa yang berasingan
11732474, -- untuk bahasa Wara
"paa-ton",
aliases = {"Anta-Komnzo-Wára-Wérè-Kémä", -- nama Glottolog
"Wára", "Wara", -- Wikipedia
},
}
m["paa-wlp"] = {
"Dataran Tasik Barat", -- [[w:Tariku languages]] dilencongkan ke [[w:Lakes Plain languages]]
47007503, -- sebenarnya untuk "bahasa-bahasa Tariku", yang mengikut Wikipedia merangkumi Fayu, Kirikiri, Iau dan Tause
"paa-lpl",
aliases = {"Tariku Barat", -- Glottolog
"Dataran Tasik Barat"}, -- Usher, dengan Edopi/Iau
}
m["paa-wpa"] = {
"Papua Barat",
65043156,
"paa-trr",
}
m["paa-wpw"] = { -- paa-wpa sudah digunakan oleh Wapei-Palei
"Pauwasi Barat", -- 2 bahasa per Glottolog dan Pawley-Hammarström; Usher turut memasukkan Namla-Tofanma dan Usku
85815062,
aliases = {"Pauwasi Barat", -- Wikipedia, Usher
"Tebi-Towe", "Dubu-Towei"},
}
m["paa-yam"] = {
"Yam",
15062272,
aliases = {"Sungai Morehead dan Maro Atas",
"Sungai Morehead"}, -- Usher
}
m["paa-yaq"] = {
"Yaqayik", -- [[w:Yaqai languages]] dilencongkan ke [[w:Marind–Yaqai languages]]
nil,
"paa-mby",
aliases = {"Yakhai-Warkay"}, -- Usher
}
m["paa-ysa"] = {
"Yawa-Saweru",
3217545,
aliases = {"Yawa", "Yawan", "Yapen"},
}
m["paa-yua"] = {
"Yuat",
8060096,
}
m["phi"] = {
"Filipina",
947858,
"poz",
}
m["phi-kal"] = {
"Kalamian",
3217466,
"phi",
aliases = {"Calamian"},
}
m["poz"] = {
"Melayu-Polinesia",
143158,
"map",
}
m["poz-aay"] = {
"Kepulauan Admiralty",
2701306,
"poz-oce",
}
m["poz-bnn"] = {
"Borneo Utara",
1427907,
"poz",
}
m["poz-bre"] = {
"Barito Timur",
2701314,
"poz",
}
m["poz-brw"] = {
"Barito Barat",
2761679,
"poz",
}
m["poz-bss"] = {
"Bali-Sasak-Sumbawa",
3396043,
"poz-msa",
}
m["poz-btk"] = {
"Bungku-Tolaki",
3217381,
"poz-clb",
}
m["poz-cet"] = {
"Melayu-Polinesia Tengah-Timur",
2269883,
"poz",
}
m["poz-clb"] = {
"Sulawesi",
1078041,
"poz",
}
m["poz-cln"] = {
"New Caledonia",
3091221,
"poz-ocs",
}
m["poz-cma"] = {
"Maluku Tengah",
3217479,
"poz-cet",
}
m["poz-hce"] = {
"Halmahera-Cenderawasih",
2526616,
"pqe",
}
m["poz-kal"] = {
"Kaili-Pamona",
3217465,
"poz-clb",
}
m["poz-lgx"] = {
"Lampung",
49215,
"poz",
}
m["poz-mcm"] = {
"Melayu-Chamik",
nil,
"poz-msa",
}
m["poz-mic"] = {
"Mikronesia",
420591,
"poz-occ",
}
m["poz-mly"] = {
"Melayik",
662628,
"poz-mcm",
}
m["poz-msa"] = {
"Melayu-Sumbawa",
1363818,
"poz",
}
m["poz-mun"] = {
"Muna-Buton",
3037924,
"poz-clb",
}
m["poz-nws"] = {
"Sumatera Barat Laut",
2071308,
"poz",
}
m["poz-occ"] = {
"Oceania Tengah-Timur",
2068435,
"poz-oce",
}
m["poz-oce"] = {
"Oceania",
324457,
"pqe",
}
m["poz-ocs"] = {
"Oceania Selatan",
3039118,
"poz-occ",
}
m["poz-ocw"] = {
"Oceania Barat",
2701282,
"poz-oce",
}
m["poz-pcc"] = {
"Pasifik Tengah",
3130237,
"poz-occ",
}
m["poz-pep"] = {
"Polinesia Timur",
390979,
"poz-pnp",
}
m["poz-pnp"] = {
"Polinesia Nuklear",
743851,
"poz-pol",
}
m["poz-pol"] = {
"Polinesia",
390979,
"poz-pcc",
}
m["poz-san"] = {
"Sabah",
3217517,
"poz-bnn",
}
m["poz-sbj"] = {
"Sama-Bajau",
2160409,
"poz",
}
m["poz-slb"] = {
"Saluan-Banggai",
3217519,
"poz-clb",
}
m["poz-sls"] = {
"Solomon Tenggara",
3119671,
"poz-occ",
}
m["poz-ssw"] = {
"Sulawesi Selatan",
2778190,
"poz",
}
m["poz-stm"] = {
"St. Matthias",
6484143,
"poz-oce",
aliases = {"St Matthias"},
}
m["poz-swa"] = {
"Sarawak Utara",
538569,
"poz-bnn",
}
m["poz-tem"] = {
"Temotu",
3075769,
"poz-oce",
}
m["poz-tim"] = {
"Timor",
7806987,
"poz-cet",
}
m["poz-ton"] = {
"Tonga",
3397263,
"poz-pol",
}
m["poz-tot"] = {
"Tomini-Tolitoli",
3217541,
"poz-clb",
}
m["poz-vnc"] = {
"Vanuatu Tengah",
5061988,
"poz-ocs",
}
m["poz-vnn"] = {
"Vanuatu Utara",
85789650,
"poz-ocs",
}
m["poz-vns"] = {
"Vanuatu Selatan",
3070173,
"poz-ocs",
}
m["poz-wot"] = {
"Wotu-Wolio",
1041317,
"poz-clb",
aliases = {"Kaili-Wolio Kepulauan"}, -- Glottolog
}
m["pqe"] = {
"Melayu-Polinesia Timur",
2269883,
"poz-cet",
}
m["qfa-adc"] = {
"Andaman Raya Tengah",
nil,
"qfa-adm",
}
m["qfa-adm"] = {
"Andaman Raya",
3515103,
}
m["qfa-adn"] = {
"Andaman Raya Utara",
nil,
"qfa-adm",
}
m["qfa-ads"] = {
"Andaman Raya Selatan",
nil,
"qfa-adm",
}
m["qfa-ain"] = {
"Ainu",
50111972,
aliases = {"Ainu"},
}
m["qfa-bej"] = {
"Be-Jizhao",
nil,
"qfa-bet",
}
m["qfa-bet"] = {
"Be-Tai",
12627719,
"qfa-tak",
aliases = {"Tai-Be", "Daik-Beik", "Beik-Daik"},
}
m["qfa-buy"] = {
"Buyang",
1109927,
"qfa-kra",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["qfa-cka"] = {
"Chukotka-Kamchatka",
33255,
}
m["qfa-cre"] = {
"kreol",
33289,
"crp",
}
m["qfa-ckn"] = {
"Chukotka",
2606732,
"qfa-cka",
}
m["qfa-cnt"] = {
"sentuhan",
133253514,
"qfa-not",
}
m["qfa-dis"] = {
-- Bahasa-bahasa yang tidak dapat dikelaskan (qfa-unc) tetapi tiada konsensus mengenai pengelasannya. Biasanya
-- ini kerana bahasa tersebut bercapah dan dipertikaikan sama ada ia bahasa pencilan atau berkaitan secara jauh
-- dengan bahasa-bahasa lain.
"pertalian yang dipertikaikan",
nil,
"qfa-not",
categoryName = "Bahasa dengan pertalian yang dipertikaikan",
}
m["qfa-dgn"] = {
"Dogon",
1234776,
"nic",
}
m["qfa-dny"] = {
"Dene-Yenisei",
21103,
aliases = {"Dené-Yeniseian"},
}
m["qfa-hur"] = {
"Hurro-Urartian",
1144159,
}
m["qfa-iso"] = {
"pencilan",
33648,
"qfa-not",
categoryName = "Bahasa pencilan",
}
m["qfa-kad"] = {
"Kadu", -- dianggap sama ada Nilo-Sahara atau bebas/tiada
1720989,
}
m["qfa-kms"] = {
"Kam-Sui",
1023641,
"qfa-tak",
}
m["qfa-kor"] = {
"Korea",
11263525,
}
m["qfa-kra"] = {
"Kra",
1022087,
"qfa-tak",
}
m["qfa-lic"] = {
"Hlai",
1023648,
"qfa-tak",
aliases = {"Hlaik"},
}
m["qfa-mch"] = { -- digunakan di kedua-dua Amerika Utara dan Selatan
"Makro-Chibcha",
3438062,
}
m["qfa-mix"] = {
"campuran",
33694,
"qfa-cnt",
}
m["qfa-not"] = {
"bukan sekeluarga",
nil,
"qfa-not",
}
m["qfa-onb"] = {
"Be",
nil,
"qfa-bej",
aliases = {"Ong-Be", "Beik"},
}
m["qfa-ong"] = {
"Ongan",
2090575,
aliases = {"Angan", "Andaman Selatan", "Jarawa-Onge"},
}
m["qfa-pid"] = {
"pijin",
33831,
"crp",
}
m["qfa-sub"] = {
"substratum",
20730913,
"qfa-not",
}
m["qfa-tak"] = {
"Kra-Dai",
34171,
aliases = {"Tai-Kadai", "Kadai"},
}
m["qfa-tyn"] = {
"Tyrsenia",
1344038,
}
m["qfa-unc"] = {
-- Ini sepadan dengan bahasa yang biasanya dipanggil "tidak terkelas", iaitu data atau penyelidikan tidak mencukupi
-- untuk mengelaskannya, sedangkan [[:Kategori:Bahasa tidak terkelas]] kita hanyalah bahasa yang belum
-- dikelaskan oleh mana-mana penyunting Wiktionary (kod keluarga dalam data bahasa tiada).
"tidak dapat dikelaskan",
33956,
"qfa-not",
}
m["qfa-xgs"] = {
"Serbi-Mongol",
108887939,
}
m["qfa-xgx"] = {
"Para-Mongol",
107619002,
"qfa-xgs",
}
m["qfa-yen"] = {
"Yenisei",
27639,
"qfa-dny",
aliases = {"Yeniseik", "Yenisei-Ostyak"},
}
m["qfa-yke"] = {
"Ket",
nil,
"qfa-yen",
}
m["qfa-yko"] = {
"Kott",
nil,
"qfa-yen",
}
m["qfa-yrn"] = {
"Arin",
nil,
"qfa-yen",
}
m["qfa-ypm"] = {
"Pumpokol",
nil,
"qfa-yen",
}
m["qfa-yuk"] = {
"Yukaghir",
34164,
aliases = {"Yukagir", "Jukagir"},
}
m["qwe"] = {
"Quechua",
5218,
}
m["raj"] = {
"Rajasthan",
13196,
"inc-wes",
protoLanguage = "inc-ogu",
}
m["roa"] = {
"Romawi",
19814,
"itc",
aliases = {"Romanik", "Latin", "Neolatin", "Neo-Latin"},
protoLanguage = "la",
}
m["roa-asl"] = {
"Asturleones",
35390,
"roa-ibe",
protoLanguage = "roa-ole",
}
m["roa-cas"] = {
"Castilia",
71924,
"roa-ibe",
aliases = {"Castillian", "Castilik", "Castillik"},
protoLanguage = "osp",
}
m["roa-dal"] = {
"Romawi Dalmatia",
97646077,
"roa-itd",
}
m["roa-eas"] = {
"Romawi Timur",
147576,
"roa",
}
m["roa-emr"] = {
"Emilia-Romagnol",
242648,
"roa-git",
}
m["roa-gap"] = {
"Galicia-Portugis",
9080204,
"roa-ibe",
aliases = {"Romance Galicia", "Galaiko-Portugis"},
protoLanguage = "roa-opt",
}
m["roa-gar"] = {
"Gallo-Romawi",
500394,
"roa-wes",
}
m["roa-itd"] = {
"Italo-Dalmatia",
3313381,
"roa-iwr",
aliases = {"Romance Tengah"}
}
m["roa-itr"] = {
"Italo-Romawi",
3356483,
"roa-itd",
}
m["roa-iwr"] = {
"Italo-Romawi Barat",
112608,
"roa",
aliases = {"Italo-Barat"},
}
m["roa-git"] = {
"Gallo-Italik",
516074,
"roa-gar",
aliases = {"Gallo-Itali", "Gallo-Cisalpine", "Cisalpine"},
}
m["roa-grh"] = {
"Gallo-Raetia",
97646466,
"roa-gar",
}
m["roa-ibe"] = {
"Ibero-Romawi",
749533,
"roa-wes",
aliases = {"Romance Iberia", "Ibero-Romance Barat", "Ibero-Romance Barat", "Romance Iberia Barat", "Romance Iberia Barat"}
}
m["roa-nar"] = {
"Navarro-Aragon",
133252927,
"roa-ibe",
protoLanguage = "roa-ona",
}
m["roa-oil"] = {
"Oïl",
37351,
"roa-grh",
aliases = {"langues d'oïl", "langue d'oïl", "Cisalpine"},
protoLanguage = "fro",
}
m["roa-ocr"] = {
"Occitano-Romawi",
599958,
"roa-gar",
aliases = {"Gallo-Narbonnese", "Iberia Timur", "Iberia Timur"},
}
m["roa-rhe"] = {
"Raeto-Romawi",
515593,
"roa-grh",
aliases = {"langues d'oïl", "langue d'oïl", "Cisalpine"},
}
m["roa-sou"] = {
"Romawi Selatan",
145345,
"roa",
}
m["roa-wes"] = {
"Romawi Barat",
2714388,
"roa-iwr",
}
--[=[
Kod bahasa dan keluarga luar biasa bagi bahasa-bahasa Peribumi Amerika Selatan
boleh menggunakan awalan "sai-", walaupun "sai" bukan lagi kod keluarga itu sendiri.
]=]--
m["sai-ara"] = {
"Arauca",
626630,
}
m["sai-aym"] = {
"Aymara",
33010,
}
m["sai-bar"] = {
"Barbacoa",
807304,
aliases = {"Barbakoan"},
}
m["sai-bor"] = {
"Boran",
5371776,
}
m["sai-cah"] = {
"Cahuapanan",
1025793,
}
m["sai-car"] = {
"Karib",
33090,
aliases = {"Carib"},
}
m["sai-cer"] = {
"Cerrado",
98078151,
"sai-jee",
aliases = {"Jê Amazon"},
}
m["sai-chc"] = {
"Choco",
1075616,
aliases = {"Choco", "Chocó"},
}
m["sai-cho"] = {
"Chonan",
33019,
aliases = {"Chon"},
}
m["sai-cje"] = {
"Jê Tengah",
18010843,
"sai-cer",
aliases = {"Akuwẽ"},
}
m["sai-cpc"] = {
"Chapacuran",
1062626,
}
m["sai-crn"] = {
"Charruan",
3112423,
aliases = {"Charrúan"},
}
m["sai-ctc"] = {
"Catacao",
5051139,
}
m["sai-guc"] = {
"Guaicuruan",
1974973,
"sai-mgc",
aliases = {"Guaicurú", "Guaycuruana", "Guaikurú", "Guaycuruano", "Guaykuruan", "Waikurúan"},
}
m["sai-guh"] = {
"Guajibo",
944056,
aliases = {"Guahiboan", "Guajiboan", "Wahivoan"},
}
m["sai-gui"] = {
"Guiana",
nil,
"sai-car",
aliases = {"Carib Guiana", "Carib Guiana"},
}
m["sai-har"] = {
"Harákmbut",
1584402,
"sai-hkt",
aliases = {"Harákmbet"},
}
m["sai-hkt"] = {
"Harákmbut-Katukinan",
17107635,
}
m["sai-hrp"] = {
"Huarpean",
1578336,
aliases = {"Warpean", "Huarpe", "Warpe"},
}
m["sai-jee"] = {
"Jê",
1483594,
"sai-mje",
aliases = {"Gê", "Jean", "Gean", "Jê-Kaingang", "Ye"},
}
m["sai-jir"] = {
"Jirajaran",
3028651,
aliases = {"Hiraháran"},
}
m["sai-jiv"] = {
"Jivaro",
1393074,
aliases = {"Hívaro", "Jibaro", "Jibaroan", "Jibaroana", "Jívaro"},
}
m["sai-ktk"] = {
"Katukinan",
2636000,
"sai-hkt",
aliases = {"Catuquinan"},
}
m["sai-kui"] = {
"Kuikuroan",
nil,
"sai-car",
aliases = {"Kuikuro", "Nahukwa"},
}
m["sai-map"] = {
"Mapoyan",
61096301,
"sai-ven",
aliases = {"Mapoyo", "Mapoyo-Yabarana", "Mapoyo-Yavarana", "Mapoyo-Yawarana"},
}
m["sai-mas"] = {
"Mascoian",
1906952,
aliases = {"Mascoyan", "Maskoian", "Enlhet-Enenlhet"},
}
m["sai-mgc"] = {
"Mataco-Guaicuru",
255512,
}
m["sai-mje"] = {
"Makro-Jê",
887133,
aliases = {"Makro-Gê"},
}
m["sai-mtc"] = {
"Matacoan",
2447424,
"sai-mgc",
}
m["sai-mur"] = {
"Mura",
33826,
aliases = {"Mura"},
}
m["sai-nad"] = {
"Nadahup",
1856439,
aliases = {"Makú", "Macú", "Vaupés-Japurá"},
}
m["sai-nje"] = {
"Jê Utara",
98078225,
"sai-cer",
aliases = {"Jê Teras"},
}
m["sai-nmk"] = {
"Nambikwaran",
15548027,
aliases = {"Nambicuaran", "Nambiquaran", "Nambikuaran"},
}
m["sai-otm"] = {
"Otomacoan",
3217503,
aliases = {"Otomákoan", "Otomakoan"},
}
m["sai-pan"] = {
"Pano",
1544537,
"sai-pat",
aliases = {"Pano"},
}
m["sai-pat"] = {
"Pano-Tacana",
2475746,
aliases = {"Pano-Tacana", "Pano-Takana", "Páno-Takána", "Pano-Takánan"},
}
m["sai-pek"] = {
"Pekodian",
107451736,
"sai-car",
aliases = {"Carib Amazon Selatan", "Cariban Selatan", "Pekodi"},
}
m["sai-pem"] = {
"Pemong",
nil,
"sai-ven",
aliases = {"Pemong", "Pemóng", "Purukoto"},
}
m["sai-pey"] = {
"Peba-Yaguan",
174015,
aliases = {"Peba-Yagua", "Yaguan", "Peban", "Yáwan"},
}
m["sai-prk"] = {
"Parukotoan",
107451482,
"sai-car",
aliases = {"Parukoto"},
}
m["sai-sje"] = {
"Jê Selatan",
98078245,
"sai-jee",
}
m["sai-tac"] = {
"Tacanan",
3113762,
"sai-pat",
}
m["sai-tar"] = {
"Tarano",
105097814,
"sai-gui",
aliases = {"Trio", "Tarano"},
}
m["sai-tin"] = {
"Tiniguan",
2892258,
aliases = {"Tinigua"},
}
m["sai-tuc"] = {
"Tucanoan",
788144,
}
m["sai-tyu"] = {
"Ticuna-Yuri",
4467010,
}
m["sai-ucp"] = {
"Uru-Chipaya",
2475488,
aliases = {"Uru-Chipayan"},
}
m["sai-ven"] = {
"Karib Venezuela",
nil,
"sai-car",
aliases = {"Carib Venezuela", "Venezuela", "Venezuelano"},
}
m["sai-wic"] = {
"Wichí",
3027047,
}
m["sai-wit"] = {
"Witotoan",
43079317,
aliases = {"Huitotoan", "Uitotoan"},
}
m["sai-ynm"] = {
"Yanomami",
nil,
aliases = {"Yanomam", "Shamatari", "Yamomami", "Yanomaman"},
}
m["sai-yuk"] = {
"Yukpan",
nil,
"sai-car",
aliases = {"Yukpa", "Yukpano", "Yukpa-Japreria"},
}
m["sai-zam"] = {
"Zamucoan",
3048461,
aliases = {"Samúkoan"},
}
m["sai-zap"] = {
"Zaparo",
33911,
aliases = {"Záparoan", "Saparoan", "Sáparoan", "Záparo", "Zaparoano", "Zaparoana"},
}
m["sal"] = {
"Salish",
33985,
}
m["sdv"] = {
"Sudan Timur",
2036148,
"ssa",
}
m["sdv-bri"] = {
"Bari",
nil,
"sdv-nie",
}
m["sdv-daj"] = {
"Daju",
956724,
"sdv",
}
m["sdv-dnu"] = {
"Dinka-Nuer",
nil,
"sdv-niw",
}
m["sdv-eje"] = {
"Jebel Timur",
3408878,
"sdv",
}
m["sdv-kln"] = {
"Kalenjin",
637228,
"sdv-nis",
}
m["sdv-lma"] = {
"Lotuko-Maa",
nil,
"sdv-nie",
}
m["sdv-lon"] = {
"Luo Utara",
nil,
"sdv-luo",
}
m["sdv-los"] = {
"Luo Selatan",
7570103,
"sdv-luo",
}
m["sdv-luo"] = {
"Luo",
nil,
"sdv-niw",
}
m["sdv-nes"] = {
"Sudan Timur Utara",
4810496,
"sdv",
aliases = {"Astaboran", "Sudanik Ek"},
}
m["sdv-nie"] = {
"Nil Timur",
153795,
"sdv-nil",
}
m["sdv-nil"] = {
"Nil",
513408,
"sdv",
}
m["sdv-nis"] = {
"Nil Selatan",
1552410,
"sdv-nil",
}
m["sdv-niw"] = {
"Nil Barat",
3114989,
"sdv-nil",
}
m["sdv-nma"] = {
"Nandi-Markweta",
nil,
"sdv-kln",
}
m["sdv-nyi"] = {
"Nyima",
11688746,
"sdv-nes",
aliases = {"Nyimang"},
}
m["sdv-tmn"] = {
"Taman",
3408873,
"sdv-nes",
aliases = {"Tamaik"},
}
m["sdv-ttu"] = {
"Teso-Turkana",
7705551,
"sdv-nie",
aliases = {"Ateker"},
}
m["sel"] = {
"Selkup",
34008,
"syd",
}
m["sem"] = {
"Samiah",
34049,
"afa",
}
m["sem-ara"] = {
"Aram",
28602,
"sem-nwe",
protoLanguage = "arc",
}
m["sem-arb"] = {
"Arab",
164667,
"sem-cen",
protoLanguage = "ar",
}
m["sem-are"] = {
"Aram Timur",
3410322,
"sem-ara",
}
m["sem-arw"] = {
"Aram Barat",
3394214,
"sem-ara",
}
m["sem-ase"] = {
"Aram Tenggara",
3410322,
"sem-are",
}
m["sem-can"] = {
"Kanaan",
747547,
"sem-nwe",
}
m["sem-cen"] = {
"Samiah Tengah",
3433228,
"sem-wes",
}
m["sem-cna"] = {
"Neo-Aram Tengah",
3410322,
"sem-are",
}
m["sem-eas"] = {
"Samiah Timur",
164273,
"sem",
}
m["sem-eth"] = {
"Samiah Habsyah",
163629,
"sem-wes",
aliases = {"Afro-Semitik", "Habsyah", "Etiopia", "Etiosemitik"},
}
m["sem-nna"] = {
"Neo-Aram Timur Laut",
2560578,
"sem-are",
}
m["sem-nwe"] = {
"Samiah Barat Laut",
162996,
"sem-cen",
}
m["sem-osa"] = {
"Arab Selatan Kuno",
35025,
"sem-cen",
aliases = {"Arab Selatan Epigrafik", "Sayhadik"},
}
m["sem-sar"] = {
"Arab Selatan Moden",
1981908,
"sem-wes",
}
m["sem-wes"] = {
"Samiah Barat",
124901,
"sem",
}
m["sgn"] = {
"isyarat",
34228,
"qfa-not",
}
m["sgn-asl"] = {
"Bahasa Isyarat Amerika",
nil,
"sgn-fsl",
}
m["sgn-fsl"] = {
"French Sign Languages",
5501921,
"sgn",
}
m["sgn-gsl"] = {
"German Sign Languages",
5551235,
"sgn",
}
m["sgn-jsl"] = {
"Japanese Sign Languages",
11722508,
"sgn",
}
m["sio"] = {
"Sioux",
34181,
"nai-sca",
}
m["sio-dhe"] = {
"Dhegiha",
3217420,
"sio-msv",
}
m["sio-dkt"] = {
"Dakota",
4154122,
"sio-msv",
}
m["sio-mor"] = {
"Sioux Sungai Missouri",
26807266,
"sio",
}
m["sio-msv"] = {
"Sioux Lembah Mississippi",
12637104,
"sio",
}
m["sio-ohv"] = {
"Sioux Lembah Ohio",
21070931,
"sio",
}
m["sit"] = {
"Sino-Tibet",
45961,
aliases = {"Trans-Himalaya"},
}
m["sit-aao"] = {
"Naga Tengah",
615474,
"sit",
}
m["sit-alm"] = {
"Almora",
nil,
"sit-whm",
}
m["sit-bai"] = {
"Bai",
35103,
"sit-mba",
}
m["sit-bdi"] = {
"Bod",
1814078,
"sit",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["sit-cln"] = {
"Cai-Long",
107182612,
"sit-mba",
aliases = {"Ta-Li"},
}
m["sit-dhi"] = {
"Dhimalish",
1207648,
"sit",
}
m["sit-ebo"] = {
"Bod Timur",
56402,
"sit-bdi",
}
m["sit-egy"] = {
"Gyalrong Timur",
832026,
"sit-rgy",
}
m["sit-ers"] = {
"Ersu",
56335,
"sit",
}
m["sit-gma"] = {
"Magar Raya",
55612963,
"sit",
}
m["sit-gsi"] = {
"Siang Raya",
52698851,
"sit",
}
m["sit-hrs"] = {
"Hrusish",
1632501,
"sit",
aliases = {"Kamengik Tenggara"},
}
m["sit-jnp"] = {
"Jingpho",
nil,
"sit-jpl",
aliases = {"Jingpho"},
}
m["sit-jpl"] = {
"Kachin-Lu",
1515454,
"tbq-bkj",
aliases = {"Jingpho-Luish", "Jingpho-Asakian", "Kachinik"},
}
m["sit-kch"] = {
"Konyak-Chang",
nil,
"sit-kon",
}
m["sit-kha"] = {
"Kham",
33305,
"sit-gma",
}
m["sit-khb"] = {
"Kho-Bwa",
6401917,
"sit",
aliases = {"Bugunish", "Kamengik"},
}
m["sit-khw"] = {
"Western Kho-Bwa",
nil,
"sit-khb",
}
m["sit-khc"] = {
"Chug-Lish",
nil,
"sit-khw",
aliases = {"Duhumbi-Khispi"},
}
m["sit-khm"] = {
"Mey-Sartang",
nil,
"sit-khw",
aliases = {"Sartang-Sherdukpen"},
}
m["sit-kic"] = {
"Kiranti Tengah",
nil,
"sit-kir",
}
m["sit-kie"] = {
"Kiranti Timur",
nil,
"sit-kir",
}
m["sit-kin"] = {
"Kinnauri",
nil,
"sit-whm",
aliases = {"Kinnauri"},
}
m["sit-kir"] = {
"Kiranti",
922148,
"sit",
}
m["sit-kiw"] = {
"Kiranti Barat",
922148,
"sit-kir",
}
m["sit-kon"] = {
"Konyak",
774590,
"tbq-bkj",
aliases = {"Konyakian", "Konyak"},
}
m["sit-kyk"] = {
"Kyirong-Kagate",
6450957,
"sit-tib",
}
m["sit-lab"] = {
"Ladakh-Balti",
6450957,
"sit-tib",
}
m["sit-las"] = {
"Lahuli-Spiti",
6473510,
"sit-tib",
}
m["sit-luu"] = {
"Lui",
55621439,
"sit-jpl",
aliases = {"Asakian", "Sak"},
}
m["sit-mar"] = {
"Maring",
nil,
"sit-tma",
}
m["sit-mba"] = {
"Makro-Bai",
16963847,
"sit-sba",
aliases = {"Bai Raya"},
}
m["sit-mdz"] = {
"Midzu",
6843504,
"sit",
aliases = {"Geman", "Midzuish", "Miju-Meyor", "Mishmi Selatan"},
}
m["sit-mnz"] = {
"Mondzi",
6898839,
"tbq-lob",
aliases = {"Mangish"},
}
m["sit-mru"] = {
"Mru",
16908870,
"sit",
aliases = {"Mru-Hkongso"},
}
m["sit-nas"] = {
"Naish",
25047956,
"sit-nax",
}
m["sit-nax"] = {
"Na",
6982999,
"tbq-buq",
aliases = {"Naxish"},
}
m["sit-nba"] = {
"Bai Utara",
122463830,
"sit-bai",
}
m["sit-new"] = {
"Newar",
55625069,
"sit",
}
m["sit-nng"] = {
"Nung",
1515482,
"sit",
aliases = {"Nung"},
}
m["sit-qia"] = {
"Qiang",
1636765,
"tbq-buq",
}
m["sit-rgy"] = {
"Rgyalrong",
56936,
"sit-qia",
aliases = {"Jiarongik"},
}
m["sit-sba"] = {
"Sino-Bai",
nil,
"sit",
aliases = {"Bai Raya"},
}
m["sit-tam"] = {
"Tamang",
3309439,
"sit",
aliases = {"Bodish Barat"},
}
m["sit-tan"] = {
"Tani",
3217538,
"sit",
}
m["sit-tib"] = {
"Tibet",
1641150,
"sit-bdi",
protoLanguage = "otb",
}
m["sit-tja"] = {
"Tujia",
nil,
"sit",
}
m["sit-tma"] = {
"Tangkhul-Maring",
nil,
"sit",
}
m["sit-tng"] = {
"Tangkhul",
1516657,
"sit-tma",
aliases = {"Tangkhul"},
}
m["sit-tno"] = {
"Tangsa-Nocte",
nil,
"sit-kon",
}
m["sit-tsk"] = {
"Tshangla",
nil,
"sit",
}
m["sit-wgy"] = {
"Gyalrong Barat",
nil,
"sit-rgy"
}
m["sit-whm"] = {
"Himalaya Barat",
2301695,
"sit",
}
m["sit-zem"] = {
"Zeme",
189291,
"sit",
aliases = {"Zeliangrong", "Zemeik"},
}
m["sla"] = {
"Slavik",
23526,
"ine-bsl",
aliases = {"Slavonik"},
}
m["smi"] = {
"Sami",
56463,
"urj",
aliases = {"Saami", "Samik", "Saamik"},
}
m["son"] = {
"Songhay",
505198,
"ssa",
aliases = {"Songhai"},
}
m["sqj"] = {
"Albania",
8748,
"ine",
}
m["ssa"] = {
"Nilo-Sahara", -- berkemungkinan bukan pengelompokan genetik
33705,
}
m["ssa-fur"] = {
"Fur",
2989512,
"ssa",
}
m["ssa-klk"] = {
"Kuliak",
1791476,
"ssa",
aliases = {"Rub"},
}
m["ssa-kom"] = {
"Koman",
1781084,
"ssa",
}
m["ssa-sah"] = {
"Sahara",
1757661,
"ssa",
}
m["syd"] = {
"Samoyed",
34005,
"urj",
aliases = {"Samoyedik", "Samodeik"},
}
m["syd-ene"] = {
"Enets",
29942,
"syd",
}
m["tai"] = {
"Tai",
749720,
"qfa-bet",
aliases = {"Daik"},
}
m["tai-wen"] = {
"Wenma-Tai Barat Daya",
nil,
"tai",
}
m["tai-tay"] = {
"Tày",
nil,
"tai-wen",
}
m["tai-sap"] = {
"Sapa-Tai Barat Daya",
nil,
"tai-wen",
aliases = {"Sapa-Thai"},
}
m["tai-swe"] = {
"Tai Barat Daya",
10889250,
"tai-sap",
}
m["tai-cho"] = {
"Tai Chongzuo",
13216,
"tai",
}
m["tai-cen"] = {
"Tai Tengah",
5061891,
"tai",
}
m["tai-nor"] = {
"Tai Utara",
7059014,
"tai",
}
m["tbq"] = {
"Tibet-Burma",
34064,
"sit",
}
m["tbq-anp"] = {
"Angami-Pochuri",
530460,
"sit",
}
m["tbq-axi"] = {
"Axioid",
nil,
"tbq-sel",
}
m["tbq-bdg"] = {
"Bodo-Garo",
4090000,
"tbq-bkj",
}
m["tbq-bis"] = {
"Bisoid",
48844742,
"tbq-slo",
}
m["tbq-bka"] = {
"Bi-Ka",
12627890,
"tbq-slo",
}
m["tbq-bkj"] = {
"Sal",
889900,
"sit",
-- Brahmaputran nampaknya merupakan istilah Glottolog
aliases = {"Bodo-Konyak-Jinghpaw", "Brahmaputra", "Jingpho-Konyak-Bodo"},
}
m["tbq-brm"] = {
"Burma",
865713,
"tbq-lob",
}
m["tbq-buq"] = {
"Burma-Qiang",
16056278,
"sit",
aliases = {"Tibeto-Burma Timur"},
}
m["tbq-drp"] = {
"Phula Hilir",
7188378,
"tbq-rph",
}
m["tbq-han"] = {
"Hanoid",
17004185,
"tbq-slo",
}
m["tbq-hph"] = {
"Phula Tanah Tinggi",
nil,
"tbq-sel",
}
m["tbq-jin"] = {
"Jino",
6202716,
"tbq-slo",
}
m["tbq-kzh"] = {
"Kazhuoish",
48834669,
"tbq-lol",
}
m["tbq-kuk"] = {
"Kuki-Chin",
832413,
"sit",
aliases = {"Kukik", "Tibeto-Burma Selatan-Tengah"},
}
m["tbq-lal"] = {
"Lalo",
56548,
"tbq-lso",
}
m["tbq-lho"] = {
"Lahoish",
nil,
"tbq-lol",
}
m["tbq-llo"] = {
"Lipo-Lolopo",
nil,
"tbq-lso",
}
m["tbq-lob"] = {
"Lolo-Burma",
1635712,
"tbq-buq",
}
m["tbq-lol"] = {
"Lolo",
37035,
"tbq-lob",
aliases = {"Yi", "Ngwi", "Nisoik"},
}
m["tbq-lso"] = {
"Lisu",
6559055,
"tbq-lol",
}
m["tbq-lwo"] = {
"Lawu",
48847673,
"tbq-lol",
}
m["tbq-muj"] = {
"Muji",
11221327,
"tbq-hph",
}
m["tbq-nas"] = {
"Nasu",
nil,
"tbq-nlo",
}
m["tbq-nis"] = {
"Nisu",
56404,
"tbq-nlo",
}
m["tbq-nlo"] = {
"Lolo Utara",
7058676,
"tbq-nso",
}
m["tbq-nso"] = {
"Niso",
56990,
"tbq-lol",
}
m["tbq-nus"] = {
"Nusu",
114245231,
"tbq-lol",
}
m["tbq-phw"] = {
"Phowa",
7187959,
"tbq-hph",
}
m["tbq-rph"] = {
"Phula Sungai",
nil,
"tbq-sel",
}
m["tbq-sel"] = {
"Lolo Tenggara",
16111894,
"tbq-nso",
}
m["tbq-sil"] = {
"Siloid",
60787071,
"tbq-slo",
}
m["tbq-slo"] = {
"Lolo Selatan",
5649340,
"tbq-lol",
}
m["tbq-tal"] = {
"Talu",
48804018,
"tbq-lso",
}
m["tbq-urp"] = {
"Phula Hulu",
7187058,
"tbq-rph",
}
m["trk"] = {
"Turk",
34090,
}
m["trk-cmn"] = {
"Turk Am",
1126028,
"trk",
aliases = {"Turkik Shaz"},
}
m["trk-kar"] = {
"Karluk",
703173,
"trk-cmn",
aliases = {"Qarluq", "Uyghur-Uzbek", "Turkik Tenggara"},
}
m["trk-kbu"] = {
"Kipchak-Bulgar",
3512539,
"trk-kip",
aliases = {"Ural", "Ural-Kaspia"},
}
m["trk-kcu"] = {
"Kipchak-Cuman",
4370412,
"trk-kip",
aliases = {"Ponto-Kaspia"},
}
m["trk-kip"] = {
"Kipchak",
1339898,
"trk-cmn",
-- Rencana Wikipedia Bahasa Rusia [[w:ru:Западнотюркские_языки]] menyatakan "Western Turkic" digunakan oleh N.A. Baskakov dan merangkumi Oghuz, Kipchak dan Karluk.
-- Rencana Wikipedia Bahasa Azerbaijan [[w:az:Qərbi_türk_dilləri]] menjelaskan bahawa "Western Turkic" bukan satu klad.
other_names = {"Turkik Barat"},
aliases = {"Kypchak", "Qypchaq", "Turkik Barat Laut"},
protoLanguage = "qwm",
}
m["trk-kkp"] = {
"Kyrgyz-Kipchak",
4221189,
"trk-kip",
}
m["trk-kno"] = {
"Kipchak-Nogai",
4326954,
"trk-kip",
aliases = {"Aral-Kaspia"},
}
m["trk-nsb"] = {
"Turk Siberia Utara",
4537269,
"trk-sib",
aliases = {"Turkik Siberia Bahagian Utara"},
}
m["trk-ogr"] = {
"Oghur",
1422731,
"trk",
aliases = {"Turkik Lir", "Turkik r"},
}
m["trk-ogz"] = {
"Oghuz",
494600,
"trk-cmn",
aliases = {"Turkik Barat Daya"},
}
m["trk-sib"] = {
"Turk Siberia",
354353,
"trk-cmn",
other_names = {"Turkik Utara"},
-- menurut [[w:ru:Восточнотюркские_языки]], "Eastern Turkic" ialah alias untuk Turkik Siberia dalam karya O.A. Mudrak,
-- tetapi mempunyai maksud bukan-klad yang berbeza dalam karya lama N.A. Baskakov.
aliases = {"Turkik Timur", "Turkik Timur Laut"},
}
m["trk-ssb"] = {
"Turk Siberia Selatan",
nil,
"trk-sib",
aliases = {"Turkik Siberia Bahagian Selatan"},
}
m["tup"] = {
"Tupi",
34070,
aliases = {"Tupian"},
}
m["tup-gua"] = {
"Tupi-Guarani",
148610,
"tup",
aliases = {"Tupí-Guaraní"},
}
m["tuw"] = {
"Tungus",
34230,
aliases = {"Manchu-Tungus", "Tungus"},
}
m["tuw-ewe"] = {
"Ewenik",
105889448,
"tuw",
aliases = {"Tungusik Utara"},
}
m["tuw-jrc"] = {
"Jurchen",
105889432,
"tuw",
aliases = {"Manchurik"},
}
m["tuw-nan"] = {
"Nanai",
105889264,
"tuw",
}
m["tuw-udg"] = {
"Udeghe",
105889266,
"tuw",
}
m["urj"] = {
"Ural",
34113,
varieties = {"Finno-Ugrik"},
}
m["urj-fin"] = {
"Finnik",
33328,
"urj",
aliases = {"Finnik Baltik", "Balto-Finnik", "Fennik"},
}
m["urj-mdv"] = {
"Mordvin",
627313,
"urj",
}
m["urj-prm"] = {
"Perm",
161493,
"urj",
}
m["urj-ugr"] = {
"Ugri",
156631,
"urj",
}
m["wak"] = {
"Wakash",
60069,
}
m["wen"] = {
"Sorbia",
25442,
"zlw",
aliases = {"Lusatia", "Wendish"},
}
m["xgn"] = {
"Mongol",
33750,
"qfa-xgs",
aliases = {"Mongolia"},
}
m["xgn-cen"] = {
"Mongol Tengah",
28719447,
"xgn",
protoLanguage = "xng-lat",
}
m["xgn-sou"] = {
"Mongol Selatan",
nil,
"xgn",
protoLanguage = "xng-ear",
}
m["xgn-shr"] = {
"Shirongol",
107539435,
"xgn-sou",
}
m["xme"] = {
"Medes",
nil,
"ira-mpr",
protoLanguage = "xme-old",
}
m["xme-ttc"] = {
"Tat",
nil,
"xme",
}
m["xnd"] = {
"Na-Dene",
26986,
"qfa-dny",
aliases = {"Na-Dené"},
}
m["xsc"] = {
"Scythia",
nil,
"ira-nei",
}
m["xsc-sak"] = {
"Saka",
nil,
"xsc-skw",
aliases = {"Sakan"},
}
m["xsc-sar"] = {
"Sarmata",
nil,
"xsc",
}
m["xsc-skw"] = {
"Saka-Wakhi",
nil,
"xsc",
}
m["yok"] = {
"Yokuts",
34249,
"nai-you",
aliases = {"Yokutsan", "Mariposan", "Mariposa"},
}
m["ypk"] = {
"Yupik",
27970,
"esx-esk",
aliases = {"Yup'ik", "Yuit"},
}
m["yrk"] = {
"Nenets",
36452,
"syd",
}
m["zhx"] = {
"Sinitik",
33857,
"sit-sba",
aliases = {"Cina"},
protoLanguage = "och",
}
m["zhx-com"] = {
"Min Pesisir",
20667215,
"zhx-min",
}
m["zhx-inm"] = {
"Min Pedalaman",
20667237,
"zhx-min",
}
m["zhx-man"] = {
"Mandarin",
nil,
"zhx",
protoLanguage = "cmn-ear",
}
m["zhx-min"] = {
"Min",
56504,
"zhx",
}
m["zhx-nan"] = {
"Min Selatan",
36495,
"zhx-com",
}
m["zhx-pin"] = {
"Pinghua",
2735715,
"zhx",
protoLanguage = "ltc",
}
m["zhx-yue"] = {
"Yue",
7033959,
"zhx",
protoLanguage = "ltc",
}
m["zle"] = {
"Slavik Timur",
144713,
"sla",
}
m["zls"] = {
"Slavik Selatan",
146665,
"sla",
}
m["zlw"] = {
"Slavik Barat",
145852,
"sla",
}
m["zlw-lch"] = {
"Lechia",
742782,
"zlw",
aliases = {"Lekhitik"},
}
m["zlw-pom"] = {
"Pomerania",
nil,
"zlw-lch",
}
m["znd"] = {
"Zande",
8066072,
"nic-ubg",
}
return require("Module:languages").finalizeData(m, "family")
4rz5kuqtllpgff06qkhwpisgrcvwouc
373561
373560
2026-09-11T13:20:30Z
Hakimi97
2668
Kemas kini terjemahan
373561
Scribunto
text/plain
--[=[
This module contains definitions for all language family codes on Wiktionary.
]=]--
local m = {}
m["aav"] = {
"Austroasia",
33199,
aliases = {"Austro-Asiatik"},
}
m["aav-khs"] = {
"Khasi",
3073734,
"aav",
aliases = {"Khasik"},
}
m["aav-nic"] = {
"Nicobar",
217380,
"aav",
}
m["aav-pkl"] = {
"Pnar-Khasi-Lyngngam",
nil,
"aav-khs",
}
m["afa"] = {
"Afroasia",
25268,
aliases = {"Afroasiatik"},
}
m["alg"] = {
"Algonquin",
33392,
"aql",
}
m["alg-abp"] = {
"Abenaki-Penobscot",
197936,
"alg-eas",
}
m["alg-ara"] = {
"Arapaho",
2153686,
"alg",
}
m["alg-eas"] = {
"Algonquin Timur",
2257525,
"alg",
}
m["alg-sfk"] = {
"Sac-Fox-Kickapoo",
1440172,
"alg",
}
m["alv"] = {
"Atlantik-Congo",
771124,
"nic",
}
m["alv-aah"] = {
"Ayere-Ahan",
750953,
"alv-von",
}
m["alv-ada"] = {
"Adamawa",
32906,
"alv-sav",
}
m["alv-bag"] = {
"Baga",
2746083,
"alv-mel",
}
m["alv-bak"] = {
"Bak",
1708174,
"alv-sng",
}
m["alv-bam"] = {
"Bambuka",
4853456,
"alv-ada",
aliases = {"Yungur-Jen"},
}
m["alv-bny"] = {
"Banyum",
2892477,
"alv-nyn",
}
m["alv-bua"] = {
"Bua",
4982094,
"alv-mbd",
}
m["alv-bwj"] = {
"Bikwin-Jen",
84542501,
"alv-bam",
}
m["alv-cng"] = {
"Cangin",
1033184,
"alv-fwo",
}
m["alv-ctn"] = {
"Tano Tengah",
1658486,
"alv-ptn",
aliases = {"Akan"},
}
m["alv-dlt"] = {
"Edoid Delta",
nil,
"alv-edo",
}
m["alv-dur"] = {
"Duru",
5316788,
"alv-lni",
}
m["alv-ede"] = {
"Ede",
35368,
"alv-yor",
}
m["alv-edk"] = {
"Edekiri",
5336735,
"alv-yrd",
}
m["alv-edo"] = {
"Edoid",
1287469,
"alv-von",
}
m["alv-eeo"] = {
"Edo-Esan-Ora",
12630439,
"alv-nce",
}
m["alv-fli"] = {
"Fali",
3450166,
"alv",
}
m["alv-fwo"] = {
"Fula-Wolof",
12631267,
"alv-sng",
}
m["alv-gbe"] = {
"Gbe",
668284,
"alv-von",
}
m["alv-gda"] = {
"Ga-Dangme",
3443338,
"alv-kwa",
}
m["alv-gng"] = {
"Guang",
684009,
"alv-ptn",
}
m["alv-gtm"] = {
"Pergunungan Ghana-Togo",
493020,
"alv-kwa",
aliases = {"Togo Remnant", "Togo Tengah"},
}
m["alv-hei"] = {
"Heiban",
108752116,
"alv-the",
}
m["alv-ido"] = {
"Idomoid",
974196,
"alv-von",
}
m["alv-igb"] = {
"Igboid",
1429100,
"alv-von",
}
m["alv-jfe"] = {
"Jola-Felupe",
1708174,
"alv-jol",
aliases = {"Ejamat"},
}
m["alv-jol"] = {
"Jola",
35176,
"alv-bak",
aliases = {"Diola"},
}
m["alv-kim"] = {
"Kim",
6409701,
"alv-mbd",
}
m["alv-kis"] = {
"Kissi",
35696,
"alv-mel",
}
m["alv-krb"] = {
"Karaboro",
4213541,
"alv-snf",
}
m["alv-ktg"] = {
"Ka-Togo",
5972796,
"alv-gtm",
}
m["alv-kul"] = {
"Kulango",
16977424,
"alv-sav",
aliases = {"Kulango-Lorhon", "Kulango-Lorom"},
}
m["alv-kwa"] = {
"Kwa",
33430,
"nic-vco",
}
m["alv-lag"] = {
"Lagoon",
111210042,
"alv-kwa",
}
m["alv-lek"] = {
"Leko",
6520642,
other_names = {"Sambaic"},
"alv-lni",
}
m["alv-lim"] = {
"Limba",
35825,
"alv",
}
m["alv-lni"] = {
"Leko-Nimbari",
1708170,
"alv-ada",
other_names = {"Adamawa Tengah"},
aliases = {"Chamba-Mumuye"},
}
m["alv-mbd"] = {
"Mbum-Day",
6799816,
"alv-ada",
}
m["alv-mbm"] = {
"Mbum",
6799814,
"alv-mbd",
}
m["alv-mel"] = {
"Mel",
12122355,
"alv",
}
m["alv-mum"] = {
"Mumuye",
84607009,
"alv-mye",
}
m["alv-mye"] = {
"Mumuye-Yendang",
6935539,
"alv-lni",
}
m["alv-nal"] = {
"Nalu",
nil,
"alv-sng",
}
m["alv-nce"] = {
"Edoid Utara-Tengah",
16110869,
"alv-edo",
}
m["alv-ngb"] = {
"Nupe-Gbagyi",
12638649,
"alv-nup",
aliases = {"Nupe-Gbari"},
}
m["alv-ntg"] = {
"Na-Togo",
nil,
"alv-gtm",
}
m["alv-nup"] = {
"Nupoid",
1429143,
"alv-von",
}
m["alv-nwd"] = {
"Edoid Barat Laut",
16111012,
"alv-edo",
}
m["alv-nyn"] = {
"Nyun",
nil,
"alv-fwo",
}
m["alv-pap"] = {
"Papel",
7132562,
"alv-bak",
}
m["alv-pph"] = {
"Phla-Pherá",
3849625,
"alv-gbe",
}
m["alv-ptn"] = {
"Potou-Tano",
1475003,
"alv-kwa",
}
m["alv-sav"] = {
"Savanna",
4403672,
"nic-vco",
aliases = {"Savannas"},
}
m["alv-sma"] = {
"Supyire-Mamara",
4446348,
"alv-snf",
aliases = {"Suppire-Mamara"},
}
m["alv-snf"] = {
"Senufo",
33795,
"alv",
aliases = {"Senufic", "Senoufo", "Sénoufo"},
}
m["alv-sng"] = {
"Senegambia",
1708753,
"alv",
}
m["alv-snr"] = {
"Senari",
4416084,
"alv-snf",
}
m["alv-swd"] = {
"Edoid Barat Daya",
12633903,
"alv-edo",
}
m["alv-tal"] = {
"Talodi",
12643302,
"alv-the",
}
m["alv-tdj"] = {
"Tagwana-Djimini",
7675362,
"alv-snf",
}
m["alv-ten"] = {
"Tenda",
3217535,
"alv-fwo",
}
m["alv-the"] = {
"Talodi-Heiban",
1521145,
"alv",
}
m["alv-von"] = {
"Volta-Niger",
34177,
"nic-vco",
}
m["alv-wan"] = {
"Wara-Natyoro",
7968830,
"alv-sav",
}
m["alv-wjk"] = {
"Waja-Kam",
nil,
"alv-ada",
}
m["alv-yek"] = {
"Yekhee",
nil,
"alv-nce",
}
m["alv-yor"] = {
"Yoruba",
nil,
"alv-edk",
}
m["alv-yrd"] = {
"Yoruboid",
1789745,
"alv-von",
}
m["alv-yun"] = {
"Yungur",
84601642,
"alv-bam",
aliases = {"Bena-Mboi"},
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation".
m["apa"] = {
"Apache",
27758,
"ath",
aliases = {"Athabaskan Selatan"},
}
m["aqa"] = {
"Alacalufan",
1288430,
}
m["aql"] = {
"Algik",
721612,
aliases = {"Algonquian-Ritwan", "Algonquian-Wiyot-Yurok"},
}
m["art"] = {
"buatan",
33215,
"qfa-not",
aliases = {"artificial", "planned"},
}
m["ath"] = {
"Athabaska",
27475,
"xnd",
}
m["ath-nor"] = {
"Athabaska Utara",
20738,
"ath",
aliases = {"Athabaskan Utara"},
}
m["ath-pco"] = {
"Athabaska Pesisir Pasifik",
20654,
"ath",
}
m["auf"] = {
"Arawa",
626772,
aliases = {"Arahuan", "Arauán", "Arawa", "Arawan", "Arawán"},
}
--[=[
Kod bahasa dan keluarga luar biasa untuk bahasa Aborigin Australia
boleh menggunakan awalan "aus-", walaupun "aus" bukan lagi kod keluarga itu sendiri.
]=]--
m["aus-arn"] = {
"Arnhem",
2581700,
aliases = {"Gunwinyguan", "Macro-Gunwinyguan"},
}
m["aus-bub"] = {
"Bunuba",
2495148,
aliases = {"Bunaban"},
}
m["aus-cww"] = {
"New South Wales Tengah",
5061507,
"aus-pam",
}
m["aus-dal"] = {
"Daly",
2478079,
}
m["aus-dyb"] = {
"Dyirbal",
1850666,
"aus-pam",
}
m["aus-gar"] = {
"Garawan",
5521951,
}
m["aus-gun"] = {
"Gunwinyguan",
2581700,
"aus-arn",
aliases = {"Gunwingguan"},
}
m["aus-jar"] = {
"Jarrakan",
2039423,
}
m["aus-kar"] = {
"Karnic",
4215578,
"aus-pam",
}
m["aus-mir"] = {
"Mirndi",
4294095,
}
m["aus-nga"] = {
"Ngayarda",
16153490,
"aus-psw",
}
m["aus-nyu"] = {
"Nyulnyulan",
2039408,
}
m["aus-pam"] = {
"Pama-Nyunga",
33942,
}
m["aus-pmn"] = {
"Pama",
2640654,
"aus-pam",
}
m["aus-psw"] = {
"Pama-Nyunga Barat Daya",
2258160,
"aus-pam",
}
m["aus-rnd"] = {
"Arandic",
4784071,
"aus-pam",
}
m["aus-tnk"] = {
"Tangkic",
1823065,
}
m["aus-wdj"] = {
"Iwaidjan",
4196968,
aliases = {"Yiwaidjan"},
}
m["aus-wor"] = {
"Worrorran",
2038619,
}
m["aus-yid"] = {
"Yidinyic",
4205849,
"aus-pam",
}
m["aus-yng"] = {
"Yangmanic",
42727644,
}
m["aus-yol"] = {
"Yolngu",
2511254,
"aus-pam",
aliases = {"Yolŋu", "Yolngu Matha"},
}
m["aus-yuk"] = {
"Yuin-Kuri",
3833021,
"aus-pam",
}
m["awd"] = {
"Arawak",
626753,
aliases = {"Arawakan", "Maipurean", "Maipuran"},
}
m["awd-nwk"] = {
"Nawiki",
nil,
"awd",
aliases = {"Newiki"},
}
m["awd-taa"] = {
"Ta-Arawak",
7672731,
"awd",
aliases = {"Ta-Arawakan", "Ta-Maipurean"},
}
m["azc"] = {
"Uto-Aztek",
34073,
aliases = {"Uto-Aztekan"},
}
m["azc-cup"] = {
"Cupan",
19866871,
"azc-tak",
}
m["azc-dur"] = {
"Nahuatl Durango",
2386361,
"azc-nah",
aliases = {"Mexicanero"}
}
m["azc-hua"] = {
"Nahuatl Huasteca",
3832950,
"azc-nah",
}
m["azc-nah"] = {
"Nahua",
11965602,
"azc",
aliases = {"Aztecan"},
}
m["azc-num"] = {
"Numi",
2657541,
"azc",
}
m["azc-pim"] = {
"Piman",
7194600,
"azc",
aliases = {"Tepiman"},
}
m["azc-tak"] = {
"Takic",
1280305,
"azc",
}
m["azc-trc"] = {
"Taracahitic",
4245032,
"azc",
aliases = {"Taracahitan"},
}
m["bad"] = {
"Banda",
806234,
"nic-ubg",
}
m["bad-cnt"] = {
"Banda Tengah",
3438391,
"bad",
}
m["bai"] = {
"Bamileke",
806005,
"nic-gre",
}
m["bat"] = {
"Baltik",
33136,
"ine-bsl",
}
m["bat-eas"] = {
"Baltik Timur",
149944,
"bat",
}
m["bat-wes"] = {
"Baltik Barat",
149946,
"bat",
}
m["ber"] = {
"Barbar",
25448,
"afa",
aliases = {"Tamazight"},
}
m["bnt"] = {
"Bantu",
33146,
"nic-bds",
}
m["bnt-baf"] = {
"Bafia",
799784,
"bnt",
}
m["bnt-bbo"] = {
"Bafo-Bonkeng",
nil,
"bnt-saw",
}
m["bnt-bdz"] = {
"Boma-Dzing",
1729203,
"bnt",
}
m["bnt-bek"] = {
"Bekwilic",
nil,
"bnt-ndb",
}
m["bnt-bki"] = {
"Bena-Kinga",
16113307,
"bnt-bne",
}
m["bnt-bmo"] = {
"Bangi-Moi",
nil,
"bnt-bnm",
}
m["bnt-bne"] = {
"Bantu Timur Laut",
7057832,
"bnt",
}
m["bnt-bnm"] = {
"Bangi-Ntomba",
806477,
"bnt-bte",
}
m["bnt-boa"] = {
"Boan",
4931250,
"bnt",
aliases = {"Buan", "Ababuan"},
}
m["bnt-bot"] = {
"Botatwe",
4948532,
"bnt",
}
m["bnt-bsa"] = {
"Basaa",
809739,
"bnt",
}
m["bnt-bsh"] = {
"Bushoong",
5001551,
"bnt-bte",
}
m["bnt-bso"] = {
"Bantu Selatan",
980498,
"bnt",
}
m["bnt-bta"] = {
"Bati-Angba",
4869303,
"bnt-boa",
other_names = {"Late Bomokandian"},
aliases = {"Bwa"},
}
m["bnt-btb"] = {
"Beti",
35118,
"bnt",
}
m["bnt-bte"] = {
"Bangi-Tetela",
4855181,
"bnt",
}
m["bnt-bun"] = {
"Buja-Ngombe",
4986733,
"bnt-mbb",
}
m["bnt-chg"] = {
"Chaga",
33016,
"bnt-cht",
}
m["bnt-cht"] = {
"Chaga-Taita",
nil,
"bnt-bne",
}
m["bnt-clu"] = {
"Chokwe-Luchazi",
3339273,
"bnt",
}
m["bnt-com"] = {
"Comoros",
33077,
"bnt-sab",
}
m["bnt-glb"] = {
"Bantu Tasik-Tasik Besar",
5599420,
"bnt-bne",
}
m["bnt-haj"] = {
"Haya-Jita",
25502360,
"bnt-glb",
}
m["bnt-kak"] = {
"Kako",
nil,
"bnt-pob",
}
m["bnt-kav"] = {
"Kavango",
116544179,
"bnt-ksb",
}
m["bnt-kbi"] = {
"Komo-Bira",
6428591,
"bnt-boa",
}
m["bnt-kel"] = {
"Kele",
1738162,
"bnt-kts",
aliases = {"Sheke"},
}
m["bnt-kil"] = {
"Kilombero",
6408121,
"bnt",
}
m["bnt-kka"] = {
"Kikuyu-Kamba",
16114410,
"bnt-bne",
aliases = {"Thagiicu"},
}
m["bnt-kmb"] = {
"Kimbundu",
16947687,
"bnt",
}
m["bnt-kng"] = {
"Kongo",
6429214,
"bnt",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["bnt-kpw"] = {
"Kpwe",
36428,
"bnt-saw",
}
m["bnt-ksb"] = {
"Kavango-Bantu Barat Daya",
6379098,
"bnt",
}
m["bnt-kts"] = {
"Kele-Tsogo",
6385577,
"bnt",
}
m["bnt-lbn"] = {
"Luban",
4536504,
"bnt",
}
m["bnt-leb"] = {
"Lebonya",
6511395,
"bnt",
}
m["bnt-lgb"] = {
"Lega-Binja",
6517694,
"bnt",
}
m["bnt-lok"] = {
"Logooli-Kuria",
nil,
"bnt-glb",
}
m["bnt-lub"] = {
"Luba",
nil,
"bnt-lbn",
}
m["bnt-lun"] = {
"Lunda",
6704091,
"bnt",
}
m["bnt-mak"] = {
"Makua",
6740431,
"bnt-bso",
aliases = {"Makhuwa"},
}
m["bnt-mbb"] = {
"Mboshi-Buja",
6799764,
"bnt",
}
m["bnt-mbe"] = {
"Mbole-Enya",
6799728,
"bnt",
}
m["bnt-mbi"] = {
"Mbinga",
nil,
"bnt-rur",
}
m["bnt-mbo"] = {
"Mboshi",
6799763,
"bnt-mbb",
}
m["bnt-mbt"] = {
"Mbete",
1346910,
"bnt-tmb",
aliases = {"Mbere"},
}
m["bnt-mby"] = {
"Mbeya",
nil,
"bnt-ruk",
}
m["bnt-mij"] = {
"Mijikenda",
6845474,
"bnt-sab",
}
m["bnt-mka"] = {
"Makaa",
nil,
"bnt-ndb",
}
m["bnt-mne"] = {
"Manenguba",
31147471,
"bnt",
aliases = {"Mbo", "Ngoe"},
}
m["bnt-mnj"] = {
"Makaa-Njem",
1603899,
"bnt-pob",
}
m["bnt-mon"] = {
"Mongo",
nil,
"bnt-bnm",
}
m["bnt-mra"] = {
"Mbugwe-Rangi",
6799795,
"bnt",
}
m["bnt-msl"] = {
"Masaba-Luhya",
12636428,
"bnt-glb",
}
m["bnt-mwi"] = {
"Mwika",
nil,
"bnt-ruk",
}
m["bnt-ncb"] = {
"Bantu Pesisir Timur Laut",
7057848,
"bnt-bne",
}
m["bnt-ndb"] = {
"Ndzem-Bomwali",
nil,
"bnt-mnj",
}
m["bnt-ngn"] = {
"Ngondi-Ngiri",
7022532,
"bnt-mbb",
}
m["bnt-ngu"] = {
"Nguni",
961559,
"bnt-bso",
aliases = {"Ngoni"},
}
m["bnt-nya"] = {
"Nyali",
7070832,
"bnt-leb",
}
m["bnt-nyb"] = {
"Nyanga-Buyi",
7070882,
"bnt",
}
m["bnt-nyg"] = {
"Nyoro-Ganda",
12638666,
"bnt-glb",
}
m["bnt-nys"] = {
"Nyasa",
7070921,
"bnt",
}
m["bnt-nze"] = {
"Nzebi",
1755498,
"bnt-tmb",
aliases = {"Njebi"},
}
m["bnt-ova"] = {
"Ovambo",
36489,
"bnt-swb",
aliases = {"Oshivambo", "Oshiwambo", "Owambo"},
}
m["bnt-par"] = {
"Pare",
nil,
"bnt-ncb",
}
m["bnt-pen"] = {
"Pende",
7162373,
"bnt",
}
m["bnt-pob"] = {
"Pomo-Bomwali",
nil,
"bnt",
}
m["bnt-ruk"] = {
"Rukwa",
7378902,
"bnt",
}
m["bnt-run"] = {
"Rungwe",
nil,
"bnt-ruk",
}
m["bnt-rur"] = {
"Rufiji-Ruvuma",
7377947,
"bnt",
}
m["bnt-ruv"] = {
"Ruvu",
nil,
"bnt-ncb",
}
m["bnt-rvm"] = {
"Ruvuma",
nil,
"bnt-rur",
}
m["bnt-sab"] = {
"Sabaki",
2209395,
"bnt-ncb",
}
m["bnt-saw"] = {
"Sawabantu",
532003,
"bnt",
}
m["bnt-sbi"] = {
"Sabi",
7396071,
"bnt",
}
m["bnt-seu"] = {
"Seuta",
nil,
"bnt-ncb",
}
m["bnt-shh"] = {
"Shi-Havu",
nil,
"bnt-glb",
}
m["bnt-sho"] = {
"Shona",
2904660,
"bnt",
}
m["bnt-sir"] = {
"Sira",
1436372,
"bnt",
aliases = {"Shira-Punu"},
}
m["bnt-ske"] = {
"Soko-Kele",
nil,
"bnt-bte",
}
m["bnt-sna"] = {
"Sena",
nil,
"bnt-nys",
}
m["bnt-sts"] = {
"Sotho-Tswana",
2038386,
"bnt-bso",
}
m["bnt-swb"] = {
"Bantu Barat Daya",
116543539,
"bnt-ksb",
}
m["bnt-swh"] = {
"Swahili",
nil,
"bnt-sab",
}
m["bnt-tek"] = {
"Teke",
36528,
"bnt-tmb",
}
m["bnt-tet"] = {
"Tetela",
7706059,
"bnt-bte",
}
m["bnt-tkc"] = {
"Teke Tengah",
36473,
"bnt-tek",
}
m["bnt-tkm"] = {
"Takama",
nil,
"bnt-bne",
}
m["bnt-tmb"] = {
"Teke-Mbede",
7695332,
"bnt",
aliases = {"Teke-Mbere"},
}
m["bnt-tso"] = {
"Tsogo",
2458420,
other_names = {"Okani"}, -- nampaknya merupakan alias dalam Glottolog
"bnt-kts",
}
m["bnt-tsr"] = {
"Tswa-Ronga",
12643962,
"bnt-bso",
}
m["bnt-yak"] = {
"Yaka",
8047027,
"bnt",
}
m["bnt-yko"] = {
"Yasa-Kombe",
nil,
"bnt-saw",
}
m["bnt-zbi"] = {
"Zamba-Binza",
nil,
"bnt-bnm",
}
m["btk"] = {
"Batak",
1998595,
"poz-nws",
}
--[=[
Kod bahasa dan keluarga luar biasa untuk bahasa Peribumi Amerika Tengah
boleh menggunakan awalan "cai-", walaupun "cai" bukan lagi kod keluarga itu sendiri.
]=]--
--[=[
Kod bahasa dan keluarga luar biasa untuk bahasa Kaukasia boleh menggunakan
awalan "cau-", walaupun "cau" bukan lagi kod keluarga itu sendiri.
]=]--
m["cau-abz"] = {
"Abkhaz-Abaza",
4663617,
"cau-nwc",
other_names = {"Abkhaz-Tapanta"},
aliases = {"Abazgi"},
}
m["cau-and"] = {
"Andi",
492152,
"cau-ava",
aliases = {"Andik"},
}
m["cau-ava"] = {
"Avar-Andi",
4055404,
"cau-nec",
aliases = {"Avar-Andian", "Avar-Andi", "Avar-Andik"},
}
m["cau-cir"] = {
"Circassia",
858543,
"cau-nwc",
aliases = {"Cherkess"},
}
m["cau-drg"] = {
"Dargwa",
5222637,
"cau-nec",
other_names = {"Dargin"},
}
m["cau-esm"] = {
"Samur Timur",
nil,
"cau-sam",
}
m["cau-ets"] = {
"Tsez Timur",
121437666,
"cau-tsz",
aliases = {"Tsezik Timur", "Didoik Timur"},
}
m["cau-lzg"] = {
"Lezghi",
2144370,
"cau-nec",
aliases = {"Lezgi", "Lezgian", "Lezgik"},
}
m["cau-nkh"] = {
"Nakh",
24441,
"cau-nec",
aliases = {"Kaukasia Utara-Tengah"},
}
m["cau-nec"] = {
"Kaukasus Timur Laut",
27387,
aliases = {"Dagestani", "Nakho-Dagestani", "Kaspia"},
}
m["cau-nwc"] = {
"Kaukasus Barat Laut",
33852,
aliases = {"Abkhaz-Adyghe", "Abkhazo-Adyghean", "Pontik"},
}
m["cau-sam"] = {
"Samur",
15229151,
"cau-lzg",
}
m["cau-ssm"] = {
"Samur Selatan",
nil,
"cau-sam",
}
m["cau-tsz"] = {
"Tsez",
1651530,
"cau-nec",
aliases = {"Tsezik", "Didoik"},
}
m["cau-vay"] = {
"Vainakh",
4102486,
"cau-nkh",
aliases = {"Veinakh", "Vaynakh"},
}
m["cau-wsm"] = {
"Samur Barat",
nil,
"cau-sam",
}
m["cau-wts"] = {
"Tsez Barat",
121437697,
"cau-tsz",
aliases = {"Tsezik Barat", "Didoik Barat"},
}
m["cba"] = {
"Chibcha",
520478,
"qfa-mch", -- atau tiada jika Makro-Chibchan dianggap tidak terbukti
}
m["ccs"] = {
"Kartvelia",
34030,
aliases = {"Kaukasia Selatan"},
}
m["ccs-gzn"] = {
"Georgia-Zan",
34030,
"ccs",
aliases = {"Karto-Zan"},
}
m["ccs-zan"] = {
"Zan",
2606912,
"ccs-gzn",
aliases = {"Zanuri", "Colchian"},
}
m["cdc"] = {
"Chadik",
33184,
"afa",
}
m["cdc-cbm"] = {
"Chadik Tengah",
2251547,
"cdc",
aliases = {"Biu-Mandara"},
}
m["cdc-est"] = {
"Chad Timur",
2276221,
"cdc",
}
m["cdc-mas"] = {
"Masa",
2136092,
"cdc",
}
m["cdc-wst"] = {
"Chadik Barat",
2447774,
"cdc",
}
m["cdd"] = {
"Caddo",
1025090,
}
m["cel"] = {
"Keltik",
25293,
"ine",
}
m["cel-bry"] = {
"Brythonik",
156877,
"cel-ins",
aliases = {"Brittonic"},
}
m["cel-brs"] = {
"Brythonik Barat Daya",
2612853,
"cel-bry",
aliases = {"Brittonic Barat Daya"},
}
m["cel-brw"] = {
"Brythonik Barat",
593069,
"cel-bry",
aliases = {"Brittonic Barat"},
}
m["cel-gae"] = {
"Goidelik",
56433,
"cel-ins",
aliases = {"Gaelik"},
protoLanguage = "pgl",
}
m["cel-his"] = {
"Hispano-Keltik",
4204136,
"cel",
}
m["cel-ins"] = {
"Keltik Kepulauan",
214506,
"cel",
}
m["chi"] = {
"Chimakuan",
1073088,
}
m["chm"] = {
"Mari",
973685,
"urj",
}
m["cmc"] = {
"Chamik",
2997506,
"poz-mcm",
}
m["crp"] = {
"kreol atau pijin",
19682167,
"qfa-cnt",
}
m["csu"] = {
"Sudanik Tengah",
190822,
"ssa",
}
m["csu-bba"] = {
"Bongo-Bagirmi",
3505042,
"csu",
}
m["csu-bbk"] = {
"Bongo-Baka",
4941917,
"csu-bba",
}
m["csu-bgr"] = {
"Bagirmi",
4841948,
"csu-bba",
aliases = {"Bagirmik"},
}
m["csu-bkr"] = {
"Birri-Kresh",
nil,
"csu",
}
m["csu-ecs"] = {
"Sudanik Tengah Timur",
16911698,
"csu",
aliases = {"Sudanik Timur Tengah", "Sudan Tengah Timur", "Lendu-Mangbetu"},
}
m["csu-kab"] = {
"Kaba",
6343715,
"csu-bba",
}
m["csu-lnd"] = {
"Lendu",
6522357,
"csu-ecs",
aliases = {"Lenduik"},
}
m["csu-maa"] = {
"Mangbetu",
6748874,
"csu-ecs",
aliases = {"Mangbetu-Asoa", "Mangbetu-Asua"},
}
m["csu-mle"] = {
"Mangbutu-Lese",
17009406,
"csu-ecs",
aliases = {"Mangbutu-Efe", "Mangbutu", "Membi-Mangbutu-Efe"},
}
m["csu-mma"] = {
"Moru-Madi",
6915156,
"csu-ecs",
}
m["csu-sar"] = {
"Sara",
2036691,
"csu-bba",
}
m["csu-val"] = {
"Vale",
7909520,
"csu-bba",
}
m["cus"] = {
"Kushitik",
33248,
"afa",
}
m["cus-cen"] = {
"Kushitik Tengah",
56569,
"cus",
}
m["cus-eas"] = {
"Kushitik Timur",
56568,
"cus",
}
m["cus-hec"] = {
"Kushitik Timur Tanah Tinggi",
56524,
"cus-eas",
}
m["cus-som"] = {
"Somaloid",
56774,
"cus-eas",
aliases = {"Sam", "Makro-Somali"},
}
m["cus-sou"] = {
"Kushitik Selatan",
56525,
"cus",
}
m["day"] = {
"Dayak Darat",
2760613,
"poz",
}
m["del"] = {
"Lenape",
2665761,
"alg-eas",
aliases = {"Delaware"},
}
m["den"] = {
"Slavey",
13272,
"ath-nor",
aliases = {"Slave", "Slavé"},
}
m["dmn"] = {
"Mande",
33681,
"nic",
}
m["dmn-bbu"] = {
"Bisa-Busa",
12627956,
"dmn-mde",
}
m["dmn-emn"] = {
"Manding Timur",
nil,
"dmn-man",
}
m["dmn-jje"] = {
"Jogo-Jeri",
nil,
"dmn-mjo",
}
m["dmn-man"] = {
"Manding",
35772,
"dmn-mmo",
}
m["dmn-mda"] = {
"Mano-Dan",
nil,
"dmn-mse",
}
m["dmn-mdc"] = {
"Mande Tengah",
5972907,
"dmn-mdw",
}
m["dmn-mde"] = {
"Mande Timur",
12633080,
"dmn",
}
m["dmn-mdw"] = {
"Mande Barat",
16113831,
"dmn",
}
m["dmn-mjo"] = {
"Manding-Jogo",
12636153,
"dmn-mdc",
}
m["dmn-mmo"] = {
"Manding-Mokole",
nil,
"dmn-mva",
}
m["dmn-mnk"] = {
"Maninka",
36186,
"dmn-emn",
}
m["dmn-mnw"] = {
"Mande Barat Laut",
5972910,
"dmn-mdw",
}
m["dmn-mok"] = {
"Mokole",
16935447,
"dmn-mmo",
}
m["dmn-mse"] = {
"Mande Tenggara",
5972912,
"dmn-mde",
}
m["dmn-msw"] = {
"Mande Barat Daya",
12633904,
"dmn-mdw",
}
m["dmn-mva"] = {
"Manding-Vai",
nil,
"dmn-mjo",
}
m["dmn-nbe"] = {
"Nwa-Beng",
nil,
"dmn-mse",
}
m["dmn-sam"] = {
"Samo",
36327,
"dmn-bbu",
aliases = {"Samuik"},
}
m["dmn-smg"] = {
"Samogo",
7410000,
"dmn-mnw",
aliases = {"Duun-Seenku"},
}
m["dmn-snb"] = {
"Soninke-Bobo",
16111680,
"dmn-mnw",
}
m["dmn-sya"] = {
"Susu-Yalunka",
nil,
"dmn-mdc",
}
m["dmn-vak"] = {
"Vai-Kono",
nil,
"dmn-mva",
}
m["dmn-wmn"] = {
"Manding Barat",
nil,
"dmn-man",
}
m["dra"] = {
"Dravidia",
33311,
}
m["dra-cen"] = {
"Dravidia Tengah",
12628823,
"dra",
}
m["dra-gki"] = {
"Gondi-Kui",
12631610,
"dra-sdt",
}
m["dra-gon"] = {
"Gondi",
55639812,
"dra-gki",
}
m["dra-imd"] = {
"Irula-Muduga",
nil,
"dra-tkn",
}
m["dra-kan"] = {
"Kannadoid",
6363888,
"dra-tkn",
protoLanguage = "dra-okn",
}
m["dra-kki"] = {
"Konda-Kui",
nil,
"dra-gki",
}
m["dra-kml"] = {
"Kurux-Malto",
68002822,
"dra-nor",
}
m["dra-knk"] = {
"Kolami-Naiki",
10547037,
"dra-cen",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["dra-kod"] = {
"Kodagu",
67983106,
"dra-tkd",
}
m["dra-kor"] = {
"Koraga",
33394,
"dra-tlk",
}
m["dra-mal"] = {
"Malayalamoid",
6741581,
"dra-tml",
}
m["dra-mdy"] = {
"Madiya",
27602,
"dra-gon",
}
m["dra-mlo"] = {
"Malto",
nil,
"dra-kml",
}
m["dra-mur"] = {
"Muria",
6938499,
"dra-gon",
}
m["dra-nor"] = {
"Dravidia Utara",
16110967,
"dra",
}
m["dra-pgd"] = {
"Parji-Gadaba",
10620428,
"dra-cen",
}
m["dra-sdo"] = {
"Dravidia Selatan I",
16112843, -- "South Dravidian" Wikipedia ialah Dravida Selatan I dalam skema ini.
"dra-sou",
aliases = {"Dravida Selatan"}, -- Inilah sebabnya I dan II digunakan.
}
m["dra-sdt"] = {
"Dravidia Selatan II",
12633975,
"dra-sou",
aliases = {"Dravida Selatan-Tengah"},
}
m["dra-sou"] = {
"Dravidia Selatan",
128886618,
"dra",
aliases = {"Dravida Selatan"},
}
m["dra-tam"] = {
"Tamiloid",
7681417,
"dra-tml",
protoLanguage = "oty",
}
m["dra-tel"] = {
"Teluguik",
nil,
"dra-sdt",
protoLanguage = "dra-ote",
}
m["dra-tkd"] = {
"Tamil-Kodagu",
25494510,
"dra-tkn",
}
m["dra-tkn"] = {
"Tamil-Kannada",
6478506,
"dra-sdo",
}
m["dra-tkt"] = {
"Toda-Kota",
67983857,
"dra-tkd",
}
m["dra-tlk"] = {
"Tulu-Koraga",
nil,
"dra-sdo",
}
m["dra-tml"] = {
"Tamil-Malayalam",
10690507,
"dra-tkd",
}
m["egx"] = {
"Mesir",
50868,
"afa",
protoLanguage = "egy",
}
m["ero"] = {
"Horpa",
56854,
"sit-wgy",
}
m["esx"] = {
"Eskimo-Aleut",
25946,
}
m["esx-esk"] = {
"Eskimo",
25946,
"esx",
}
m["esx-inu"] = {
"Inuit",
27796,
"esx-esk",
}
m["euq"] = {
"Vaskonik",
4669240,
}
m["gba"] = {
"Gbaya",
3099986,
"alv-sav",
}
m["gba-eas"] = {
"Gbaya Timur",
nil,
"gba",
}
m["gba-sou"] = {
"Gbaya Selatan",
nil,
"gba",
}
m["gba-wes"] = {
"Gbaya Barat",
nil,
"gba",
}
m["gem"] = {
"Jermanik",
21200,
"ine",
}
m["gio"] = {
"Gelao",
56401,
"qfa-kra",
}
m["gme"] = {
"Jermanik Timur",
108662,
"gem",
}
m["gmq"] = {
"Jermanik Utara",
106085,
"gem",
}
m["gmq-eas"] = {
"Skandinavia Timur",
3090263,
"gmq",
protoLanguage = "non-oen",
}
m["gmq-ins"] = {
"Skandinavia Kepulauan",
nil,
"gmq-wes",
}
m["gmq-wes"] = {
"Skandinavia Barat",
1792570,
"gmq",
protoLanguage = "non-own",
}
m["gmw"] = {
"Jermanik Barat",
26721,
"gem",
}
m["gmw-afr"] = {
"Anglo-Frisia",
5329170,
"gmw-nsg",
}
m["gmw-ang"] = {
"Anglia",
1346342,
"gmw-afr",
protoLanguage = "ang",
}
m["gmw-fri"] = {
"Frisia",
25325,
"gmw-afr",
protoLanguage = "ofs",
}
m["gmw-frk"] = {
"Franconia Tanah Rendah",
153050,
"gmw",
protoLanguage = "frk",
}
m["gmw-hgm"] = {
"Jerman Tanah Tinggi",
52040,
"gmw",
protoLanguage = "goh",
}
m["gmw-ian"] = {
"Anglo-Norman Ireland",
120719384,
"gmw-ang",
protoLanguage = "enm",
}
m["gmw-lgm"] = {
"Jerman Tanah Rendah",
25433,
"gmw-nsg",
protoLanguage = "osx",
}
m["gmw-nsg"] = {
"Jermanik Laut Utara",
30134,
"gmw",
aliases = {"Ingvaeonik"},
}
m["gn"] = {
"Guarani",
35876,
"tup-gua",
aliases = {"Guaraní"},
}
m["grb"] = {
"Grebo tepat",
35257,
"kro-grb",
}
m["grk"] = {
"Hellenik",
2042538,
"ine",
aliases = {"Yunani"},
}
m["him"] = {
"Pahari Barat",
10939493,
"inc-pah",
aliases = {"Himachali"},
}
m["hmn"] = {
"Hmongik",
3307894,
"hmx",
}
m["hmx"] = {
"Hmong-Mien",
33322,
aliases = {"Miao-Yao"},
}
m["hmx-mie"] = {
"Mienik",
7992695,
"hmx",
}
m["hok"] = {
"Hokan",
33406,
}
m["hyx"] = {
"Armenia",
8785,
"ine",
}
m["iir"] = {
"Indo-Iran",
33514,
"ine",
}
m["iir-nur"] = {
"Nuristani",
161804,
"iir",
}
m["nur-nor"] = {
"Nuristan Utara",
nil,
"iir-nur",
}
m["nur-sou"] = {
"Nuristan Selatan",
nil,
"iir-nur",
}
m["ijo"] = {
"Ijoid",
1325759,
"nic",
other_names = {"Ijaw"}, -- Ijaw mungkin satu subkeluarga
}
m["inc"] = {
"Indo-Arya",
33577,
"iir",
aliases = {"Indik"},
}
m["inc-bas"] = {
"Benggali–Assam",
4179137,
"inc-eas",
aliases = {"Assam-Bengali", "Gauda-Kamarupa"},
}
m["inc-bhi"] = {
"Bhil",
4901727,
"inc-cen",
}
m["inc-bih"] = {
"Bihar",
135305,
"inc-eas",
}
m["inc-cen"] = {
"Indo-Arya Tengah",
10979187,
"inc",
protoLanguage = "inc-asa",
}
m["inc-chi"] = {
"Chitral",
11732797,
"inc-dar",
}
m["inc-dar"] = {
"Dardik",
161101,
"inc",
protoLanguage = "inc-ash",
}
m["inc-dre"] = {
"Dardik Timur",
nil,
"inc-dar",
}
m["inc-dng"] = {
"Dangari",
nil,
"inc-shn",
}
m["inc-eas"] = {
"Indo-Arya Timur",
12593391,
"inc",
protoLanguage = "inc-aav",
}
m["inc-hal"] = {
"Halbik",
16910593,
"inc-eas",
aliases = {"Halbi"},
}
m["inc-hie"] = {
"Hindi Timur",
4126648,
"inc-cen",
aliases = {"Purabiyā"},
protoLanguage = "inc-oaw",
}
m["inc-hiw"] = {
"Hindi Barat",
12600937,
"inc-cen",
protoLanguage = "inc-ohi",
}
m["inc-hnd"] = {
"Hindustan",
11051,
"inc-hiw",
aliases = {"Hindi-Urdu"},
protoLanguage = "hi-mid",
}
m["inc-ins"] = {
"Indo-Arya Kepulauan",
12179302,
"inc",
protoLanguage = "inc-apa",
}
m["inc-kas"] = {
"Kashmirik",
nil,
"inc-dre",
aliases = {"Kashmiri"},
}
m["inc-koh"] = {
"Kohistani",
13018610,
"inc-dre",
}
m["inc-krd"] = {
"Bahasa-bahasa KRDS",
6356154,
"inc-eas",
aliases = {"Kamta, Rajbanshi, Deshi dan Surjapuri", "Bahasa-bahasa KRNB", "Kamta, Rajbanshi dan Bangla Deshi Utara"},
}
m["inc-kun"] = {
"Kunar",
nil,
"inc-dar",
}
m["inc-mid"] = {
"Indo-Arya Tengah",
3236316,
"inc",
aliases = {"Indik Pertengahan"},
}
m["inc-nwe"] = {
"Indo-Arya Barat Laut",
16111018,
"inc",
protoLanguage = "inc-apa",
}
m["inc-nor"] = {
"Indo-Arya Utara",
946077,
"inc",
protoLanguage = "inc-aka",
}
m["inc-old"] = {
"Indo-Arya Kuno",
118976896,
"inc",
aliases = {"Indik Kuno"},
}
m["inc-pac"] = {
"Pahari Tengah",
nil,
"inc-pah",
}
m["inc-pae"] = {
"Pahari Timur",
nil,
"inc-pah",
}
m["inc-pah"] = {
"Pahari",
946077,
"inc-nor",
aliases = {"Pahadi"},
protoLanguage = "inc-aka",
}
m["inc-pan"] = {
"Punjabik",
2656685,
"inc-nwe",
aliases = {"Punjabik Raya"},
protoLanguage = "inc-opa",
}
m["inc-pas"] = {
"Pashayi",
36670,
"inc-dar",
aliases = {"Pashai"},
}
m["inc-rom"] = {
"Romani",
13201,
"inc-wes",
aliases = {"Romany", "Gipsi"},
}
m["inc-sad"] = {
"Sadanik",
109546827,
"inc-bih",
aliases = {"Sadani"},
}
m["inc-shn"] = {
"Shinaic",
12646125,
"inc-dre",
}
m["inc-snd"] = {
"Sindhik",
7522212,
"inc-nwe",
protoLanguage = "inc-avr",
}
m["inc-sou"] = {
"Indo-Arya Selatan",
10856062,
"inc",
protoLanguage = "inc-ama",
}
m["inc-tha"] = {
"Tharu",
34035,
"inc-eas",
}
m["inc-wes"] = {
"Indo-Arya Barat",
nil,
"inc",
protoLanguage = "inc-agu",
}
m["ine"] = {
"Indo-Eropah",
19860,
aliases = {"Indo-Jermanik"},
}
m["ine-ana"] = {
"Anatolia",
147085,
"ine",
}
m["ine-bsl"] = {
"Balto-Slavik",
147356,
"ine",
}
m["ine-luw"] = {
"Luwik",
115748615,
"ine-ana",
aliases = {"Luvik"},
}
m["ine-toc"] = {
"Tokharia",
37029,
"ine",
aliases = {"Tokharian"},
}
m["ira"] = {
"Iran",
33527,
"iir",
}
m["ira-csp"] = {
"Caspia",
5049123,
"ira-mpr",
}
m["ira-cen"] = {
"Iran Pusat",
nil,
"ira",
}
m["ira-kms"] = {
"Komisenia",
nil,
"ira-mpr",
aliases = {"Semnani"},
}
m["ira-lur"] = {
"Lurik",
nil, -- ?
"ira-swi",
}
m["ira-mid"] = {
"Iran Tengah",
6841465,
"ira",
}
m["ira-mny"] = {
"Munji-Yidgha",
nil,
"ira-sym",
aliases = {"Yidgha-Munji"},
}
m["ira-msh"] = {
"Mazanderani-Shahmirzadi",
nil,
"ira-csp",
}
m["ira-nei"] = {
"Iran Timur Laut",
10775567,
"ira",
}
m["ira-nwi"] = {
"Iran Barat Laut",
390576,
"ira-wes",
}
m["ira-old"] = {
"Iran Kuno",
23301845,
"ira",
}
m["ira-orp"] = {
"Ormuri-Parachi",
nil,
"ira-sei",
}
m["ira-pat"] = {
"Pathan",
nil,
"ira-sei",
}
m["ira-sbc"] = {
"Sogdo-Bactria",
nil,
"ira-nei",
}
m["ira-mpr"] = {
"Medo-Parthia",
nil,
"ira-nwi",
aliases = {"Partho-Media"},
}
m["ira-sgi"] = {
"Sanglechi-Ishkashimi",
18711232,
"ira-sei",
}
m["ira-shr"] = {
"Shughni-Roshani",
11732824,
"ira-shy",
}
m["ira-shy"] = {
"Shughni-Yazghulami",
nil,
"ira-sym",
}
m["ira-sgc"] = {
"Sogdik",
nil,
"ira-sbc",
aliases = {"Sogdian"},
}
m["ira-sei"] = {
"Iran Tenggara",
3833002,
"ira",
}
m["ira-swi"] = {
"Iran Barat Daya",
390424,
"ira-wes",
}
m["ira-sym"] = {
"Shughni-Yazghulami-Munji",
nil,
"ira-sei",
}
m["ira-wes"] = {
"Iran Barat",
129850,
"ira",
}
m["ira-zgr"] = {
"Zaza-Gorani",
167854,
"ira-mpr",
aliases = {"Zaza-Gurani", "Gorani-Zaza"},
}
m["iro"] = {
"Iroquois",
33623,
}
m["iro-nor"] = {
"Iroquois Utara",
nil,
"iro",
}
m["itc"] = {
"Italik",
131848,
"ine",
}
m["itc-laf"] = {
"Latino-Falisci",
33478,
"itc",
aliases = {"Latinian"},
}
m["itc-sbl"] = {
"Osco-Umbria",
515194,
"itc",
aliases = {"Sabelik", "Sabelian"},
}
m["jpx"] = {
"Jepunik",
33612,
aliases = {"Jepun", "Jepun-Ryukyu"},
}
m["jpx-nry"] = {
"Ryukyu Utara",
20862796,
"jpx-ryu",
}
m["jpx-ryu"] = {
"Ryukyu",
56393,
"jpx",
}
m["jpx-sry"] = {
"Ryukyu Selatan",
18392243,
"jpx-ryu",
}
m["kar"] = {
"Karen",
1364815,
"sit",
}
m["kca"] = {
"Khanty",
33563,
"urj-ugr",
aliases = {"Khantyik", "Khantik"},
}
--[=[
Kod bahasa dan keluarga luar biasa bagi bahasa Khoisan dan Kordofania boleh menggunakan
awalan "khi-" dan "kdo-" masing-masing, walaupun ia bukan lagi kod keluarga itu sendiri.
]=]--
m["khi-kal"] = {
"Khoe Kalahari",
nil,
"khi-kho",
}
m["khi-khk"] = {
"Khoekhoe",
nil,
"khi-kho",
}
m["khi-kkw"] = {
"Khoe-Kwadi",
60785084,
aliases = {"Kwadi-Khoe"},
}
m["khi-kho"] = {
"Khoe",
2736449,
"khi-kkw",
aliases = {"Khoisan Tengah"},
}
m["khi-kxa"] = {
"Kx'a",
6450587,
aliases = {"Kxa", "Ju-ǂHoan"},
}
m["khi-tuu"] = {
"Tuu",
631046,
aliases = {"Kwi", "Taa-Kwi", "Khoisan Selatan", "Taa-ǃKwi", "Taa-ǃUi", "ǃUi-Taa"},
}
m["kro"] = {
"Kru",
33535,
"nic-vco",
}
m["kro-aiz"] = {
"Aizi",
4699431,
"kro",
}
m["kro-bet"] = {
"Bété",
32956,
"kro-ekr",
}
m["kro-did"] = {
"Dida",
32685,
"kro-ekr",
}
m["kro-ekr"] = {
"Kru Timur",
5972899,
"kro",
}
m["kro-grb"] = {
"Grebo",
5601537,
"kro-wkr",
}
m["kro-wee"] = {
"Wee",
nil,
"kro-wkr",
}
m["kro-wkr"] = {
"Kru Barat",
5972897,
"kro",
}
m["ku"] = {
"Kurdi",
36368,
"ira-nwi",
}
m["kv"] = {
"Komi",
36126, -- "Bahasa Komi" di Wikipedia tetapi merujuk khusus kepada Komi-Zyrian; tiada item Wikidata untuk keluarga Komi
"urj-prm",
}
m["map"] = {
"Austronesia",
49228,
}
m["map-ata"] = {
"Atayalik",
716610,
"map",
}
m["mjg"] = {
"Monguor",
34214,
"xgn-shr",
}
m["mkh"] = {
"Mon-Khmer",
33199,
"aav",
}
m["mkh-asl"] = {
"Asli",
3111082,
"mkh",
}
m["mkh-ban"] = {
"Bahnarik",
56309,
"mkh",
}
m["mkh-kat"] = {
"Katuik",
56697,
"mkh",
}
m["mkh-khm"] = {
"Khmuik",
1323245,
"mkh",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["mkh-kmr"] = {
"Khmerik",
nil,
"mkh",
}
m["mkh-mnc"] = {
"Monik",
3217497,
"mkh",
}
m["mkh-mng"] = {
"Mangik",
3509556,
"mkh",
}
m["mkh-nbn"] = {
"Bahnarik Utara",
56309,
"mkh-ban",
}
m["mkh-pal"] = {
"Palaungik",
2391173,
"mkh",
}
m["mkh-pea"] = {
"Pearik",
3073022,
"mkh",
}
m["mkh-pkn"] = {
"Pakanik",
nil,
"mkh-mng",
}
m["mkh-vie"] = {
"Vietik",
2355546,
"mkh",
}
m["mno"] = {
"Manobo",
3217483,
"phi",
}
m["mns"] = {
"Mansi",
33759,
"urj-ugr",
aliases = {"Mansik"},
}
m["mun"] = {
"Munda",
33892,
"aav",
}
m["myn"] = {
"Maya",
33738,
}
--[=[
Kod bahasa dan keluarga luar biasa bagi bahasa-bahasa Peribumi Amerika Utara
boleh menggunakan awalan "nai-", walaupun "nai" bukan lagi kod keluarga itu sendiri.
]=]--
m["nai-cat"] = {
"Catawba",
3446638,
"nai-sca",
}
m["nai-chu"] = {
"Chumashan",
1288420,
}
m["nai-ckn"] = {
"Chinook",
610586,
}
m["nai-coo"] = {
"Coosan",
940278,
}
m["nai-jcq"] = {
"Jicaquean",
12179308,
"hok",
}
m["nai-ker"] = {
"Keresan",
35878,
}
m["nai-klp"] = {
"Kalapuyan",
1569040,
}
m["nai-kta"] = {
"Kiowa-Tanoan",
386288,
}
m["nai-len"] = {
"Lenca",
36189,
aliases = {"Lenca"},
}
m["nai-mdu"] = {
"Maiduan",
33502,
}
m["nai-miz"] = {
"Mixe-Zoque",
954016,
aliases = {"Mixe-Zoque"},
}
m["nai-min"] = {
"Misumalpa",
281693,
"qfa-mch",
aliases = {"Misuluan", "Misumalpa"},
}
m["nai-mus"] = {
"Muscogee",
902978,
aliases = {"Muskhogean"},
}
m["nai-pak"] = {
"Pakawan",
65085487,
"hok",
}
m["nai-pal"] = {
"Palaihnihan",
1288332,
}
m["nai-plp"] = {
"Pen-Uti Penara",
2307476,
}
m["nai-pom"] = {
"Pomo",
2618420,
"hok",
aliases = {"Pomo", "Kulanapan"},
}
m["nai-sca"] = {
"Sioux-Catawba",
34181,
}
m["nai-shp"] = {
"Sahaptian",
114782,
"nai-plp",
}
m["nai-shs"] = {
"Shastan",
2991735,
"hok",
}
m["nai-tot"] = {
"Totozoquean",
7828419,
}
m["nai-ttn"] = {
"Totonacan",
34039,
aliases = {"Totonak-Tepehua", "Totonakan-Tepehuan"},
varieties = {"Totonak"},
}
m["nai-tqn"] = {
"Tequistlatecan",
1568317,
"hok",
aliases = {"Tequistlatec", "Chontal", "Chontalan", "Chontal Oaxaca", "Chontal dari Oaxaca"},
}
m["nai-tsi"] = {
"Tsimshian",
34134,
}
m["nai-utn"] = {
"Uti",
13371763,
"nai-you",
aliases = {"Miwok-Costanoan", "Mutsun"},
}
m["nai-wtq"] = {
"Wintuan",
1294259,
aliases = {"Wintun"},
}
m["nai-xin"] = {
"Xinca",
1546494,
aliases = {"Xinca"},
}
m["nai-ykn"] = {
"Yuki",
2406722,
aliases = {"Yuki-Wappo"},
}
m["nai-you"] = {
"Yok-Uti",
2886186,
}
m["nai-yuc"] = {
"Yuman-Cochimí",
579137,
}
m["ngf"] = {
"Trans-New Guinea",
34018,
}
m["ngf-ais"] = {
"Aisian",
nil,
"ngf-eso",
}
m["ngf-ang"] = {
"Angan",
3217366,
"ngf",
aliases = {"Banjaran Kratke"}, -- Usher
}
m["ngf-ank"] = {
"Angal-Kewa",
12626916, -- wujud dalam dewiki dan hrwiki
"ngf-sak",
}
m["ngf-ask"] = {
"Asmat-Kamoro",
3031400,
"ngf",
-- Wikipedia menggunakan Asmat-Kamoro untuk merujuk kepada kelompok yang lebih sempit tanpa bahasa-bahasa Sabakor (Buruwai dan Kamberau,
-- yang dipecahkan oleh Glottolog kepada Kamrau Utara dan Kamrau Selatan [sic]), dan menggunakan Asmat-Kamrau untuk merujuk kepada apa yang kita
-- dan Glottolog panggil Asmat-Kamoro. Glottolog tidak mengiktiraf pengelompokan yang lebih sempit ini.
aliases = {"Asmat-Kamrau", -- Wikipedia
"Teluk Asmat-Kamrau", -- Usher
},
}
m["ngf-asm"] = {
"Asmat",
4807421,
"ngf-ask",
}
m["ngf-ata"] = {
"Ankave-Tainae-Akoye",
nil,
"ngf-ang",
aliases = {"Banjaran Kratke Barat Daya"}, -- Usher
}
m["ngf-awd"] = {
"Awyu-Dumut", -- [[w:Awyu-Dumut languages]] dilencongkan ke [[w:Greater Awyu languages]]
4830163, -- wujud dalam eswiki, hrwiki dan ruwiki
"ngf-gaw",
aliases = {"Sungai Digul Tengah"}, -- Usher
}
m["ngf-awy"] = {
"Awyu",
96372866,
"ngf-awd",
}
m["ngf-bda"] = {
"Becking-Dawi",
nil, -- Q55993716 ([[Category:Becking–Dawi languages]]) wujud dalam enwiki
"ngf-gaw",
aliases = {"Sungai Becking dan Dawi"}, -- Usher
}
m["ngf-bin"] = {
"Binanderean",
3217374, -- Wikidata tidak membezakan Binanderean daripada Binanderean Raya
"ngf-gbi",
aliases = {"Oro"}, -- Usher (2020)
}
m["ngf-boa"] = {
"Boane",
nil,
"ngf-era",
aliases = {"Boana", -- nama Glottolog
"Wain"}, -- tiada dalam Usher; "Wain" sering mengecualikan Mungkip, mungkin kerana kurang didokumentasikan
}
m["ngf-bos"] = {
"Bosavi",
4947122,
"ngf",
aliases = {"Penara Papua"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["ngf-bsi"] = {
"Baruya-Simbari",
nil,
"ngf-ang",
aliases = {"Banjaran Kratke Barat Laut"}, -- Usher
}
m["ngf-cda"] = {
"Dani Tengah",
nil,
"ngf-dan",
aliases = {"Dani"}, -- Usher
}
m["ngf-chw"] = {
"Chimbu-Wahgi",
3217383,
"ngf",
aliases = {"Simbu-Tanah Tinggi Barat"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["ngf-dag"] = {
"Dagan",
5208454,
"ngf", -- tidak diterima sebagai TNG oleh Glottolog tetapi diterima oleh sumber-sumber lain
aliases = {"Banjaran Meneao"},
}
m["ngf-dal"] = {
"Dallman",
nil,
"ngf-huo",
aliases = {"Kinalakna-Kumukio", -- Pawley-Hammarström, yang mengecualikan Nomu, namun mereka hanya mempunyai senarai angka bahasa tersebut untuk dirujuk
"Huon Timur Laut"}, -- Usher
}
m["ngf-dan"] = {
"Dani",
3217389,
"ngf",
-- Wikipedia menamakan semula bahasa-bahasa Dani kepada bahasa-bahasa Lembah Baliem dan kadangkala (tetapi tidak konsisten)
-- mengekalkan nama Dani (atau "Dani tepat") untuk kelompok yang lebih sempit mengecualikan Wano dan bahasa-bahasa Ngalik
-- yang kurang didokumentasikan (Nduga, Silimo, dan gugusan dialek Yali, yang mana kita, menurut Ethnologue dan Glottolog, bahagikan kepada
-- Yali Anggurk, Yali Ninia dan Yali Lembah Pass). Glottolog tidak mengiktiraf pengelompokan yang lebih sempit ini.
aliases = {"Lembah Baliem", -- Wikipedia
"Lembah Balim"}, -- Usher
}
m["ngf-dum"] = {
"Dumut", -- [[w:Dumut languages]] dilencongkan ke [[w:Greater Awyu languages]]
nil,
"ngf-awd",
aliases = {"Wambon"}, -- Usher
}
m["ngf-ehu"] = {
"Huon Timur", -- Glottolog menambah Ono dan Sialum, Pawley-Hammarström menambah Dedua
10567087,
"ngf-huo",
aliases = {"Huon Timur"}, -- Usher
}
m["ngf-eku"] = {
"Kutubuan Timur",
5328752,
"ngf", -- Tidak dalam TNG mengikut Glottolog tetapi diterima oleh yang lain. Kadangkala dikelompokkan bersama Fasu membentuk keluarga Kutubuan.
aliases = {"Kutubu Timur"}, -- nama Glottolog
}
m["ngf-enc"] = {
"Engik",
nil,
"ngf-eng",
aliases = {"Engan", -- Glottolog
"Engan tepat", -- Wikipedia
"Engan Utara", -- nama alternatif yang diberikan oleh Wikipedia
"Trans-Enga"}, -- Usher
}
m["ngf-eng"] = {
"Engan",
3217449,
"ngf",
aliases = {"Enga-Kewa-Huli", -- Glottolog, Pawley-Hammarström
"Enga-Tanah Tinggi Selatan"}, -- Usher
}
m["ngf-era"] = {
"Erap",
nil,
"ngf-fin",
aliases = {"Sungai Erap"}, -- Usher?
}
m["ngf-eso"] = {
"Sogeram Timur",
nil,
"ngf-sog",
}
m["ngf-est"] = {
"Strickland Timur",
5329440,
"ngf",
aliases = {"Sungai Strickland"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["ngf-eva"] = {
"Evapia",
nil,
"ngf-rai",
aliases = {"Sungai Evapia"}, -- Usher
}
m["ngf-fgi"] = {
"Fore-Gimi",
nil,
"ngf-gor",
aliases = {"Goroka Selatan"}, -- Usher
}
m["ngf-fhu"] = {
"Finisterre-Huon",
3217453,
"ngf",
aliases = {"Banjaran Finisterre-Semenanjung Huon"}, -- per Usher
}
m["ngf-fin"] = {
"Finisterre",
5450373,
"ngf-fhu",
aliases = {"Finisterre-Saruwaged", -- nama Glottolog
"Banjaran Finisterre"}, -- per Usher
}
m["ngf-gah"] = {
"Gahuku",
nil,
"ngf-gor",
aliases = {"Sungai Alekano-Asaro"}, -- Usher
}
m["ngf-gau"] = {
"Gauwa",
nil,
"ngf-kai",
aliases = {"Kainantu Barat"}, -- Usher
}
m["ngf-gaw"] = {
"Awyu Raya",
12627424,
"ngf",
aliases = {"Sungai Digul"}, -- digunakan oleh Usher (2020)
}
m["ngf-gbi"] = {
"Binanderean Raya",
3217374, -- Wikidata tidak membezakan Binanderean daripada Binanderean Raya
"ngf", -- tidak diletakkan dalam Trans-New Guinea dalam Usher (2020)
aliases = {"Guhu-Oro"}, -- Guhu-Oro digunakan dalam Usher (2020)
}
m["ngf-gko"] = {
"Gaena-Korafe",
11732347, -- dianggap sebagai bahasa Korafe tunggal oleh Wikipedia
"ngf-bin",
aliases = {"Gaina-Korafe"}, -- Usher
}
m["ngf-gmo"] = {
"Gusap-Mot",
16110857,
"ngf-fin",
aliases = {"Sungai Mot"}, -- Usher?
}
m["ngf-gor"] = {
"Goroka",
15478597,
"ngf-kgo",
}
m["ngf-gsu"] = {
"Gogodala-Suki",
5577428,
"ngf", -- Kemungkinan dalam keluarga Teluk Papua yang dicadangkan. Bukan dalam TNG per Glottolog tetapi diterima oleh semua yang lain.
aliases = {"Suki-Gogodala", -- nama Glottolog
"Sungai Suki-Aramia"}, -- digunakan dalam Usher (2020)
}
m["ngf-gum"] = {
"Gum",
5618008,
"ngf-mab",
}
m["ngf-gvd"] = {
"Dani Lembah Besar", -- dianggap sebagai bahasa tunggal oleh Wikipedia
5595219,
"ngf-cda",
}
m["ngf-hag"] = {
"Hagen", -- [[w:Hagen languages]] dilencongkan ke [[w:Chimbu–Wahgi languages]]
nil,
"ngf-chw",
aliases = {"Sungai Melpa-Kaugel"}, -- Usher
}
m["ngf-han"] = {
"Hanseman",
5651020,
"ngf-mab",
aliases = {"Banjaran Hansemann"}, -- Usher
}
m["ngf-huo"] = {
"Huon",
5946109,
"ngf-fhu",
aliases = {"Semenanjung Huon"}, -- per Usher
}
m["ngf-jim"] = {
"Jimi", -- [[w:Jimi languages]] dan [[w:Jimi River languages]] dilencongkan ke [[w:Chimbu–Wahgi languages]]
nil,
"ngf-chw",
aliases = {"Sungai Jimi"}, -- Usher
}
m["ngf-kab"] = {
"Kabwum",
nil,
"ngf-huo",
aliases = {"Timbe-Selepet-Komba", -- Pawley-Hammarström
"Huon Barat Laut"}, -- Usher
}
m["ngf-kai"] = {
"Kainantu", -- Kambaira: di bawah "Kainantu tidak terkelas" (Glottolog), Tairora (Pawley-Hammarström), Gauwa (Usher)
15478590,
"ngf-kgo",
aliases = {"Gadsup-Auyana-Awa-Tairora"}, -- Wurm
}
m["ngf-kak"] = {
"Kalam-Kobon",
6350303,
"ngf-ksa",
aliases = {"Kalam",
"Sungai Kaironk"}, -- Usher (2020)
}
m["ngf-kau"] = {
"Kaukombar",
nil,
"ngf-nad",
aliases = {"Kaukombaran", -- Glottolog mengikut Z'graggen (1975)
"Sungai Kaukombar"}, -- istilah Usher
}
m["ngf-kbm"] = {
"Kosorong-Burum-Mindik",
nil,
"ngf-huo",
aliases = {"Sungai Bulum"}, -- Usher
}
m["ngf-kgo"] = {
"Kainantu-Goroka",
3217463,
"ngf",
aliases = {"Tanah Tinggi Timur"}, -- per Usher (2020)
}
m["ngf-khu"] = {
"Kewa-Huli",
nil,
"ngf-eng",
aliases = {"Huli-Tanah Tinggi Selatan"}, -- Usher
}
m["ngf-kma"] = {
"Kâte-Mape",
nil,
"ngf-ehu",
aliases = {"Kate-Mape-Sene", -- Pawley-Hammarström (dengan Sene)
"Huon Tenggara"}, -- Usher
}
m["ngf-kme"] = {
"Kapau-Menya",
nil,
"ngf-ang",
aliases = {"Banjaran Kratke Tenggara"}, -- Usher
}
m["ngf-koi"] = {
"Koiarian",
11154240,
"ngf", -- tidak diterima sebagai TNG oleh Glottolog tetapi diterima oleh yang lain
aliases = {"Penara Koiari-Managalas"},
}
m["ngf-kok"] = {
"Kokon", -- Usher memanggilnya Mabuso Selatan tetapi memasukkan Gum ke dalamnya
nil,
"ngf-mab",
}
m["ngf-kow"] = {
"Kowan",
6435004,
"ngf-mad",
aliases = {"Selat Isumrud"}, -- per Usher (2020)
}
m["ngf-ksa"] = {
"Kalam-Adelbert Selatan",
nil,
"ngf-mad",
aliases = {"Kalamik-Adelbert Selatan", -- Glottolog
"Madang Barat"}, -- Usher (2020)
}
m["ngf-kto"] = {
"Kube-Tobo", -- mengikut Glottolog, satu bahasa "Kulungtfu-Yuanggeng-Tobo"
1173235, -- kod bagi bahasa Tobo-Kube
"ngf-huo",
aliases = {"Tobo-Kube"},
}
m["ngf-kts"] = {
"Komyandaret-Tsaukambo",
nil,
"ngf-bda",
aliases = {"Sungai Becking"}, -- Usher
}
m["ngf-kum"] = {
"Kumil",
nil,
"ngf-nad",
aliases = {"Kumilan", -- Pawley-Hammarström mengikut Z'graggen (1975)
"Sungai Kumil"}, -- istilah Usher
}
m["ngf-kya"] = {
"Kamano-Yagaria",
nil,
"ngf-gor",
aliases = {"Henganofi", -- Usher
"Kamano-Yagaria-Keigana",
},
}
m["ngf-lok"] = {
"Ok Tanah Rendah",
nil,
"ngf-okk",
}
m["ngf-mab"] = {
"Mabuso",
6721668,
"ngf-mad",
}
m["ngf-mad"] = {
"Madang",
11217556,
"ngf",
aliases = {"Banjaran Madang-Adelbert"}, -- Z'graggen (1975), sepadan dengan Madang kini kecuali tiadanya Kalam dan Gants
}
m["ngf-mek"] = {
"Mek",
6810515,
"ngf",
aliases = {"Goliath"}, -- nama alternatif lapuk yang diberikan oleh Wikipedia
}
m["ngf-min"] = {
"Mindjim",
86749913,
"ngf-mad",
aliases = {"Minjim Bawah", -- Glottolog, diletakkan dalam Pesisir Rai oleh Glottolog dan Pawley-Hammarström; Mindjim
-- Glottolog mengandungi 6 bahasa, termasuk "Minjim Atas" (Rerau dan Sgi Bara)
"Sungai Mindjim", -- Usher
"Minjim", "Sungai Minjim",
},
}
-- Tambah jika Molet diasingkan daripada Asaro'o
-- m["ngf-moa"] = {
-- "Molet-Asaro'o",
-- nil,
-- "ngf-war",
-- }
m["ngf-mok"] = {
"Ok Pergunungan", -- [[w:Mountain Ok languages]] dilencongkan ke [[w:Ok languages]]
nil,
"ngf-okk",
}
m["ngf-mom"] = {
"Mombum",
6897077,
"ngf", -- tidak diterima sebagai TNG oleh Glottolog tetapi diterima oleh yang lain
aliases = {"Mombum-Koneraw", "Komolom", "Selat Muli"}, -- Pawley-Hammarström menggunakan Komolom, Usher menggunakan Selat Muli
}
m["ngf-msu"] = {
"Mian-Suganga", -- dianggap sebagai satu bahasa Mian oleh Wikipedia
12952846,
"ngf-mok",
aliases = {"Mianik"}, -- Glottolog
}
m["ngf-nad"] = {
"Adelbert Utara", -- tidak diterima oleh Pawley-Hammarström
16952821, -- kod untuk perangkaian Croisilles
"ngf-mad",
aliases = {"Banjaran Adelbert-Selat Isumrud", -- Usher (2020)
"Adelbert Utara",
"Pihom-Isumrud"}, -- Ross?
}
m["ngf-nbi"] = {
"Binanderean Utara",
nil,
"ngf-bin",
aliases = {"Suena-Zia"}, -- Usher
}
m["ngf-nde"] = {
"Ndeiram", -- [[w:Ndeiram River languages]] dilencongkan ke [[w:Greater Awyu languages]]
nil,
"ngf-awd",
aliases = {"Sungai Ndeiram"}, -- Usher?
}
m["ngf-ngn"] = {
"Ngalik-Nduga", -- [[w:Ngalik languages]] dilencongkan ke [[w:Baliem Valley languages]] = bahasa-bahasa Dani
nil,
"ngf-dan",
aliases = {"Ngalik"}, -- Usher
}
m["ngf-nso"] = {
"Sogeram Utara",
nil,
"ngf-sog",
aliases = {"Mum-Sirva", -- Usher
"Sogeram Tengah Utara", -- digunakan oleh mereka yang menerima Sogeram Tengah (= Sogeram Utara + Apali dan Manat)
"Sogeram Tengah-Utara", -- lebih jarang berbanding tanpa tanda sengkang
"Sikan"}, -- Z’graggen (1975?)
}
m["ngf-num"] = {
"Numugen",
nil,
"ngf-nad",
aliases = {"Numugenan", -- Glottolog mengikut Z'graggen 1975
"Sungai Numugen"}, -- istilah Usher
}
m["ngf-nur"] = {
"Nuru", -- Usher mengecualikan Yangulam, Pawley-Hammarström memasukkan Jilim dan Rerau
nil,
"ngf-rai",
aliases = {"Sungai Nuru"}, -- Usher?
}
m["ngf-nwh"] = {
"Hanseman Barat Laut", -- Usher
nil,
"ngf-han",
aliases = {"Wamas-Samosa-Murupi-Mosimo"}, -- Glottolog, Greenhill, dan Pawley-Hammarström mengikut Z'graggen; nama paling umum, tetapi sangat panjang
}
m["ngf-oen"] = {
"Engan Luar", -- dianggap sebagai bahasa Nete tunggal oleh Wikipedia
6998869,
"ngf-enc",
aliases = {"Nete-Bisorio"}, -- Usher
}
m["ngf-okk"] = {
"Ok",
7081687,
"ngf",
}
m["ngf-omo"] = {
"Omosan", -- tidak dimasukkan dalam (Raya) Adelbert Utara oleh Glottolog, tetapi saudara
nil,
"ngf-nad",
}
m["ngf-oro"] = {
"Orokaivik",
7103752, -- dianggap sebagai bahasa Orokaiva tunggal oleh Wikipedia
"ngf-bin",
aliases = {"Oro Tengah"}, -- Usher
}
m["ngf-pan"] = {
"Tasik Paniai",
6035631,
"ngf",
aliases = {"Tasik Wissel", "Tasik Wissel-Sungai Kemandoga"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["ngf-pek"] = {
"Peka",
nil,
"ngf-rai",
aliases = {"Sungai Peka"}, -- Usher?
}
m["ngf-pom"] = {
"Pomoikan",
nil,
"ngf-sad",
}
m["ngf-rai"] = {
"Pesisir Rai",
7283663,
"ngf-mad",
aliases = {"Madang Selatan"}, -- Usher
}
m["ngf-sab"] = {
"Sabakor", -- [[w:Sabakor languages]] dilencongkan ke [[w:Asmat–Kamrau languages]]
nil, -- 55994614 adalah untuk [[Category:Kamrau Bay languages]], yang wujud dalam enwiki
"ngf-ask",
aliases = {"Teluk Kamrau"}, -- Usher
}
m["ngf-sad"] = {
"Adelbert Selatan",
12633980,
"ngf-ksa",
aliases = {"Adelbert Selatan", -- Glottolog
"Banjaran Adelbert Selatan", -- Z'graggen (1980)
"Sungai Sogeram dan Tomul"}, -- Usher (2020)?
}
m["ngf-sak"] = {
"Sau-Angal-Kewa",
nil,
"ngf-khu",
aliases = {"Tanah Tinggi Selatan"}, -- Usher
}
m["ngf-san"] = {
"Sankwep",
nil,
"ngf-huo",
aliases = {"Nabak-Momolili", -- Pawley-Hammarström
"Huon Barat Daya"}, -- Usher
}
m["ngf-sbh"] = {
"South Bird's Head",
7566330,
"ngf",
}
m["ngf-sim"] = {
"Simbu",
nil,
"ngf-chw",
}
m["ngf-sog"] = {
"Sogeram",
86750419,
"ngf-sad",
aliases = {"Sungai Sogeram", -- Usher
"Wanang"},
}
m["ngf-sop"] = {
"Sopac",
nil,
"ngf-ehu",
aliases = {"Momare-Migabac", -- Pawley-Hammarström
"Sungai Masaweng"}, -- Usher
}
m["ngf-taa"] = {
"Tainae-Akoye",
nil,
"ngf-ata",
aliases = {"Akoye-Tainae"}, -- Usher
}
m["ngf-tai"] = {
"Tairora",
nil,
"ngf-kai",
aliases = {"Tairorik", -- Glottolog
"Kainantu Timur"}, -- Usher
}
m["ngf-tib"] = {
"Tiboran",
nil,
"ngf-nad",
aliases = {"Tibor Nuklear", -- Glottolog, mengecualikan Wanambre/Mokati
"Sungai Tiboran", -- Usher (2020)
"Tibor"}, -- Pick (2020) dan Glottolog memasukkan Wanambre/Mokati
}
m["ngf-tna"] = {
"Tangko-Nakai",
nil,
"ngf-okk",
aliases = {"Ok Tengah"}, -- Usher
}
m["ngf-uru"] = {
"Uruwa",
nil,
"ngf-fin",
aliases = {"Sungai Uruwa"}, -- Usher?
}
m["ngf-usi"] = {
"Utu-Silopi",
nil,
"ngf-han",
aliases = {"Silopi-Utu"}, -- Usher
}
m["ngf-waa"] = {
"Wantoat-Awara", -- tiada dalam Usher tetapi Wantoat dan Awara membentuk rantaian dialek
nil,
"ngf-wan",
aliases = {"Awara-Wantoat"}, -- per Wikipedia
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["ngf-wah"] = {
"Wahgi", -- [[w:Wahgi languages]] dilencongkan ke [[w:Chimbu–Wahgi languages]]
nil,
"ngf-chw",
aliases = {"Lembah Wahgi"}, -- Usher
}
m["ngf-wan"] = {
"Wantoatik",
nil,
"ngf-fin",
aliases = {"Wantoat",
"Sungai Wantoat", -- Usher?
},
}
m["ngf-war"] = {
"Warup",
12645082,
"ngf-fin",
aliases = {"Sungai Warup"}, -- Usher?
}
m["ngf-woj"] = {
"Wojokesik",
nil,
"ngf-ang",
aliases = {"Banjaran Kratke Timur Laut"}, -- Usher
}
m["ngf-wok"] = {
"Ok Barat",
nil,
"ngf-okk",
aliases = {"Kwer-Kopkaka-Burumakok"}, -- Glottolog, Pawley-Hammarström
}
m["ngf-wso"] = {
"Sogeram Barat",
nil,
"ngf-sog",
aliases = {"Mand-Nend", -- Usher
"Atan", -- Wurm mengikut Z'graggen
},
}
m["ngf-yag"] = {
"Yaganon", -- diletakkan dalam Pesisir Rai oleh Glottolog dan Pawley-Hammarström
35323986,
"ngf-mad",
aliases = {"Sungai Yaganon"}, -- Usher
}
m["ngf-yal"] = {
"Yali", -- dianggap sebagai bahasa tunggal oleh Wikipedia
8047468,
"ngf-ngn",
aliases = {"Ngalik"}, -- Glottolog, Pawley-Hammarström
}
m["ngf-yar"] = {
"Yareban",
16977672,
"ngf", -- tidak diterima sebagai TNG oleh Glottolog tetapi diterima oleh semua yang lain
aliases = {"Sungai Musa"},
}
m["ngf-ynu"] = {
"Yau-Nungon",
12953319, -- untuk bahasa Yau tunggal dalam Wikipedia ([[w:Yau language (Trans–New Guinea)]])
"ngf-uru",
}
m["ngf-yup"] = {
"Yupna",
nil,
"ngf-fin",
aliases = {"Sungai Yupna"}, -- Usher?
}
m["nic"] = {
"Niger-Congo",
33838,
aliases = {"Niger-Kordofania"},
}
m["nic-alu"] = {
"Alumik",
4737355,
"nic-plt",
}
m["nic-bas"] = {
"Basa",
4866154,
"nic-knj",
}
m["nic-bbe"] = {
"Beboid Timur",
nil,
"nic-beb",
}
m["nic-bco"] = {
"Benue-Congo",
33253,
"nic-vco",
}
m["nic-bcr"] = {
"Bantoid-Cross",
806983,
"nic-bco",
}
m["nic-bdn"] = {
"Bantoid Utara",
nil,
"nic-bod",
aliases = {"Bantoid Utara"},
}
m["nic-bds"] = {
"Bantoid Selatan",
3183152,
"nic-bod",
aliases = {"Bantu Luas", "Bin"},
}
m["nic-beb"] = {
"Beboid",
813549,
"nic-bds",
}
m["nic-ben"] = {
"Bendi",
4887065,
"nic-bcr",
}
m["nic-beo"] = {
"Beromik",
4894642,
"nic-plt",
}
m["nic-bod"] = {
"Bantoid",
806992,
"nic-bcr",
}
m["nic-buk"] = {
"Buli-Koma",
nil,
"nic-ovo",
}
m["nic-bwa"] = {
"Bwa",
12628562,
"nic-gur",
other_names = {"Bwamu", "Bomu"},
}
m["nic-cde"] = {
"Delta Tengah",
3813191,
"nic-cri",
}
m["nic-cri"] = {
"Cross River",
1141096,
"nic-bcr",
}
m["nic-dag"] = {
"Dagbani",
nil,
"nic-wov",
}
m["nic-dak"] = {
"Dakoid",
1157745,
"nic-bdn",
}
m["nic-dge"] = {
"Escarpment Dogon",
5397128,
"qfa-dgn",
}
m["nic-dgw"] = {
"Dogon Barat",
nil,
"qfa-dgn",
}
m["nic-eko"] = {
"Ekoid",
1323395,
"nic-bds",
}
m["nic-eov"] = {
"Oti-Volta Timur",
nil,
"nic-ovo",
aliases = {"Samba"},
}
m["nic-fru"] = {
"Furu",
5509783,
"nic-bds",
}
m["nic-gne"] = {
"Gurunsi Timur",
12633072,
"nic-gns",
aliases = {"Grũsi Timur"},
}
m["nic-gnn"] = {
"Gurunsi Utara",
nil,
"nic-gns",
aliases = {"Grũsi Utara"},
}
m["nic-gnw"] = {
"Gurunsi Barat",
nil,
"nic-gns",
aliases = {"Grũsi Barat"},
}
m["nic-gns"] = {
"Gurunsi",
721007,
"nic-gur",
aliases = {"Grũsi"},
}
m["nic-gre"] = {
"Grassfields Timur",
5330160,
"nic-grf",
}
m["nic-grf"] = {
"Grassfields",
750932,
"nic-bds",
aliases = {"Bantu Grassfields", "Grassfields Luas"},
}
m["nic-grm"] = {
"Gurma",
30587833,
"nic-ovo",
}
m["nic-grs"] = {
"Grassfields Barat Daya",
7571285,
"nic-grf",
}
m["nic-gur"] = {
"Gur",
33536,
"alv-sav",
aliases = {"Voltaik"},
}
m["nic-ief"] = {
"Ibibio-Efik",
2743643,
"nic-lcr",
}
m["nic-jer"] = {
"Jera",
nil,
"nic-kne",
}
m["nic-jkn"] = {
"Jukunoid",
1711622,
"nic-pla",
}
m["nic-jrn"] = {
"Jarawan",
1683430,
"nic-mba",
}
m["nic-jrw"] = {
"Jarawa",
35423,
"nic-jrn",
}
m["nic-kam"] = {
"Kambari",
6356294,
"nic-knj",
}
m["nic-ktl"] = {
"Katloid",
nil,
"nic",
}
m["nic-kau"] = {
"Kauru",
nil,
"nic-kne",
}
m["nic-kmk"] = {
"Kamuku",
6359821,
"nic-knj",
}
m["nic-kne"] = {
"Kainji Timur",
5328687,
"nic-knj",
}
m["nic-knj"] = {
"Kainji",
681495,
"nic-pla",
}
m["nic-knn"] = {
"Kainji Barat Laut",
7060098,
"nic-knj",
}
m["nic-ktl"] = {
"Katloid",
6377681,
"nic",
aliases = {"Katla", "Katla-Tima"},
}
m["nic-lcr"] = {
"Cross River Hilir",
3813193,
"nic-cri",
}
m["nic-mam"] = {
"Mamfe",
2005898,
"nic-bds",
aliases = {"Nyang"},
}
m["nic-mba"] = {
"Mbam",
687826,
"nic-bds",
}
m["nic-mbc"] = {
"Mba",
6799561,
"nic-ubg",
}
m["nic-mbw"] = {
"Mbam Barat",
nil,
"nic-mba",
}
m["nic-mmb"] = {
"Mambiloid",
1888151,
other_names = {"Bantoid Utara"}, -- mengikut Wikipedia, Bantoid Utara ialah keluarga induk
"nic-bdn",
}
m["nic-mom"] = {
"Momo",
6897393,
"nic-grf",
}
m["nic-mre"] = {
"Moré",
nil,
"nic-wov",
}
m["nic-ngd"] = {
"Ngbandi",
36439,
"nic-ubg",
}
m["nic-nge"] = {
"Ngemba",
7022271,
"nic-gre",
}
m["nic-ngk"] = {
"Ngbaka",
3217499,
"nic-ubg",
}
m["nic-nin"] = {
"Ninzik",
7039282,
"nic-plt",
}
m["nic-nka"] = {
"Nkambe",
7042520,
"nic-gre",
}
m["nic-nkb"] = {
"Baka",
nil,
"nic-nkw",
}
m["nic-nke"] = {
"Ngbaka Timur",
nil,
"nic-ngk",
}
m["nic-nkg"] = {
"Gbanziri",
nil,
"nic-nkw",
}
m["nic-nkk"] = {
"Kpala",
nil,
"nic-nkw",
}
m["nic-nkm"] = {
"Mbaka",
nil,
"nic-nkw",
}
m["nic-nkw"] = {
"Ngbaka Barat",
nil,
"nic-ngk",
}
m["nic-npd"] = {
"Dogon Penara Utara",
nil,
"qfa-dgn",
}
m["nic-nun"] = {
"Nun",
13654297,
"nic-gre",
}
m["nic-nwa"] = {
"Nanga-Walo",
nil,
"qfa-dgn",
}
m["nic-ogo"] = {
"Ogoni",
2350726,
"nic-cri",
aliases = {"Ogonoid"},
}
m["nic-ovo"] = {
"Oti-Volta",
1157178,
"nic-gur",
}
m["nic-pla"] = {
"Platoid",
453244,
"nic-bco",
aliases = {"Nigeria Tengah"},
}
m["nic-plc"] = {
"Plateau Tengah",
5061668,
"nic-plt",
}
m["nic-pld"] = {
"Dogon Dataran",
nil,
"qfa-dgn",
}
m["nic-ple"] = {
"Plateau Timur",
5329154,
"nic-plt",
}
m["nic-pls"] = {
"Plateau Selatan",
7568236,
"nic-plt",
aliases = {"Jilik-Eggonik"},
}
m["nic-plt"] = {
"Plateau",
1267471,
"nic-pla",
}
m["nic-ras"] = {
"Rashad",
3401986,
"nic",
}
m["nic-rnc"] = {
"Ring Tengah",
nil,
"nic-rng",
}
m["nic-rng"] = {
"Ring",
2269051,
"nic-grf",
aliases = {"Ring Road"},
}
m["nic-rnn"] = {
"Ring Utara",
nil,
"nic-rng",
}
m["nic-rnw"] = {
"Ring Barat",
nil,
"nic-rng",
}
m["nic-ser"] = {
"Sere",
7453058,
"nic-ubg",
}
m["nic-shi"] = {
"Shiroro",
7498953,
"nic-knj",
aliases = {"Pongu"},
}
m["nic-sis"] = {
"Sisaala",
36532,
"nic-gnw",
}
m["nic-tar"] = {
"Tarokoid",
2394472,
"nic-plt",
}
m["nic-tiv"] = {
"Tivoid",
752377,
"nic-bds",
}
m["nic-tvc"] = {
"Tivoid Tengah",
nil,
"nic-tiv",
}
m["nic-tvn"] = {
"Tivoid Utara",
nil,
"nic-tiv",
}
m["nic-ubg"] = {
"Ubangi",
33932,
"nic-vco", -- atau tiada
}
m["nic-uce"] = {
"Cross River Hulu Timur-Barat",
nil,
"nic-ucr",
}
m["nic-ucn"] = {
"Cross River Hulu Utara-Selatan",
nil,
"nic-ucr",
}
m["nic-ucr"] = {
"Cross River Hulu",
4108624,
"nic-cri",
aliases = {"Cross Atas"},
}
m["nic-vco"] = {
"Volta-Congo",
37228,
"alv",
}
m["nic-wov"] = {
"Oti-Volta Barat",
nil,
"nic-ovo",
aliases = {"Moré-Dagbani"},
}
m["nic-ykb"] = {
"Yukubenik",
16909196,
"nic-plt",
aliases = {"Oohum"},
}
m["nic-ymb"] = {
"Yambasa",
nil,
"nic-mba",
}
m["nic-yon"] = {
"Yom-Nawdm",
nil,
"nic-ovo",
aliases = {"Moré-Dagbani"},
}
m["njo"] = {
"Ao",
28433,
"sit-aao",
aliases = {"Ao Naga"},
}
m["nub"] = {
"Nubian",
1517194,
"sdv-nes",
}
m["nub-hil"] = {
"Hill Nubian",
5762211,
"nub",
aliases = {"Nubia Kordofan"},
}
m["omq"] = {
"Oto-Mangue",
33669,
}
m["omq-cha"] = {
"Chatino",
35111,
"omq-zap",
}
m["omq-chi"] = {
"Chinantecan",
35828,
"omq",
}
m["omq-cui"] = {
"Cuicatec",
616024,
"omq-mix",
}
m["omq-maz"] = {
"Mazatecan",
36230,
"omq",
aliases = {"Mazatec"},
}
m["omq-mix"] = {
"Mixtecan",
21083066,
"omq",
}
m["omq-mxt"] = {
"Mixtec",
36363,
"omq-mix",
}
m["omq-otp"] = {
"Oto-Pamean",
1270220,
"omq",
}
m["omq-pop"] = {
"Popolocan",
5132273,
"omq",
}
m["omq-tri"] = {
"Triqui",
780200,
"omq-mix",
aliases = {"Trique"},
}
m["omq-zap"] = {
"Zapotecan",
8066463,
"omq",
}
m["omq-zpc"] = {
"Zapotec",
13214,
"omq-zap",
}
m["omv"] = {
"Omotik",
33860,
"afa",
}
m["omv-aro"] = {
"Aroid",
3699526,
"omv",
aliases = {"Ari-Banna", "Omotik Selatan", "Somotik"},
}
m["omv-diz"] = {
"Dizoid",
430251,
"omv",
aliases = {"Maji", "Majoid"},
}
m["omv-eom"] = {
"Ometo Timur",
20527288,
"omv-ome",
}
m["omv-gon"] = {
"Gonga",
4143043,
"omv",
aliases = {"Kefoid"},
}
m["omv-mao"] = {
"Mao",
1351495,
"omv",
}
m["omv-nom"] = {
"Ometo Utara",
nil,
"omv-ome",
}
m["omv-ome"] = {
"Ometo",
36310,
"omv",
}
m["oto"] = {
"Otomian",
130372545,
"omq-otp",
}
m["oto-otm"] = {
"Otomi",
36355,
"oto",
}
m["paa"] = {
"Papua",
236425,
"qfa-not",
}
m["paa-aia"] = {
"Aian",
4767739, -- Bahasa-bahasa Annaberg
"paa-ram",
aliases = {"Ramu Tengah", -- Foley (dengan Rao),
"Annaberg", -- dengan Rao
"Aram-Aren", -- Usher
},
}
m["paa-alp"] = {
"Alor-Pantar",
3502429,
"paa-tap",
}
m["paa-amu"] = {
"Amto-Musan",
480281,
aliases = {"Sungai Samaia"},
}
m["paa-ani"] = {
"Anim",
55603991,
aliases = {"Sungai Fly"},
}
m["paa-ara"] = {
"Arapesh",
4784223,
"paa-koa",
aliases = {"Arapeshan"}, -- Foley
}
m["paa-arf"] = {
"Arafundi",
4783702,
}
m["paa-ata"] = {
"Ataitan",
4812652,
"paa-ram",
aliases = {"Tangu", -- Foley
"Tanggu", -- nama alternatif yang diberikan oleh Wikipedia
"Sungai Moam", -- Usher
},
}
m["paa-baa"] = {
"Bayono-Awbono",
2424781,
}
m["paa-bai"] = {
"Baining",
748487,
aliases = {"New Britain Timur"},
}
m["paa-baw"] = {
"Bosngun-Awar",
nil,
"paa-ott",
aliases = {"Pesisir Ramu Timur", -- Usher
"Bosman-Awar", -- Wikipedia
},
}
m["paa-bew"] = {
"Bewani", -- [[w:Bewani languages]] dilencongkan ke [[w:Border languages (New Guinea)]]; namun Wikipedia Bahasa Croatia mempunyai entri
16113460,
"paa-bor",
aliases = {"Sungai Poal"}, -- Usher
}
m["paa-boa"] = {
"Boazi",
48803717,
"paa-mby",
aliases = {"Tasik Murray"}, -- Usher
}
m["paa-bor"] = {
"Border",
1752158,
aliases = {"Tami Atas",
"Banjaran Bewani-Sungai Tami", -- Usher
},
}
m["paa-bul"] = {
"Sungai Bulaka",
4987195,
aliases = {"Yelmek-Maklew", "Jabga"}, -- Yelmek-Maklew dalam Evans (2018) dan Gregor (2021)
}
m["paa-bvi"] = {
"Betaf-Vitou", -- Glottolog
nil,
"paa-tor",
aliases = {"Vitou-Betaf", -- Wikipedia
"Fitou-Tena", -- Usher
"Manirem",
},
}
m["paa-clp"] = {
"Dataran Tasik Tengah", -- [[w:Central Lakes Plain languages]] dilencongkan ke [[w:Lakes Plain languages]]
nil, -- Q86780132 adalah untuk kategori berkaitan yang wujud dalam enwiki
"paa-lpl",
aliases = {"Tariku Timur", -- Glottolog
"Dataran Tasik Tengah", -- Usher
},
}
m["paa-dtu"] = {
"Doso-Turumsa",
16917784,
-- berkemungkinan berkaitan dengan bahasa-bahasa Strickland Timur
aliases = {"Sungai Soari"}, -- istilah Usher
}
m["paa-ebh"] = {
"Kepala Burung Timur",
338064,
aliases = {"Mantion-Meax", "Mantion-Meyah", -- Mantion-Meax ialah istilah Wikipedia
"Kepala Burung Tenggara", -- Usher (2020)
},
}
m["paa-eel"] = {
"Eleman Timur",
nil,
"paa-ele",
aliases = {"Eleman Timur"},
}
m["paa-egb"] = {
"Teluk Geelvink Timur",
1497678,
aliases = {"Teluk Geelvink", "Cenderawasih Timur"}, -- Teluk Geelvink mengikut Glottolog
}
m["paa-eke"] = {
"Keram Timur",
nil,
"paa-ker",
}
m["paa-ele"] = {
"Eleman",
3034298,
aliases = {"Teluk Kerema"},
}
m["paa-elp"] = {
"Dataran Tasik Timur", -- [[w:East Lakes Plain languages]] dilencongkan ke [[w:Lakes Plain languages]]; namun Wikipedia Bahasa Croatia mempunyai entri
12633078,
"paa-lpl",
aliases = {"Dataran Tasik Timur"}, -- Usher
}
m["paa-epw"] = {
"Pauwasi Timur",
16115496,
aliases = {"Pauwasi Timur"},
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["paa-etf"] = {
"Trans-Fly Timur",
5330530,
aliases = {"Oriomo"}, -- semakin banyak digunakan kebelakangan ini, kemungkinan bermula dalam Evans (2018)
}
m["paa-eti"] = {
"Timor Timur",
15496066,
"paa-tap",
aliases = {"Oirata-Makasae", -- nama Wikipedia
"Timor Timur", -- nama alternatif yang diberikan oleh Wikipedia
"Fataluku-Makasai", "Oirata-Makasai", -- nama-nama alternatif yang diberikan oleh Wikidata
},
}
m["paa-fas"] = {
"Fas",
3502658,
aliases = {"Baibai-Fas"}, -- nama Glottolog
}
m["paa-flp"] = {
"Dataran Tasik Barat Jauh", -- [[w:Wapoga River languages]] dilencongkan ke [[w:Lakes Plain languages]]
nil, -- Q86808337 adalah untuk kategori bahasa Wapoga berkaitan, yang wujud dalam enwiki
"paa-lpl",
aliases = {"Rasawa", -- Clouse (1997)
"Sungai Wapoga", -- Usher, termasuk Kehu/Keuw (tidak terkelas oleh yang lain)
},
}
m["paa-gkw"] = {
"Kwerba Raya",
12635134,
aliases = {"Banjaran Foja Barat", -- Usher
"Kwerbik", -- Wikipedia
"Kwerba", -- Foley (2018)
},
}
m["paa-gto"] = {
"Galela-Tobelo",
nil,
"paa-nnh",
aliases = {"Halmahera Utara Tanah Besar", -- Glottolog
"Tanah Besar Halmahera Utara", "Halmahera Timur Laut", -- nama-nama alternatif
"Halmahera Timur Laut", -- Wikipedia, daripada Verhoeve 1988
},
}
m["paa-hya"] = {
"Heyo-Yahang",
nil,
"paa-mam",
aliases = {"Yahang-Heyo"}, -- nama Wikipedia
}
m["paa-ing"] = {
"Teluk Pedalaman",
6034783,
"paa-ani",
aliases = {"Teluk Papua Pedalaman"}, -- Glottolog
}
m["paa-isk"] = {
"Sko Pedalaman",
65043889,
"paa-sko",
aliases = {"Skouik", -- Glottolog
"Pesisir Vanimo Barat", -- Usher
"Skou Barat", -- Wikipedia
"Skou Pedalaman", "Skou Nuklear", -- nama-nama alternatif yang diberikan oleh Wikipedia
},
}
m["paa-iwa"] = {
"Iwam",
15147853,
"paa-sep",
}
m["paa-kae"] = {
"Kamula-Elevala",
130390498,
-- kerap diletakkan dalam TNG
aliases = {"Sungai Kamula-Elevala"},
}
m["paa-kan"] = {
"Kanum", -- dikeluarkan daripada Tonda oleh Glottolog
nil,
"paa-ton",
}
m["paa-kay"] = {
"Kayagarik",
7566330,
aliases = {"Kayagar", -- dahulunya lazim
"Sungai Cook"}, -- per Usher (2020)
}
m["paa-ker"] = {
"Keram",
48768173,
-- kerap dikelompokkan dalam atau setara dengan bahasa-bahasa Ramu
aliases = {"Sungai Keram"},
}
m["paa-kiw"] = {
"Kiwaian",
338449,
aliases = {"Kiwai"}, -- dahulunya lazim, masih digunakan kadangkala
}
m["paa-kko"] = {
"Kaure-Kosare", -- ditolak oleh Pawley-Hammarström tetapi diterima oleh Glottolog, Foley (2018) dan Usher (2020)
48767891,
aliases = {"Sungai Nawa"}, -- istilah Usher
}
m["paa-koa"] = {
"Kombio-Arapesh",
16115049,
"paa-trr",
aliases = {"Kombio-Arapeshan", -- Laycock, yang memasukkan Wom
"Kombio-Arapesh-Urat", -- Glottolog, termasuk Urat
},
}
m["paa-kol"] = {
"Kolopom",
6427807,
}
m["paa-kom"] = {
"Kombio",
65044238,
"paa-koa",
aliases = {"Kombian", -- Laycock
"Kombio-Yambes", -- Glottolog
},
}
m["paa-kun"] = {
"Kunimaipan",
134973258,
aliases = {"Banjaran Wharton Barat Laut"}, -- per Usher (2020)
-- sering dianggap sebagai subkeluarga Goilalan
}
m["paa-kwa"] = {
"Kwalean",
6450053,
aliases = {"Humene-Uare"},
}
m["paa-kwe"] = {
"Kwerba tepat",
12635134,
"paa-gkw",
aliases = {"Kwerba", -- Usher
"Kwerbaik", -- Glottolog
},
}
m["paa-kwo"] = {
"Kwomtari",
2075415,
aliases = {"Kwomtari-Nai"}, -- Sungai Senu ialah cadangan lebih besar yang belum terbukti
}
m["paa-lla"] = {
"Loloda-Laba", -- bahasa tunggal dalam Glottolog (Loloda-Laba) dan Wikipedia (Loloda)
11732388, -- bagi bahasa Loloda
"paa-gto",
aliases = {"Loloda"}, -- nama Wikipedia
}
m["paa-lma"] = {
"May Kiri",
614468,
aliases = {"Sungai Arai"}, -- per Usher (2020)
-- Kadangkala dalam keluarga andaian Arai-Samaia bersama Amto-Musan dan bahasa Pyu
}
m["paa-lmu"] = {
"Lepki-Murkim", -- Kembra diterima oleh Glottolog dan Usher; tidak oleh Foley (2020) tetapi tidak menolak kemungkinan hubungan
85776285,
-- keluarga bebas per Glottolog, sebahagian daripada keluarga Sungai Pauwasi Selatan (di bawah Pauwasi) per Usher (2020)
aliases = {"Lepki-Murkim-Kembra"}, -- Glottolog
}
m["paa-lpl"] = {
"Dataran Tasik",
6478969,
aliases = {"Dataran Tasik"},
}
m["paa-lra"] = {
"Ramu Bawah",
65089469,
"paa-ram",
aliases = {"Ottilien-Misegian"}, -- nama alternatif yang diberikan oleh Wikipedia
}
m["paa-lse"] = {
"Sepik Bawah",
7061700,
aliases = {"Nor-Pondo"},
}
m["paa-mai"] = {
"Mairasi",
6736896,
aliases = {"Mairasik"}, -- per Glottolog
}
m["paa-mal"] = {
"Mailuan",
6735839,
aliases = {"Teluk Cloudy"},
}
m["paa-mam"] = {
"Maimai", -- Maimai Foley diperluas
53679325, -- ini adalah kod bagi Maimai yang diperluas dengan 6 bahasa, berbanding 3 dalam "Maimai Nuklear"
"paa-trr",
aliases = {"Maimai Nuklear", -- nama Glottolog
"Maimai tepat", -- nama Wikipedia
},
}
m["paa-man"] = {
"Manubaran",
6752335,
aliases = {"Gunung Brown"},
}
m["paa-mar"] = {
"Marienberg",
1570589,
"paa-trr",
aliases = {"Bukit Marienberg"}, -- Usher
}
m["paa-may"] = {
"Maybratik",
4830892, -- kod untuk bahasa Maybrat dalam Wikipedia, yang merangkumi dua bahasa dalam keluarga ini
-- diandaikan termasuk dalam Papua Barat tetapi umumnya dianggap sebagai keluarga terpencil
aliases = {"Maybrat-Karon"},
}
m["paa-mbi"] = {
"Mbaham-Iha",
85784512,
"qfa-dis", -- Bahasa-bahasa Papua; Glottolog mengelompokkan Karas (Kalamang) dengan Mbaham-Iha ke dalam keluarga Bomberai Barat (tanah besar)
-- dan berhenti di situ; Wikipedia, mengikut Usher dan Schapper (2022), mengelompokkan Karas, Mbaham-Iha
-- dan keluarga besar Timor-Alor-Pantar ke dalam keluarga Bomberai Barat (Raya), menyatakan bahawa Karas tidak lebih
-- dekat dengan Mbaham-Iha berbanding dengan Timor-Alor-Pantar.
aliases = {"Mbahaam-Iha", -- digunakan oleh Wikidata
"Bomberai Barat Nuklear", -- nama Glottolog
},
}
m["paa-mby"] = {
"Marind-Boazi-Yaqay",
3217484,
"paa-ani",
aliases = {"Marind-Boazi-Yaqai", -- Glottolog
"Marind-Yakhai", -- Usher, tanpa Boazi
"Marind-Yaqai", -- Wikidata
"Marind", -- nama alternatif yang diberikan oleh Wikipedia
"Marind-Arandai", -- nama alternatif yang diberikan oleh Wikipedia Bahasa Sepanyol
},
}
m["paa-mmu"] = {
"Mandi-Muniwara",
nil,
"paa-mar",
aliases = {"Bukit Marienberg Barat"}, -- Usher
}
m["paa-mon"] = {
"Monumbo", -- per Glottolog: "Tiada bukti untuk bahasa-bahasa Bogia (Monumbo) berkaitan dengan bahasa-bahasa Torricelli lain pernah dikemukakan"
16928417,
aliases = {"Bogia", -- Glottolog
"Teluk Bogia", -- Usher (2020)
},
}
m["paa-mri"] = {
"Marindik", -- [[w:Marindic languages]] dilencongkan ke [[w:Marind–Yaqai languages]]
nil,
"paa-mby",
aliases = {"Marind"}, -- Usher; bahasa tunggal
}
m["paa-nam"] = {
"Nambu",
6961418,
"paa-yam",
aliases = {"Sungai Morehead Timur"}, -- Usher
}
m["paa-nbo"] = {
"Bougainville Utara",
749496,
}
m["paa-ndu"] = {
"Ndu",
3217498,
"paa-sep", -- Tidak diterima oleh Glottolog
aliases = {"Ndu-Nggala"}, -- Usher
}
m["paa-ngk"] = {
"Ngkolmpu", -- dianggap sebagai bahasa tunggal oleh Wikipedia
5908646,
"paa-kan",
aliases = {"Ngkantr", -- Glottolog
"Kanum Ngkolmpu", -- Wikipedia
"Ngkontar", -- nama alternatif yang diberikan oleh Wikipedia
"Kanum", -- digunakan oleh Wikidata
},
}
m["paa-nha"] = {
"Halmahera Utara",
3217358,
-- kemungkinan dalam keluarga Papua Barat yang dicadangkan atau keluarga bebas
}
m["paa-nim"] = {
"Nimboran",
12638426,
aliases = {"Nimboranik", -- per Glottolog
"Sungai Grime", -- per Usher (2020)
}
}
m["paa-nnd"] = {
"Ndu Nuklear",
nil,
"paa-ndu",
aliases = {"Ndu", -- Usher, dengan Boiken/Boikin
"Ndu tepat", -- Wikipedia
},
}
m["paa-nnh"] = {
"Halmahera Utara Bahagian Utara",
nil,
"paa-nha",
aliases = {"Halmahera Utara Bahagian Utara", -- Glottolog
"Halmahera", -- Usher
"Halmahera Teras", -- Wikipedia
},
}
m["paa-nto"] = {
"Namla-Tofanma",
16918187,
-- keluarga bebas per Glottolog dan Foley (2018), sebahagian daripada keluarga Pauwasi Barat (di bawah Pauwasi) per Usher (2020)
}
m["paa-ott"] = {
"Ottilien",
7109477,
"paa-lra",
aliases = {"Pesisir Ramu", -- Usher
"Watam-Awar-Gamay", -- nama alternatif yang diberikan oleh Wikipedia
},
}
m["paa-pah"] = {
"Sungai Pahoturi",
17049141,
aliases = {"Pahoturi"}, -- per Glottolog
}
m["paa-pal"] = {
"Palei", -- Laycock menambah Agi dan Nabi/Nambi(-Metan)
65089113,
"paa-wpa",
aliases = {"Palai Nuklear"},
}
m["paa-pia"] = {
"Piawi", -- mengikut Wikipedia, dikelompokkan dengan bahasa-bahasa Arafundi untuk membentuk Yuat Atas, yang merupakan saudara kepada Madang
7190400,
aliases = {"Banjaran Schraeder", -- Usher?
"Waibuk"},
}
m["paa-pio"] = {
"Sungai Piore",
65043152,
"paa-sko",
aliases = {"Lagun Barupu", -- Glottolog
"Lagun", -- nama alternatif yang diberikan oleh Wikipedia
},
}
m["paa-por"] = {
"Porapora", -- Foley memasukkan Ambakich (yang mana kita, Glottolog, dan Usher layan sebagai Keram)
65044258,
"paa-ram",
aliases = {"Agoan", -- Glottolog
"Sungai Porapora", -- Usher
"Grass teras", -- nama alternatif yang diberikan oleh Wikipedia
},
}
m["paa-ram"] = {
"Ramu",
3442808,
aliases = {"Sungai Ramu"}, -- per Usher (2020)
}
m["paa-rsa"] = {
"Rasawa-Saponi", -- [[w:Rasawa-Saponi languages]] dilencongkan ke [[w:Lakes Plain languages]]
nil, -- Q9859418 adalah untuk kategori berkaitan yang wujud dalam Wikipedia Bahasa Piedmont
"paa-flp",
aliases = {"Sungai Rombak"}, -- Usher
}
m["paa-rub"] = {
"Ruboni",
6875319,
"paa-lra",
aliases = {"Misegian", -- nama Wikipedia
"Mikarew", -- nama alternatif yang diberikan oleh Wikipedia
"Banjaran Ruboni"}, -- Usher
}
m["paa-saa"] = {
"Samarokena-Airoran",
96417699,
"paa-gkw",
aliases = {"Pesisir Apauwar"}, -- Usher
}
m["paa-sah"] = {
"Sahu",
nil,
"paa-nnh",
}
m["paa-sbo"] = {
"Bougainville Selatan",
3217380,
}
m["paa-sen"] = {
"Sentani",
17044584,
-- tiada konsensus mengenai pertalian yang lebih tinggi, jika ada
aliases = {"Sentanik", "Demta-Sentani", "Demta-Tasik Sentani"}, -- Sentanik mengikut Glottolog, Demta-Sentani mengikut Wikipedia
}
m["paa-sep"] = {
"Sepik",
3508772,
}
m["paa-shi"] = {
"Bukit Serra",
65043154,
"paa-sko",
}
m["paa-sko"] = {
"Sko",
953509,
aliases = {"Skou"},
}
m["paa-sng"] = {
"Senagi",
2066550,
}
m["paa-taa"] = {
"Taikat-Awyi", -- [[w:Taikat languages]] dilencongkan ke [[w:Border languages (New Guinea)]]; namun Wikipedia Bahasa Croatia mempunyai entri
12643265,
"paa-bor",
aliases = {"Taikat", -- Foley
"Sungai Tami Atas"}, -- Usher
}
m["paa-tam"] = {
"Tamolan",
7681634,
"paa-ram",
aliases = {"Sungai Guam"}, -- Usher
}
m["paa-tap"] = {
"Timor-Alor-Pantar",
16590002,
}
m["paa-teb"] = {
"Teberan",
7692052,
-- Kerap dikelompokkan dengan Trans-New Guinea, tetapi mengikut Pawley-Hammarström (2018), ia mempunyai "tuntutan keahlian yang lebih lemah atau dipertikaikan dalam TNG".
aliases = {"Dadibi-Folopa"},
}
m["paa-tir"] = {
"Tirio",
7809225,
"paa-ani",
aliases = {"Fly Bawah Nuklear", -- Pawley-Hammarström ("Fly Bawah" termasuk Abom)
"Tirio Nuklear", -- Glottolog ("Tirio" termasuk Abom)
"Sungai Fly Bawah", -- Usher (tanpa Abom)
},
}
m["paa-tki"] = {
"Turama-Kikori",
7853680,
aliases = {"Turama-Kikorian", "Sungai Rumu-Omati"},
}
m["paa-ton"] = {
"Tonda",
8581005,
"paa-yam",
aliases = {"Sungai Morehead Barat"}, -- Usher
}
m["paa-too"] = {
"Tor-Orya",
16590099,
aliases = {"Orya-Tor"},
}
m["paa-tor"] = {
"Tor", -- [[w:Tor languages]] dilencongkan ke [[w:Orya–Tor languages]]
nil,
"paa-too",
}
m["paa-trr"] = {
"Torricelli",
1333831,
}
m["paa-tti"] = {
"Ternate-Tidore",
nil,
"paa-nnh",
}
m["paa-wal"] = {
"Walio",
16919872,
-- Kerap diletakkan dalam Sepik (cth. oleh Laycock dan Z'graggen (1975)), tetapi tidak oleh Foley (2018), dan tidak diterima oleh Glottolog.
aliases = {"Walioik", -- Glottolog
"Sungai Leonhard Schultze Tengah",
},
}
m["paa-wap"] = {
"Wapei", -- Glottolog memasukkan Nabi/Nambi(-Metan) dalam Wapeik
65089115,
"paa-wpa",
aliases = {"Wapeik"}, -- Glottolog
}
m["paa-war"] = {
"Waris", -- [[w:Waris languages]] dilencongkan ke [[w:Border languages (New Guinea)]]; namun Wikipedia Bahasa Croatia mempunyai entri
12645076,
"paa-bor",
aliases = {"Warisik", -- Glottolog
"Sungai Bapi"}, -- Usher (tanpa Manem atau Senggi)
}
m["paa-wbh"] = {
"Kepala Burung Barat",
5330530,
-- Kuwani kadangkala dimasukkan; berkemungkinan berkaitan dengan bahasa-bahasa Halmahera Utara.
}
m["paa-wel"] = {
"Eleman Barat",
nil,
"paa-ele",
aliases = {"Eleman Barat"},
}
m["paa-wig"] = {
"Teluk Pedalaman Barat",
nil,
"paa-ing",
aliases = {"Teluk Papua Pedalaman Barat"}, -- Glottolog
}
m["paa-wke"] = {
"Keram Barat",
nil,
"paa-ker",
aliases = {"Koam", "Mongol-Langam", "Ulmapo"}, -- Koam digunakan oleh Foley, Ulmapo digunakan oleh Glottolog
}
m["paa-wko"] = {
"Wára-Kómnzo", -- memandangkan kita mengasingkan Kómnzo sebagai bahasa yang berasingan
11732474, -- untuk bahasa Wara
"paa-ton",
aliases = {"Anta-Komnzo-Wára-Wérè-Kémä", -- nama Glottolog
"Wára", "Wara", -- Wikipedia
},
}
m["paa-wlp"] = {
"Dataran Tasik Barat", -- [[w:Tariku languages]] dilencongkan ke [[w:Lakes Plain languages]]
47007503, -- sebenarnya untuk "bahasa-bahasa Tariku", yang mengikut Wikipedia merangkumi Fayu, Kirikiri, Iau dan Tause
"paa-lpl",
aliases = {"Tariku Barat", -- Glottolog
"Dataran Tasik Barat"}, -- Usher, dengan Edopi/Iau
}
m["paa-wpa"] = {
"Wapei-Palei",
65043156,
"paa-trr",
}
m["paa-wpw"] = { -- paa-wpa sudah digunakan oleh Wapei-Palei
"Pauwasi Barat", -- 2 bahasa per Glottolog dan Pawley-Hammarström; Usher turut memasukkan Namla-Tofanma dan Usku
85815062,
aliases = {"Pauwasi Barat", -- Wikipedia, Usher
"Tebi-Towe", "Dubu-Towei"},
}
m["paa-yam"] = {
"Yam",
15062272,
aliases = {"Sungai Morehead dan Maro Atas",
"Sungai Morehead"}, -- Usher
}
m["paa-yaq"] = {
"Yaqayik", -- [[w:Yaqai languages]] dilencongkan ke [[w:Marind–Yaqai languages]]
nil,
"paa-mby",
aliases = {"Yakhai-Warkay"}, -- Usher
}
m["paa-ysa"] = {
"Yawa-Saweru",
3217545,
aliases = {"Yawa", "Yawan", "Yapen"},
}
m["paa-yua"] = {
"Yuat",
8060096,
}
m["phi"] = {
"Filipina",
947858,
"poz",
}
m["phi-kal"] = {
"Kalamian",
3217466,
"phi",
aliases = {"Calamian"},
}
m["poz"] = {
"Melayu-Polinesia",
143158,
"map",
}
m["poz-aay"] = {
"Kepulauan Admiralty",
2701306,
"poz-oce",
}
m["poz-bnn"] = {
"Borneo Utara",
1427907,
"poz",
}
m["poz-bre"] = {
"Barito Timur",
2701314,
"poz",
}
m["poz-brw"] = {
"Barito Barat",
2761679,
"poz",
}
m["poz-bss"] = {
"Bali-Sasak-Sumbawa",
3396043,
"poz-msa",
}
m["poz-btk"] = {
"Bungku-Tolaki",
3217381,
"poz-clb",
}
m["poz-cet"] = {
"Melayu-Polinesia Tengah-Timur",
2269883,
"poz",
}
m["poz-clb"] = {
"Sulawesi",
1078041,
"poz",
}
m["poz-cln"] = {
"New Caledonia",
3091221,
"poz-ocs",
}
m["poz-cma"] = {
"Maluku Tengah",
3217479,
"poz-cet",
}
m["poz-hce"] = {
"Halmahera-Cenderawasih",
2526616,
"pqe",
}
m["poz-kal"] = {
"Kaili-Pamona",
3217465,
"poz-clb",
}
m["poz-lgx"] = {
"Lampungik",
49215,
"poz",
}
m["poz-mcm"] = {
"Melayu-Chamik",
nil,
"poz-msa",
}
m["poz-mic"] = {
"Mikronesia",
420591,
"poz-occ",
}
m["poz-mly"] = {
"Melayik",
662628,
"poz-mcm",
}
m["poz-msa"] = {
"Melayu-Sumbawa",
1363818,
"poz",
}
m["poz-mun"] = {
"Muna-Buton",
3037924,
"poz-clb",
}
m["poz-nws"] = {
"Sumatera Barat Laut",
2071308,
"poz",
}
m["poz-occ"] = {
"Oceania Tengah-Timur",
2068435,
"poz-oce",
}
m["poz-oce"] = {
"Oceania",
324457,
"pqe",
}
m["poz-ocs"] = {
"Oceania Selatan",
3039118,
"poz-occ",
}
m["poz-ocw"] = {
"Oceania Barat",
2701282,
"poz-oce",
}
m["poz-pcc"] = {
"Pasifik Tengah",
3130237,
"poz-occ",
}
m["poz-pep"] = {
"Polinesia Timur",
390979,
"poz-pnp",
}
m["poz-pnp"] = {
"Polinesia Nuklear",
743851,
"poz-pol",
}
m["poz-pol"] = {
"Polinesia",
390979,
"poz-pcc",
}
m["poz-san"] = {
"Sabah",
3217517,
"poz-bnn",
}
m["poz-sbj"] = {
"Sama-Bajau",
2160409,
"poz",
}
m["poz-slb"] = {
"Saluan-Banggai",
3217519,
"poz-clb",
}
m["poz-sls"] = {
"Solomon Tenggara",
3119671,
"poz-occ",
}
m["poz-ssw"] = {
"Sulawesi Selatan",
2778190,
"poz",
}
m["poz-stm"] = {
"St. Matthias",
6484143,
"poz-oce",
aliases = {"St Matthias"},
}
m["poz-swa"] = {
"Sarawak Utara",
538569,
"poz-bnn",
}
m["poz-tem"] = {
"Temotu",
3075769,
"poz-oce",
}
m["poz-tim"] = {
"Timorik",
7806987,
"poz-cet",
}
m["poz-ton"] = {
"Tongik",
3397263,
"poz-pol",
}
m["poz-tot"] = {
"Tomini-Tolitoli",
3217541,
"poz-clb",
}
m["poz-vnc"] = {
"Vanuatu Tengah",
5061988,
"poz-ocs",
}
m["poz-vnn"] = {
"Vanuatu Utara",
85789650,
"poz-ocs",
}
m["poz-vns"] = {
"Vanuatu Selatan",
3070173,
"poz-ocs",
}
m["poz-wot"] = {
"Wotu-Wolio",
1041317,
"poz-clb",
aliases = {"Kaili-Wolio Kepulauan"}, -- Glottolog
}
m["pqe"] = {
"Melayu-Polinesia Timur",
2269883,
"poz-cet",
}
m["qfa-adc"] = {
"Andaman Raya Tengah",
nil,
"qfa-adm",
}
m["qfa-adm"] = {
"Andaman Raya",
3515103,
}
m["qfa-adn"] = {
"Andaman Raya Utara",
nil,
"qfa-adm",
}
m["qfa-ads"] = {
"Andaman Raya Selatan",
nil,
"qfa-adm",
}
m["qfa-ain"] = {
"Ainuik",
50111972,
aliases = {"Ainu"},
}
m["qfa-bej"] = {
"Be-Jizhao",
nil,
"qfa-bet",
}
m["qfa-bet"] = {
"Be-Tai",
12627719,
"qfa-tak",
aliases = {"Tai-Be", "Daik-Beik", "Beik-Daik"},
}
m["qfa-buy"] = {
"Buyang",
1109927,
"qfa-kra",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["qfa-cka"] = {
"Chukotka-Kamchatka",
33255,
}
m["qfa-cre"] = {
"kreol",
33289,
"crp",
}
m["qfa-ckn"] = {
"Chukotka",
2606732,
"qfa-cka",
}
m["qfa-cnt"] = {
"sentuhan",
133253514,
"qfa-not",
}
m["qfa-dis"] = {
-- Bahasa-bahasa yang tidak dapat dikelaskan (qfa-unc) tetapi tiada konsensus mengenai pengelasannya. Biasanya
-- ini kerana bahasa tersebut bercapah dan dipertikaikan sama ada ia bahasa pencilan atau berkaitan secara jauh
-- dengan bahasa-bahasa lain.
"pertalian yang dipertikaikan",
nil,
"qfa-not",
categoryName = "Bahasa dengan pertalian yang dipertikaikan",
}
m["qfa-dgn"] = {
"Dogon",
1234776,
"nic",
}
m["qfa-dny"] = {
"Dene-Yenisei",
21103,
aliases = {"Dené-Yeniseian"},
}
m["qfa-hur"] = {
"Hurro-Urartian",
1144159,
}
m["qfa-iso"] = {
"pencilan",
33648,
"qfa-not",
categoryName = "Bahasa pencilan",
}
m["qfa-kad"] = {
"Kadu", -- dianggap sama ada Nilo-Sahara atau bebas/tiada
1720989,
}
m["qfa-kms"] = {
"Kam-Sui",
1023641,
"qfa-tak",
}
m["qfa-kor"] = {
"Koreanik",
11263525,
}
m["qfa-kra"] = {
"Kra",
1022087,
"qfa-tak",
}
m["qfa-lic"] = {
"Hlai",
1023648,
"qfa-tak",
aliases = {"Hlaik"},
}
m["qfa-mch"] = { -- digunakan di kedua-dua Amerika Utara dan Selatan
"Makro-Chibcha",
3438062,
}
m["qfa-mix"] = {
"campuran",
33694,
"qfa-cnt",
}
m["qfa-not"] = {
"bukan sekeluarga",
nil,
"qfa-not",
}
m["qfa-onb"] = {
"Be",
nil,
"qfa-bej",
aliases = {"Ong-Be", "Beik"},
}
m["qfa-ong"] = {
"Ongan",
2090575,
aliases = {"Angan", "Andaman Selatan", "Jarawa-Onge"},
}
m["qfa-pid"] = {
"pijin",
33831,
"crp",
}
m["qfa-sub"] = {
"substratum",
20730913,
"qfa-not",
}
m["qfa-tak"] = {
"Kra-Dai",
34171,
aliases = {"Tai-Kadai", "Kadai"},
}
m["qfa-tyn"] = {
"Tyrsenia",
1344038,
}
m["qfa-unc"] = {
-- Ini sepadan dengan bahasa yang biasanya dipanggil "tidak terkelas", iaitu data atau penyelidikan tidak mencukupi
-- untuk mengelaskannya, sedangkan [[:Kategori:Bahasa tidak terkelas]] kita hanyalah bahasa yang belum
-- dikelaskan oleh mana-mana penyunting Wiktionary (kod keluarga dalam data bahasa tiada).
"tidak dapat dikelaskan",
33956,
"qfa-not",
}
m["qfa-xgs"] = {
"Serbi-Mongolik",
108887939,
}
m["qfa-xgx"] = {
"Para-Mongolik",
107619002,
"qfa-xgs",
}
m["qfa-yen"] = {
"Yenisei",
27639,
"qfa-dny",
aliases = {"Yeniseik", "Yenisei-Ostyak"},
}
m["qfa-yke"] = {
"Ketik",
nil,
"qfa-yen",
}
m["qfa-yko"] = {
"Kottik",
nil,
"qfa-yen",
}
m["qfa-yrn"] = {
"Arinik",
nil,
"qfa-yen",
}
m["qfa-ypm"] = {
"Pumpokolik",
nil,
"qfa-yen",
}
m["qfa-yuk"] = {
"Yukaghir",
34164,
aliases = {"Yukagir", "Jukagir"},
}
m["qwe"] = {
"Quechua",
5218,
}
m["raj"] = {
"Rajasthan",
13196,
"inc-wes",
protoLanguage = "inc-ogu",
}
m["roa"] = {
"Romawi",
19814,
"itc",
aliases = {"Romanik", "Latin", "Neolatin", "Neo-Latin"},
protoLanguage = "la",
}
m["roa-asl"] = {
"Asturleon",
35390,
"roa-ibe",
protoLanguage = "roa-ole",
}
m["roa-cas"] = {
"Castilia",
71924,
"roa-ibe",
aliases = {"Castillian", "Castilik", "Castillik"},
protoLanguage = "osp",
}
m["roa-dal"] = {
"Romawi Dalmatia",
97646077,
"roa-itd",
}
m["roa-eas"] = {
"Romawi Timur",
147576,
"roa",
}
m["roa-emr"] = {
"Emilia-Romagnol",
242648,
"roa-git",
}
m["roa-gap"] = {
"Galicia-Portugis",
9080204,
"roa-ibe",
aliases = {"Romance Galicia", "Galaiko-Portugis"},
protoLanguage = "roa-opt",
}
m["roa-gar"] = {
"Gallo-Romawi",
500394,
"roa-wes",
}
m["roa-itd"] = {
"Italo-Dalmatia",
3313381,
"roa-iwr",
aliases = {"Romance Tengah"}
}
m["roa-itr"] = {
"Italo-Romawi",
3356483,
"roa-itd",
}
m["roa-iwr"] = {
"Italo-Romawi Barat",
112608,
"roa",
aliases = {"Italo-Barat"},
}
m["roa-git"] = {
"Gallo-Italik",
516074,
"roa-gar",
aliases = {"Gallo-Itali", "Gallo-Cisalpine", "Cisalpine"},
}
m["roa-grh"] = {
"Gallo-Raetia",
97646466,
"roa-gar",
}
m["roa-ibe"] = {
"Ibero-Romawi",
749533,
"roa-wes",
aliases = {"Romance Iberia", "Ibero-Romance Barat", "Ibero-Romance Barat", "Romance Iberia Barat", "Romance Iberia Barat"}
}
m["roa-nar"] = {
"Navarro-Aragon",
133252927,
"roa-ibe",
protoLanguage = "roa-ona",
}
m["roa-oil"] = {
"Oïl",
37351,
"roa-grh",
aliases = {"langues d'oïl", "langue d'oïl", "Cisalpine"},
protoLanguage = "fro",
}
m["roa-ocr"] = {
"Occitano-Romawi",
599958,
"roa-gar",
aliases = {"Gallo-Narbonnese", "Iberia Timur", "Iberia Timur"},
}
m["roa-rhe"] = {
"Rhaeto-Romawi",
515593,
"roa-grh",
aliases = {"langues d'oïl", "langue d'oïl", "Cisalpine"},
}
m["roa-sou"] = {
"Romawi Selatan",
145345,
"roa",
}
m["roa-wes"] = {
"Romawi Barat",
2714388,
"roa-iwr",
}
--[=[
Kod bahasa dan keluarga luar biasa bagi bahasa-bahasa Peribumi Amerika Selatan
boleh menggunakan awalan "sai-", walaupun "sai" bukan lagi kod keluarga itu sendiri.
]=]--
m["sai-ara"] = {
"Arauca",
626630,
}
m["sai-aym"] = {
"Aymara",
33010,
}
m["sai-bar"] = {
"Barbacoa",
807304,
aliases = {"Barbakoan"},
}
m["sai-bor"] = {
"Boran",
5371776,
}
m["sai-cah"] = {
"Cahuapanan",
1025793,
}
m["sai-car"] = {
"Karib",
33090,
aliases = {"Carib"},
}
m["sai-cer"] = {
"Cerrado",
98078151,
"sai-jee",
aliases = {"Jê Amazon"},
}
m["sai-chc"] = {
"Choco",
1075616,
aliases = {"Choco", "Chocó"},
}
m["sai-cho"] = {
"Chonan",
33019,
aliases = {"Chon"},
}
m["sai-cje"] = {
"Jê Tengah",
18010843,
"sai-cer",
aliases = {"Akuwẽ"},
}
m["sai-cpc"] = {
"Chapacuran",
1062626,
}
m["sai-crn"] = {
"Charruan",
3112423,
aliases = {"Charrúan"},
}
m["sai-ctc"] = {
"Catacao",
5051139,
}
m["sai-guc"] = {
"Guaicuruan",
1974973,
"sai-mgc",
aliases = {"Guaicurú", "Guaycuruana", "Guaikurú", "Guaycuruano", "Guaykuruan", "Waikurúan"},
}
m["sai-guh"] = {
"Guajibo",
944056,
aliases = {"Guahiboan", "Guajiboan", "Wahivoan"},
}
m["sai-gui"] = {
"Guiana",
nil,
"sai-car",
aliases = {"Carib Guiana", "Carib Guiana"},
}
m["sai-har"] = {
"Harákmbut",
1584402,
"sai-hkt",
aliases = {"Harákmbet"},
}
m["sai-hkt"] = {
"Harákmbut-Katukinan",
17107635,
}
m["sai-hrp"] = {
"Huarpean",
1578336,
aliases = {"Warpean", "Huarpe", "Warpe"},
}
m["sai-jee"] = {
"Jê",
1483594,
"sai-mje",
aliases = {"Gê", "Jean", "Gean", "Jê-Kaingang", "Ye"},
}
m["sai-jir"] = {
"Jirajaran",
3028651,
aliases = {"Hiraháran"},
}
m["sai-jiv"] = {
"Jivaro",
1393074,
aliases = {"Hívaro", "Jibaro", "Jibaroan", "Jibaroana", "Jívaro"},
}
m["sai-ktk"] = {
"Katukinan",
2636000,
"sai-hkt",
aliases = {"Catuquinan"},
}
m["sai-kui"] = {
"Kuikuroan",
nil,
"sai-car",
aliases = {"Kuikuro", "Nahukwa"},
}
m["sai-map"] = {
"Mapoyan",
61096301,
"sai-ven",
aliases = {"Mapoyo", "Mapoyo-Yabarana", "Mapoyo-Yavarana", "Mapoyo-Yawarana"},
}
m["sai-mas"] = {
"Mascoian",
1906952,
aliases = {"Mascoyan", "Maskoian", "Enlhet-Enenlhet"},
}
m["sai-mgc"] = {
"Mataco-Guaicuru",
255512,
}
m["sai-mje"] = {
"Makro-Jê",
887133,
aliases = {"Makro-Gê"},
}
m["sai-mtc"] = {
"Matacoan",
2447424,
"sai-mgc",
}
m["sai-mur"] = {
"Mura",
33826,
aliases = {"Mura"},
}
m["sai-nad"] = {
"Nadahup",
1856439,
aliases = {"Makú", "Macú", "Vaupés-Japurá"},
}
m["sai-nje"] = {
"Jê Utara",
98078225,
"sai-cer",
aliases = {"Jê Teras"},
}
m["sai-nmk"] = {
"Nambikwaran",
15548027,
aliases = {"Nambicuaran", "Nambiquaran", "Nambikuaran"},
}
m["sai-otm"] = {
"Otomacoan",
3217503,
aliases = {"Otomákoan", "Otomakoan"},
}
m["sai-pan"] = {
"Pano",
1544537,
"sai-pat",
aliases = {"Pano"},
}
m["sai-pat"] = {
"Pano-Tacana",
2475746,
aliases = {"Pano-Tacana", "Pano-Takana", "Páno-Takána", "Pano-Takánan"},
}
m["sai-pek"] = {
"Pekodian",
107451736,
"sai-car",
aliases = {"Carib Amazon Selatan", "Cariban Selatan", "Pekodi"},
}
m["sai-pem"] = {
"Pemong",
nil,
"sai-ven",
aliases = {"Pemong", "Pemóng", "Purukoto"},
}
m["sai-pey"] = {
"Peba-Yaguan",
174015,
aliases = {"Peba-Yagua", "Yaguan", "Peban", "Yáwan"},
}
m["sai-prk"] = {
"Parukotoan",
107451482,
"sai-car",
aliases = {"Parukoto"},
}
m["sai-sje"] = {
"Jê Selatan",
98078245,
"sai-jee",
}
m["sai-tac"] = {
"Tacanan",
3113762,
"sai-pat",
}
m["sai-tar"] = {
"Tarano",
105097814,
"sai-gui",
aliases = {"Trio", "Tarano"},
}
m["sai-tin"] = {
"Tiniguan",
2892258,
aliases = {"Tinigua"},
}
m["sai-tuc"] = {
"Tucanoan",
788144,
}
m["sai-tyu"] = {
"Ticuna-Yuri",
4467010,
}
m["sai-ucp"] = {
"Uru-Chipaya",
2475488,
aliases = {"Uru-Chipayan"},
}
m["sai-ven"] = {
"Karib Venezuela",
nil,
"sai-car",
aliases = {"Carib Venezuela", "Venezuela", "Venezuelano"},
}
m["sai-wic"] = {
"Wichí",
3027047,
}
m["sai-wit"] = {
"Witotoan",
43079317,
aliases = {"Huitotoan", "Uitotoan"},
}
m["sai-ynm"] = {
"Yanomami",
nil,
aliases = {"Yanomam", "Shamatari", "Yamomami", "Yanomaman"},
}
m["sai-yuk"] = {
"Yukpan",
nil,
"sai-car",
aliases = {"Yukpa", "Yukpano", "Yukpa-Japreria"},
}
m["sai-zam"] = {
"Zamucoan",
3048461,
aliases = {"Samúkoan"},
}
m["sai-zap"] = {
"Zaparo",
33911,
aliases = {"Záparoan", "Saparoan", "Sáparoan", "Záparo", "Zaparoano", "Zaparoana"},
}
m["sal"] = {
"Salish",
33985,
}
m["sdv"] = {
"SudanikTimur",
2036148,
"ssa",
}
m["sdv-bri"] = {
"Bari",
nil,
"sdv-nie",
}
m["sdv-daj"] = {
"Daju",
956724,
"sdv",
}
m["sdv-dnu"] = {
"Dinka-Nuer",
nil,
"sdv-niw",
}
m["sdv-eje"] = {
"Jebel Timur",
3408878,
"sdv",
}
m["sdv-kln"] = {
"Kalenjin",
637228,
"sdv-nis",
}
m["sdv-lma"] = {
"Lotuko-Maa",
nil,
"sdv-nie",
}
m["sdv-lon"] = {
"Luo Utara",
nil,
"sdv-luo",
}
m["sdv-los"] = {
"Luo Selatan",
7570103,
"sdv-luo",
}
m["sdv-luo"] = {
"Luo",
nil,
"sdv-niw",
}
m["sdv-nes"] = {
"SudanikTimur Utara",
4810496,
"sdv",
aliases = {"Astaboran", "Sudanik Ek"},
}
m["sdv-nie"] = {
"Nilotik Timur",
153795,
"sdv-nil",
}
m["sdv-nil"] = {
"Nilotik",
513408,
"sdv",
}
m["sdv-nis"] = {
"Nilotik Selatan",
1552410,
"sdv-nil",
}
m["sdv-niw"] = {
"Nilotik Barat",
3114989,
"sdv-nil",
}
m["sdv-nma"] = {
"Nandi-Markweta",
nil,
"sdv-kln",
}
m["sdv-nyi"] = {
"Nyima",
11688746,
"sdv-nes",
aliases = {"Nyimang"},
}
m["sdv-tmn"] = {
"Taman",
3408873,
"sdv-nes",
aliases = {"Tamaik"},
}
m["sdv-ttu"] = {
"Teso-Turkana",
7705551,
"sdv-nie",
aliases = {"Ateker"},
}
m["sel"] = {
"Selkup",
34008,
"syd",
}
m["sem"] = {
"Samiah",
34049,
"afa",
}
m["sem-ara"] = {
"Aram",
28602,
"sem-nwe",
protoLanguage = "arc",
}
m["sem-arb"] = {
"Arab",
164667,
"sem-cen",
protoLanguage = "ar",
}
m["sem-are"] = {
"Aram Timur",
3410322,
"sem-ara",
}
m["sem-arw"] = {
"Aram Barat",
3394214,
"sem-ara",
}
m["sem-ase"] = {
"Aram Tenggara",
3410322,
"sem-are",
}
m["sem-can"] = {
"Kanaan",
747547,
"sem-nwe",
}
m["sem-cen"] = {
"Samiah Tengah",
3433228,
"sem-wes",
}
m["sem-cna"] = {
"Neo-Aram Tengah",
3410322,
"sem-are",
}
m["sem-eas"] = {
"Samiah Timur",
164273,
"sem",
}
m["sem-eth"] = {
"Samiah Habsyah",
163629,
"sem-wes",
aliases = {"Afro-Semitik", "Habsyah", "Etiopia", "Etiosemitik"},
}
m["sem-nna"] = {
"Neo-Aram Timur Laut",
2560578,
"sem-are",
}
m["sem-nwe"] = {
"Samiah Barat Laut",
162996,
"sem-cen",
}
m["sem-osa"] = {
"Arab Selatan Kuno",
35025,
"sem-cen",
aliases = {"Arab Selatan Epigrafik", "Sayhadik"},
}
m["sem-sar"] = {
"Arab Selatan Moden",
1981908,
"sem-wes",
}
m["sem-wes"] = {
"Samiah Barat",
124901,
"sem",
}
m["sgn"] = {
"isyarat",
34228,
"qfa-not",
}
m["sgn-asl"] = {
"Bahasa Isyarat Amerika",
nil,
"sgn-fsl",
}
m["sgn-fsl"] = {
"Bahasa-bahasa Isyarat Perancis",
5501921,
"sgn",
}
m["sgn-gsl"] = {
"Bahasa-bahasa Isyarat Jerman",
5551235,
"sgn",
}
m["sgn-jsl"] = {
"Bahasa-bahasa Isyarat Jepun",
11722508,
"sgn",
}
m["sio"] = {
"Sioux",
34181,
"nai-sca",
}
m["sio-dhe"] = {
"Dhegiha",
3217420,
"sio-msv",
}
m["sio-dkt"] = {
"Dakota",
4154122,
"sio-msv",
}
m["sio-mor"] = {
"Sioux Sungai Missouri",
26807266,
"sio",
}
m["sio-msv"] = {
"Sioux Lembah Mississippi",
12637104,
"sio",
}
m["sio-ohv"] = {
"Sioux Lembah Ohio",
21070931,
"sio",
}
m["sit"] = {
"Sino-Tibet",
45961,
aliases = {"Trans-Himalaya"},
}
m["sit-aao"] = {
"Naga Tengah",
615474,
"sit",
}
m["sit-alm"] = {
"Almora",
nil,
"sit-whm",
}
m["sit-bai"] = {
"Bai",
35103,
"sit-mba",
}
m["sit-bdi"] = {
"Bod",
1814078,
"sit",
}
-- Terjemahan ini merujuk kepada panduan "Wiki format Malay translation"[cite: 1].
m["sit-cln"] = {
"Cai-Long",
107182612,
"sit-mba",
aliases = {"Ta-Li"},
}
m["sit-dhi"] = {
"Dhimalish",
1207648,
"sit",
}
m["sit-ebo"] = {
"Bod Timur",
56402,
"sit-bdi",
}
m["sit-egy"] = {
"rGyalrongik Timur",
832026,
"sit-rgy",
}
m["sit-ers"] = {
"Ersuik",
56335,
"sit",
}
m["sit-gma"] = {
"Magarik Raya",
55612963,
"sit",
}
m["sit-gsi"] = {
"Siangik Raya",
52698851,
"sit",
}
m["sit-hrs"] = {
"Hrusish",
1632501,
"sit",
aliases = {"Kamengik Tenggara"},
}
m["sit-jnp"] = {
"Jingphoik",
nil,
"sit-jpl",
aliases = {"Jingpho"},
}
m["sit-jpl"] = {
"Kachin-Luik",
1515454,
"tbq-bkj",
aliases = {"Jingpho-Luish", "Jingpho-Asakian", "Kachinik"},
}
m["sit-kch"] = {
"Konyak-Chang",
nil,
"sit-kon",
}
m["sit-kha"] = {
"Kham",
33305,
"sit-gma",
}
m["sit-khb"] = {
"Kho-Bwa",
6401917,
"sit",
aliases = {"Bugunish", "Kamengik"},
}
m["sit-khw"] = {
"Kho-Bwa Barat",
nil,
"sit-khb",
}
m["sit-khc"] = {
"Chug-Lish",
nil,
"sit-khw",
aliases = {"Duhumbi-Khispi"},
}
m["sit-khm"] = {
"Mey-Sartang",
nil,
"sit-khw",
aliases = {"Sartang-Sherdukpen"},
}
m["sit-kic"] = {
"Kiranti Tengah",
nil,
"sit-kir",
}
m["sit-kie"] = {
"Kiranti Timur",
nil,
"sit-kir",
}
m["sit-kin"] = {
"Kinnaurik",
nil,
"sit-whm",
aliases = {"Kinnauri"},
}
m["sit-kir"] = {
"Kiranti",
922148,
"sit",
}
m["sit-kiw"] = {
"Kiranti Barat",
922148,
"sit-kir",
}
m["sit-kon"] = {
"Naga Utara",
774590,
"tbq-bkj",
aliases = {"Konyakian", "Konyak"},
}
m["sit-kyk"] = {
"Kyirong-Kagate",
6450957,
"sit-tib",
}
m["sit-lab"] = {
"Ladakhi-Balti",
6450957,
"sit-tib",
}
m["sit-las"] = {
"Lahuli-Spiti",
6473510,
"sit-tib",
}
m["sit-luu"] = {
"Lui",
55621439,
"sit-jpl",
aliases = {"Asakian", "Sak"},
}
m["sit-mar"] = {
"Maringik",
nil,
"sit-tma",
}
m["sit-mba"] = {
"Makro-Bai",
16963847,
"sit-sba",
aliases = {"Bai Raya"},
}
m["sit-mdz"] = {
"Midzu",
6843504,
"sit",
aliases = {"Geman", "Midzuish", "Miju-Meyor", "Mishmi Selatan"},
}
m["sit-mnz"] = {
"Mondzi",
6898839,
"tbq-lob",
aliases = {"Mangish"},
}
m["sit-mru"] = {
"Mruik",
16908870,
"sit",
aliases = {"Mru-Hkongso"},
}
m["sit-nas"] = {
"Naish",
25047956,
"sit-nax",
}
m["sit-nax"] = {
"Naik",
6982999,
"tbq-buq",
aliases = {"Naxish"},
}
m["sit-nba"] = {
"Bai Utara",
122463830,
"sit-bai",
}
m["sit-new"] = {
"Newarik",
55625069,
"sit",
}
m["sit-nng"] = {
"Nung",
1515482,
"sit",
aliases = {"Nung"},
}
m["sit-qia"] = {
"Qiangik",
1636765,
"tbq-buq",
}
m["sit-rgy"] = {
"Rgyalrongik",
56936,
"sit-qia",
aliases = {"Jiarongik"},
}
m["sit-sba"] = {
"Sino-Bai",
nil,
"sit",
aliases = {"Bai Raya"},
}
m["sit-tam"] = {
"Tamangik",
3309439,
"sit",
aliases = {"Bodish Barat"},
}
m["sit-tan"] = {
"Tani",
3217538,
"sit",
}
m["sit-tib"] = {
"Tibetik",
1641150,
"sit-bdi",
protoLanguage = "otb",
}
m["sit-tja"] = {
"Tujia",
nil,
"sit",
}
m["sit-tma"] = {
"Tangkhul-Maring",
nil,
"sit",
}
m["sit-tng"] = {
"Tangkhulik",
1516657,
"sit-tma",
aliases = {"Tangkhul"},
}
m["sit-tno"] = {
"Tangsa-Nocte",
nil,
"sit-kon",
}
m["sit-tsk"] = {
"Tshangla",
nil,
"sit",
}
m["sit-wgy"] = {
"rGyalrongik Barat",
nil,
"sit-rgy"
}
m["sit-whm"] = {
"Himalaya Barat",
2301695,
"sit",
}
m["sit-zem"] = {
"Zeme",
189291,
"sit",
aliases = {"Zeliangrong", "Zemeik"},
}
m["sla"] = {
"Slavik",
23526,
"ine-bsl",
aliases = {"Slavonik"},
}
m["smi"] = {
"Sami",
56463,
"urj",
aliases = {"Saami", "Samik", "Saamik"},
}
m["son"] = {
"Songhay",
505198,
"ssa",
aliases = {"Songhai"},
}
m["sqj"] = {
"Albania",
8748,
"ine",
}
m["ssa"] = {
"Nilo-Sahara", -- berkemungkinan bukan pengelompokan genetik
33705,
}
m["ssa-fur"] = {
"Fur",
2989512,
"ssa",
}
m["ssa-klk"] = {
"Kuliak",
1791476,
"ssa",
aliases = {"Rub"},
}
m["ssa-kom"] = {
"Koman",
1781084,
"ssa",
}
m["ssa-sah"] = {
"Sahara",
1757661,
"ssa",
}
m["syd"] = {
"Samoyed",
34005,
"urj",
aliases = {"Samoyedik", "Samodeik"},
}
m["syd-ene"] = {
"Enets",
29942,
"syd",
}
m["tai"] = {
"Tai",
749720,
"qfa-bet",
aliases = {"Daik"},
}
m["tai-wen"] = {
"Wenma-Tai Barat Daya",
nil,
"tai",
}
m["tai-tay"] = {
"Tày",
nil,
"tai-wen",
}
m["tai-sap"] = {
"Sapa-Tai Barat Daya",
nil,
"tai-wen",
aliases = {"Sapa-Thai"},
}
m["tai-swe"] = {
"Tai Barat Daya",
10889250,
"tai-sap",
}
m["tai-cho"] = {
"Tai Chongzuo",
13216,
"tai",
}
m["tai-cen"] = {
"Tai Tengah",
5061891,
"tai",
}
m["tai-nor"] = {
"Tai Utara",
7059014,
"tai",
}
m["tbq"] = {
"Tibet-Burma",
34064,
"sit",
}
m["tbq-anp"] = {
"Angami-Pochuri",
530460,
"sit",
}
m["tbq-axi"] = {
"Axioid",
nil,
"tbq-sel",
}
m["tbq-bdg"] = {
"Bodo-Garo",
4090000,
"tbq-bkj",
}
m["tbq-bis"] = {
"Bisoid",
48844742,
"tbq-slo",
}
m["tbq-bka"] = {
"Bi-Ka",
12627890,
"tbq-slo",
}
m["tbq-bkj"] = {
"Sal",
889900,
"sit",
-- Brahmaputran nampaknya merupakan istilah Glottolog
aliases = {"Bodo-Konyak-Jinghpaw", "Brahmaputra", "Jingpho-Konyak-Bodo"},
}
m["tbq-brm"] = {
"Burmik",
865713,
"tbq-lob",
}
m["tbq-buq"] = {
"Burmo-Qiangik",
16056278,
"sit",
aliases = {"Tibeto-Burma Timur"},
}
m["tbq-drp"] = {
"Phula Hilir",
7188378,
"tbq-rph",
}
m["tbq-han"] = {
"Hanoid",
17004185,
"tbq-slo",
}
m["tbq-hph"] = {
"Phula Tanah Tinggi",
nil,
"tbq-sel",
}
m["tbq-jin"] = {
"Jino",
6202716,
"tbq-slo",
}
m["tbq-kzh"] = {
"Kazhuoish",
48834669,
"tbq-lol",
}
m["tbq-kuk"] = {
"Kuki-Chin",
832413,
"sit",
aliases = {"Kukik", "Tibeto-Burma Selatan-Tengah"},
}
m["tbq-lal"] = {
"Lalo",
56548,
"tbq-lso",
}
m["tbq-lho"] = {
"Lahoish",
nil,
"tbq-lol",
}
m["tbq-llo"] = {
"Lipo-Lolopo",
nil,
"tbq-lso",
}
m["tbq-lob"] = {
"Lolo-Burma",
1635712,
"tbq-buq",
}
m["tbq-lol"] = {
"Loloik",
37035,
"tbq-lob",
aliases = {"Yi", "Ngwi", "Nisoik"},
}
m["tbq-lso"] = {
"Lisu",
6559055,
"tbq-lol",
}
m["tbq-lwo"] = {
"Lawu",
48847673,
"tbq-lol",
}
m["tbq-muj"] = {
"Muji",
11221327,
"tbq-hph",
}
m["tbq-nas"] = {
"Nasu",
nil,
"tbq-nlo",
}
m["tbq-nis"] = {
"Nisu",
56404,
"tbq-nlo",
}
m["tbq-nlo"] = {
"Loloik Utara",
7058676,
"tbq-nso",
}
m["tbq-nso"] = {
"Niso",
56990,
"tbq-lol",
}
m["tbq-nus"] = {
"Nusu",
114245231,
"tbq-lol",
}
m["tbq-phw"] = {
"Phowa",
7187959,
"tbq-hph",
}
m["tbq-rph"] = {
"Phula Sungai",
nil,
"tbq-sel",
}
m["tbq-sel"] = {
"Loloik Tenggara",
16111894,
"tbq-nso",
}
m["tbq-sil"] = {
"Siloid",
60787071,
"tbq-slo",
}
m["tbq-slo"] = {
"Loloik Selatan",
5649340,
"tbq-lol",
}
m["tbq-tal"] = {
"Talu",
48804018,
"tbq-lso",
}
m["tbq-urp"] = {
"Phula Hulu",
7187058,
"tbq-rph",
}
m["trk"] = {
"Turkik",
34090,
}
m["trk-cmn"] = {
"Turkik Am",
1126028,
"trk",
aliases = {"Turkik Shaz"},
}
m["trk-kar"] = {
"Karluk",
703173,
"trk-cmn",
aliases = {"Qarluq", "Uyghur-Uzbek", "Turkik Tenggara"},
}
m["trk-kbu"] = {
"Kipchak-Bulgar",
3512539,
"trk-kip",
aliases = {"Ural", "Ural-Kaspia"},
}
m["trk-kcu"] = {
"Kipchak-Cuman",
4370412,
"trk-kip",
aliases = {"Ponto-Kaspia"},
}
m["trk-kip"] = {
"Kipchak",
1339898,
"trk-cmn",
-- Rencana Wikipedia Bahasa Rusia [[w:ru:Западнотюркские_языки]] menyatakan "Western Turkic" digunakan oleh N.A. Baskakov dan merangkumi Oghuz, Kipchak dan Karluk.
-- Rencana Wikipedia Bahasa Azerbaijan [[w:az:Qərbi_türk_dilləri]] menjelaskan bahawa "Western Turkic" bukan satu klad.
other_names = {"Turkik Barat"},
aliases = {"Kypchak", "Qypchaq", "Turkik Barat Laut"},
protoLanguage = "qwm",
}
m["trk-kkp"] = {
"Kyrgyz-Kipchak",
4221189,
"trk-kip",
}
m["trk-kno"] = {
"Kipchak-Nogai",
4326954,
"trk-kip",
aliases = {"Aral-Kaspia"},
}
m["trk-nsb"] = {
"Turkik Siberia Utara",
4537269,
"trk-sib",
aliases = {"Turkik Siberia Bahagian Utara"},
}
m["trk-ogr"] = {
"Oghur",
1422731,
"trk",
aliases = {"Turkik Lir", "Turkik r"},
}
m["trk-ogz"] = {
"Oghuz",
494600,
"trk-cmn",
aliases = {"Turkik Barat Daya"},
}
m["trk-sib"] = {
"Turkik Siberia",
354353,
"trk-cmn",
other_names = {"Turkik Utara"},
-- menurut [[w:ru:Восточнотюркские_языки]], "Eastern Turkic" ialah alias untuk Turkik Siberia dalam karya O.A. Mudrak,
-- tetapi mempunyai maksud bukan-klad yang berbeza dalam karya lama N.A. Baskakov.
aliases = {"Turkik Timur", "Turkik Timur Laut"},
}
m["trk-ssb"] = {
"Turkik Siberia Selatan",
nil,
"trk-sib",
aliases = {"Turkik Siberia Bahagian Selatan"},
}
m["tup"] = {
"Tupi",
34070,
aliases = {"Tupian"},
}
m["tup-gua"] = {
"Tupi-Guarani",
148610,
"tup",
aliases = {"Tupí-Guaraní"},
}
m["tuw"] = {
"Tungusik",
34230,
aliases = {"Manchu-Tungus", "Tungus"},
}
m["tuw-ewe"] = {
"Ewenik",
105889448,
"tuw",
aliases = {"Tungusik Utara"},
}
m["tuw-jrc"] = {
"Jurchenik",
105889432,
"tuw",
aliases = {"Manchurik"},
}
m["tuw-nan"] = {
"Nanaik",
105889264,
"tuw",
}
m["tuw-udg"] = {
"Udegheik",
105889266,
"tuw",
}
m["urj"] = {
"Uralik",
34113,
varieties = {"Finno-Ugrik"},
}
m["urj-fin"] = {
"Finnik",
33328,
"urj",
aliases = {"Finnik Baltik", "Balto-Finnik", "Fennik"},
}
m["urj-mdv"] = {
"Mordvinik",
627313,
"urj",
}
m["urj-prm"] = {
"Permik",
161493,
"urj",
}
m["urj-ugr"] = {
"Ugriik",
156631,
"urj",
}
m["wak"] = {
"Wakash",
60069,
}
m["wen"] = {
"Sorbia",
25442,
"zlw",
aliases = {"Lusatia", "Wendish"},
}
m["xgn"] = {
"Mongolik",
33750,
"qfa-xgs",
aliases = {"Mongolia"},
}
m["xgn-cen"] = {
"Mongolik Tengah",
28719447,
"xgn",
protoLanguage = "xng-lat",
}
m["xgn-sou"] = {
"Mongolik Selatan",
nil,
"xgn",
protoLanguage = "xng-ear",
}
m["xgn-shr"] = {
"Shirongolik",
107539435,
"xgn-sou",
}
m["xme"] = {
"Medes",
nil,
"ira-mpr",
protoLanguage = "xme-old",
}
m["xme-ttc"] = {
"Tatik",
nil,
"xme",
}
m["xnd"] = {
"Na-Dene",
26986,
"qfa-dny",
aliases = {"Na-Dené"},
}
m["xsc"] = {
"Scythia",
nil,
"ira-nei",
}
m["xsc-sak"] = {
"Saka",
nil,
"xsc-skw",
aliases = {"Sakan"},
}
m["xsc-sar"] = {
"Sarmata",
nil,
"xsc",
}
m["xsc-skw"] = {
"Saka-Wakhi",
nil,
"xsc",
}
m["yok"] = {
"Yokuts",
34249,
"nai-you",
aliases = {"Yokutsan", "Mariposan", "Mariposa"},
}
m["ypk"] = {
"Yupik",
27970,
"esx-esk",
aliases = {"Yup'ik", "Yuit"},
}
m["yrk"] = {
"Nenets",
36452,
"syd",
}
m["zhx"] = {
"Sinitik",
33857,
"sit-sba",
aliases = {"Cina"},
protoLanguage = "och",
}
m["zhx-com"] = {
"Min Pesisir",
20667215,
"zhx-min",
}
m["zhx-inm"] = {
"Min Pedalaman",
20667237,
"zhx-min",
}
m["zhx-man"] = {
"Mandarinik",
nil,
"zhx",
protoLanguage = "cmn-ear",
}
m["zhx-min"] = {
"Min",
56504,
"zhx",
}
m["zhx-nan"] = {
"Min Selatan",
36495,
"zhx-com",
}
m["zhx-pin"] = {
"Pinghua",
2735715,
"zhx",
protoLanguage = "ltc",
}
m["zhx-yue"] = {
"Yue",
7033959,
"zhx",
protoLanguage = "ltc",
}
m["zle"] = {
"Slavik Timur",
144713,
"sla",
}
m["zls"] = {
"Slavik Selatan",
146665,
"sla",
}
m["zlw"] = {
"Slavik Barat",
145852,
"sla",
}
m["zlw-lch"] = {
"Lechitik",
742782,
"zlw",
aliases = {"Lekhitik"},
}
m["zlw-pom"] = {
"Pomerania",
nil,
"zlw-lch",
}
m["znd"] = {
"Zande",
8066072,
"nic-ubg",
}
return require("Module:languages").finalizeData(m, "family")
smzeev4c5d1lxi8eclpkyuyxe4ajjn1
Modul:scripts/data
828
9770
373592
373547
2026-09-12T11:04:51Z
Hakimi97
2668
373592
Scribunto
text/plain
--[=[
When adding new scripts to this file, please don't forget to add
style definitons for the script in [[MediaWiki:Gadget-LanguagesAndScripts.css]].
]=]
local concat = table.concat
local insert = table.insert
local ipairs = ipairs
local next = next
local remove = table.remove
local select = select
local sort = table.sort
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string/char")
return u(...)
end
-- We can't use mw.loadData() on [[Module:languages/chars]] because [[Module:languages/data]] itself is sometimes loaded
-- using mw.loadData(), and calling mw.loadData() on [[Module:languages/chars]] will insert metatables into the
-- character tables, which the second mw.loadData() will choke on.
local m_chars = require("Module:languages/chars")
local c = m_chars.chars
local p = m_chars.puaChars
local cs = m_chars.chars_substitutions
------------------------------------------------------------------------------------
--
-- Helper functions
--
------------------------------------------------------------------------------------
-- Note: a[2] > b[2] means opens are sorted before closes if otherwise equal.
local function sort_ranges(a, b)
return a[1] < b[1] or a[1] == b[1] and a[2] > b[2]
end
-- Returns the union of two or more range tables.
local function union(...)
local ranges = {}
for i = 1, select("#", ...) do
local argt = select(i, ...)
for j, v in ipairs(argt) do
insert(ranges, {v, j % 2 == 1 and 1 or -1})
end
end
sort(ranges, sort_ranges)
local ret, i = {}, 0
for _, range in ipairs(ranges) do
i = i + range[2]
if i == 0 and range[2] == -1 then -- close
insert(ret, range[1])
elseif i == 1 and range[2] == 1 then -- open
if ret[#ret] and range[1] <= ret[#ret] + 1 then
remove(ret) -- merge adjacent ranges
else
insert(ret, range[1])
end
end
end
return ret
end
-- Adds the `characters` key, which is determined by a script's `ranges` table.
local function process_ranges(sc)
local ranges, chars = sc.ranges, {}
for i = 2, #ranges, 2 do
if ranges[i] == ranges[i - 1] then
insert(chars, u(ranges[i]))
else
insert(chars, u(ranges[i - 1]))
if ranges[i] > ranges[i - 1] + 1 then
insert(chars, "-")
end
insert(chars, u(ranges[i]))
end
end
sc.characters = concat(chars)
ranges.n = #ranges
return sc
end
local function handle_normalization_fixes(fixes)
local combiningClasses = fixes.combiningClasses
if combiningClasses then
local chars, i = {}, 0
for char in next, combiningClasses do
i = i + 1
chars[i] = char
end
fixes.combiningClassCharacters = concat(chars)
end
return fixes
end
------------------------------------------------------------------------------------
--
-- Data
--
------------------------------------------------------------------------------------
local m = {}
m["Adlm"] = process_ranges{
"Adlam",
19606346,
"alfabet",
ranges = {
0x061F, 0x061F,
0x0640, 0x0640,
0x1E900, 0x1E94B,
0x1E950, 0x1E959,
0x1E95E, 0x1E95F,
},
capitalized = true,
direction = "rtl",
}
m["Afak"] = {
"Afaka",
382019,
"sukukataan",
-- Not in Unicode
}
m["Aghb"] = process_ranges{
"Albania Kaukasus",
2495716,
"alfabet",
ranges = {
0x10530, 0x10563,
0x1056F, 0x1056F,
},
}
m["Ahom"] = process_ranges{
"Ahom",
2839633,
"abugida",
ranges = {
0x11700, 0x1171A,
0x1171D, 0x1172B,
0x11730, 0x11746,
},
}
m["Arab"] = process_ranges{
"Arab",
1828555,
"abjad", -- more precisely, impure abjad
varieties = {"Jawi", "Perso-Arabic", "Sulat Sūg"},
ranges = {
0x0600, 0x06FF,
0x0750, 0x077F,
0x0870, 0x088E,
0x0890, 0x0891,
0x0897, 0x08E1,
0x08E3, 0x08FF,
0xFB50, 0xFBC2,
0xFBD3, 0xFD8F,
0xFD92, 0xFDC7,
0xFDCF, 0xFDCF,
0xFDF0, 0xFDFF,
0xFE70, 0xFE74,
0xFE76, 0xFEFC,
0x102E0, 0x102FB,
0x10E60, 0x10E7E,
0x10EC2, 0x10EC4,
0x10EFC, 0x10EFF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
direction = "rtl",
normalizationFixes = handle_normalization_fixes{
from = {"ٳ"},
to = {"اٟ"}
},
}
m["Aran"] = {
{
hnd = "Shahmukhi", -- Southern Hindko
hno = "Shahmukhi", -- Northern Hindko
["inc-opa"] = "Shahmukhi", -- Old Punjabi
lah = "Shahmukhi", -- Lahnda
pa = "Shahmukhi", -- Punjabi
phr = "Shahmukhi", -- Pahari-Potwari
skr = "Shahmukhi", -- Saraiki
default = "Arab",
},
1133121, -- FIXME: 133800 for Shahmukhi
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
aliases = {"Nastaliq", "Nastaleeq"},
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["Armi"] = process_ranges{
"Aram Empayar",
26978,
"abjad",
ranges = {
0x10840, 0x10855,
0x10857, 0x1085F,
},
direction = "rtl",
}
m["Armn"] = process_ranges{
"Armenia",
11932,
"alfabet",
ranges = {
0x0531, 0x0556,
0x0559, 0x058A,
0x058D, 0x058F,
0xFB13, 0xFB17,
},
capitalized = true,
translit = "Armn-translit",
}
m["Avst"] = process_ranges{
"Avesta",
790681,
"alfabet",
ranges = {
0x10B00, 0x10B35,
0x10B39, 0x10B3F,
},
direction = "rtl",
}
m["pal-Avst"] = {
"Pazend",
4925073,
m["Avst"][3],
ranges = m["Avst"].ranges,
characters = m["Avst"].characters,
direction = "rtl",
parent = "Avst",
}
m["Bali"] = process_ranges{
"Bali",
804984,
"abugida",
ranges = {
0x1B00, 0x1B4C,
0x1B4E, 0x1B7F,
},
}
m["Bamu"] = process_ranges{
"Bamum",
806024,
"sukukataan",
ranges = {
0xA6A0, 0xA6F7,
0x16800, 0x16A38,
},
}
m["Bass"] = process_ranges{
"Bassa",
810458,
"alfabet",
aliases = {"Bassa Vah", "Vah"},
ranges = {
0x16AD0, 0x16AED,
0x16AF0, 0x16AF5,
},
}
m["Batk"] = process_ranges{
"Batak",
51592,
"abugida",
ranges = {
0x1BC0, 0x1BF3,
0x1BFC, 0x1BFF,
},
}
m["Beng"] = process_ranges{
"Bengali",
756802,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09B0,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09EF,
0x09F2, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = handle_normalization_fixes{
from = {"অা", "ঋৃ", "ঌৢ"},
to = {"আ", "ৠ", "ৡ"}
},
}
m["as-Beng"] = process_ranges{
"Assam",
191272,
m["Beng"][3],
other_names = {"Eastern Nagari"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09AF,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = m["Beng"].normalizationFixes,
}
m["Bhks"] = process_ranges{
"Bhaiksuki",
17017839,
"abugida",
ranges = {
0x11C00, 0x11C08,
0x11C0A, 0x11C36,
0x11C38, 0x11C45,
0x11C50, 0x11C6C,
},
}
m["Blis"] = {
"Blissymbolic",
609817,
"logogram",
aliases = {"Blissymbols"},
-- Not in Unicode
}
m["Bopo"] = process_ranges{
"Zhuyin",
198269,
"sukukataan separa",
aliases = {"Zhuyin Fuhao", "Bopomofo"},
ranges = {
0x02EA, 0x02EB,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302A, 0x302D,
0x3030, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3105, 0x312F,
0x31A0, 0x31BF,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
},
}
m["Brah"] = process_ranges{
"Brahmi",
185083,
"abugida",
ranges = {
0x11000, 0x1104D,
0x11052, 0x11075,
0x1107F, 0x1107F,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑀅𑀸", "𑀋𑀾", "𑀏𑁂"},
to = {"𑀆", "𑀌", "𑀐"}
},
translit = "Brah-translit",
}
m["Brai"] = process_ranges{
"Braille",
79894,
"alfabet",
ranges = {
0x2800, 0x28FF,
},
}
m["Bugi"] = process_ranges{
"Lontara",
1074947,
"abugida",
aliases = {"Buginese"},
ranges = {
0x1A00, 0x1A1B,
0x1A1E, 0x1A1F,
0xA9CF, 0xA9CF,
},
}
m["Buhd"] = process_ranges{
"Buhid",
1002969,
"abugida",
ranges = {
0x1735, 0x1736,
0x1740, 0x1751,
0x1752, 0x1753,
},
}
m["Cakm"] = process_ranges{
"Chakma",
1059328,
"abugida",
ranges = {
0x09E6, 0x09EF,
0x1040, 0x1049,
0x11100, 0x11134,
0x11136, 0x11147,
},
}
m["Cans"] = process_ranges{
"Suku Kata Kanada",
2479183,
"abugida",
ranges = {
0x1400, 0x167F,
0x18B0, 0x18F5,
0x11AB0, 0x11ABF,
},
}
m["Cari"] = process_ranges{
"Carian",
1094567,
"alfabet",
ranges = {
0x102A0, 0x102D0,
},
}
m["Cham"] = process_ranges{
"Cham",
1060381,
"abugida",
ranges = {
0xAA00, 0xAA36,
0xAA40, 0xAA4D,
0xAA50, 0xAA59,
0xAA5C, 0xAA5F,
},
}
m["Cher"] = process_ranges{
"Cherokee",
26549,
"sukukataan",
ranges = {
0x13A0, 0x13F5,
0x13F8, 0x13FD,
0xAB70, 0xABBF,
},
}
m["Chis"] = {
"Chisoi",
123173777,
"abugida",
-- Not in Unicode
}
m["Chrs"] = process_ranges{
"Khwarezmian",
72386710,
"abjad",
aliases = {"Chorasmian"},
ranges = {
0x10FB0, 0x10FCB,
},
direction = "rtl",
}
m["Copt"] = process_ranges{
"Qibti",
321083,
"alfabet",
ranges = {
0x03E2, 0x03EF,
0x2C80, 0x2CF3,
0x2CF9, 0x2CFF,
0x102E0, 0x102FB,
},
capitalized = true,
}
m["Cpmn"] = process_ranges{
"Cypro-Minoan",
1751985,
"sukukataan",
aliases = {"Cypro Minoan"},
ranges = {
0x10100, 0x10101,
0x12F90, 0x12FF2,
},
}
m["Cprt"] = process_ranges{
"Cyprus",
1757689,
"sukukataan",
ranges = {
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080A, 0x10835,
0x10837, 0x10838,
0x1083C, 0x1083C,
0x1083F, 0x1083F,
},
direction = "rtl",
}
m["Cyrl"] = process_ranges{
"Cyril",
8209,
"alfabet",
ranges = {
0x0400, 0x052F,
0x1C80, 0x1C8A,
0x1D2B, 0x1D2B,
0x1D78, 0x1D78,
0x1DF8, 0x1DF8,
0x2DE0, 0x2DFF,
0x2E43, 0x2E43,
0xA640, 0xA69F,
0xFE2E, 0xFE2F,
0x1E030, 0x1E06D,
0x1E08F, 0x1E08F,
},
capitalized = true,
}
m["Cyrs"] = {
"Cyril Kuno",
442244,
m["Cyrl"][3],
aliases = {"Early Cyrillic"},
ranges = m["Cyrl"].ranges,
characters = m["Cyrl"].characters,
capitalized = m["Cyrl"].capitalized,
wikipedia_article = "Early Cyrillic alphabet",
normalizationFixes = handle_normalization_fixes{
from = {"Ѹ", "ѹ"},
to = {"Ꙋ", "ꙋ"}
},
strip_diacritics = {remove_diacritics = cs.Cyrs_remove_diacritics},
sort_key = {
remove_diacritics = cs.Cyrs_remove_diacritics,
from = {
"ї", "оу", -- 2 chars
"[ґꙣєѕꙃꙅꙁіꙇђꙉѻꙩꙫꙭꙮꚙꚛꙋѡѿꙍѽꙑѣꙗѥꙕѧꙙѩꙝꙛѫѭѯѱѳѵҁ]"
},
to = {
"и" .. p[1], "у", {
["ґ"] = "г" .. p[1], ["ꙣ"] = "д" .. p[1], ["є"] = "е", ["ѕ"] = "ж" .. p[1], ["ꙃ"] = "ж" .. p[1],
["ꙅ"] = "ж" .. p[1], ["ꙁ"] = "з", ["і"] = "и" .. p[1], ["ꙇ"] = "и" .. p[1], ["ђ"] = "и" .. p[2],
["ꙉ"] = "и" .. p[2], ["ѻ"] = "о", ["ꙩ"] = "о", ["ꙫ"] = "о", ["ꙭ"] = "о",
["ꙮ"] = "о", ["ꚙ"] = "о", ["ꚛ"] = "о", ["ꙋ"] = "у", ["ѡ"] = "х" .. p[1],
["ѿ"] = "х" .. p[1], ["ꙍ"] = "х" .. p[1], ["ѽ"] = "х" .. p[1], ["ꙑ"] = "ы", ["ѣ"] = "ь" .. p[1],
["ꙗ"] = "ь" .. p[2], ["ѥ"] = "ь" .. p[3], ["ꙕ"] = "ю", ["ѧ"] = "я", ["ꙙ"] = "я",
["ѩ"] = "я" .. p[1], ["ꙝ"] = "я" .. p[1], ["ꙛ"] = "я" .. p[2], ["ѫ"] = "я" .. p[3], ["ѭ"] = "я" .. p[4],
["ѯ"] = "я" .. p[5], ["ѱ"] = "я" .. p[6], ["ѳ"] = "я" .. p[7], ["ѵ"] = "я" .. p[8], ["ҁ"] = "я" .. p[9],
}
},
}
}
m["Deva"] = process_ranges{
{
ahr = "Balbodh", -- Ahirani
kfq = "Balbodh", -- Korku
kok = "Balbodh", -- Konkani
mr = "Balbodh", -- Marathi
omr = "Balbodh", -- Old Marathi
vah = "Balbodh", -- Varhadi
default = "Devanagari",
},
38592, -- FIXME: 16948817 for Balbodh
"abugida",
ranges = {
0x0900, 0x097F,
0x1CD0, 0x1CF6,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0xA830, 0xA839,
0xA8E0, 0xA8FF,
0x11B00, 0x11B09,
},
normalizationFixes = handle_normalization_fixes{
from = {"ॆॆ", "ेे", "ाॅ", "ाॆ", "ाꣿ", "ॊॆ", "ाे", "ाै", "ोे", "ाऺ", "ॖॖ", "अॅ", "अॆ", "अा", "एॅ", "एॆ", "एे", "एꣿ", "ऎॆ", "अॉ", "आॅ", "अॊ", "आॆ", "अो", "आे", "अौ", "आै", "ओे", "अऺ", "अऻ", "आऺ", "अाꣿ", "आꣿ", "ऒॆ", "अॖ", "अॗ", "ॶॖ", "्?ा"},
to = {"ꣿ", "ै", "ॉ", "ॊ", "ॏ", "ॏ", "ो", "ौ", "ौ", "ऻ", "ॗ", "ॲ", "ऄ", "आ", "ऍ", "ऎ", "ऐ", "ꣾ", "ꣾ", "ऑ", "ऑ", "ऒ", "ऒ", "ओ", "ओ", "औ", "औ", "औ", "ॳ", "ॴ", "ॴ", "ॵ", "ॵ", "ॵ", "ॶ", "ॷ", "ॷ"}
},
}
m["Diak"] = process_ranges{
"Dhives Akuru",
3307073,
"abugida",
aliases = {"Dhivehi Akuru", "Dives Akuru", "Divehi Akuru"},
ranges = {
0x11900, 0x11906,
0x11909, 0x11909,
0x1190C, 0x11913,
0x11915, 0x11916,
0x11918, 0x11935,
0x11937, 0x11938,
0x1193B, 0x11946,
0x11950, 0x11959,
},
}
m["Dogr"] = process_ranges{
"Dogra",
72402987,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11800, 0x1183B,
},
}
m["Dsrt"] = process_ranges{
"Deseret",
1200582,
"alfabet",
ranges = {
0x10400, 0x1044F,
},
capitalized = true,
}
m["Dupl"] = process_ranges{
"Duployan",
5316025,
"alfabet",
ranges = {
0x1BC00, 0x1BC6A,
0x1BC70, 0x1BC7C,
0x1BC80, 0x1BC88,
0x1BC90, 0x1BC99,
0x1BC9C, 0x1BCA3,
},
}
m["Egyd"] = {
"Demotik",
188519,
"abjad, logogram",
-- Not in Unicode
}
m["Egyh"] = {
"Hieratik",
208111,
"abjad, logogram",
-- Unified with Egyptian hieroglyphic in Unicode
}
m["Egyp"] = process_ranges{
"Hieroglif Mesir",
132659,
"abjad, logogram",
ranges = {
0x13000, 0x13455,
0x13460, 0x143FA,
},
varieties = {"Hieratic"},
wikipedia_article = "Egyptian hieroglyphs",
normalizationFixes = handle_normalization_fixes{
from = {"𓃁", "𓆖"},
to = {"𓃀𓂝", "𓆓𓏏𓇿"}
},
}
m["Elba"] = process_ranges{
"Elbasan",
1036714,
"alfabet",
ranges = {
0x10500, 0x10527,
},
}
m["Elym"] = process_ranges{
"Elymaic",
60744423,
"abjad",
ranges = {
0x10FE0, 0x10FF6,
},
direction = "rtl",
}
m["Ethi"] = process_ranges{
"Habsyah",
257634,
"abugida",
aliases = {"Ge'ez", "Geʽez"},
ranges = {
0x1200, 0x1248,
0x124A, 0x124D,
0x1250, 0x1256,
0x1258, 0x1258,
0x125A, 0x125D,
0x1260, 0x1288,
0x128A, 0x128D,
0x1290, 0x12B0,
0x12B2, 0x12B5,
0x12B8, 0x12BE,
0x12C0, 0x12C0,
0x12C2, 0x12C5,
0x12C8, 0x12D6,
0x12D8, 0x1310,
0x1312, 0x1315,
0x1318, 0x135A,
0x135D, 0x137C,
0x1380, 0x1399,
0x2D80, 0x2D96,
0x2DA0, 0x2DA6,
0x2DA8, 0x2DAE,
0x2DB0, 0x2DB6,
0x2DB8, 0x2DBE,
0x2DC0, 0x2DC6,
0x2DC8, 0x2DCE,
0x2DD0, 0x2DD6,
0x2DD8, 0x2DDE,
0xAB01, 0xAB06,
0xAB09, 0xAB0E,
0xAB11, 0xAB16,
0xAB20, 0xAB26,
0xAB28, 0xAB2E,
0x1E7E0, 0x1E7E6,
0x1E7E8, 0x1E7EB,
0x1E7ED, 0x1E7EE,
0x1E7F0, 0x1E7FE,
},
sort_key = "Ethi-sortkey",
strip_diacritics = {remove_diacritics = u(0x135D) .. u(0x135E) .. u(0x135F)}
}
m["Gara"] = process_ranges{
"Garay",
3095302,
"alfabet",
capitalized = true,
direction = "rtl",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x10D40, 0x10D65,
0x10D69, 0x10D85,
0x10D8E, 0x10D8F,
},
}
m["Geok"] = process_ranges{
"Khutsuri",
1090055,
"alfabet",
ranges = { -- Ⴀ-Ⴭ is Asomtavruli, ⴀ-ⴭ is Nuskhuri
0x10A0, 0x10C5,
0x10C7, 0x10C7,
0x10CD, 0x10CD,
0x10FB, 0x10FB,
0x2D00, 0x2D25,
0x2D27, 0x2D27,
0x2D2D, 0x2D2D,
},
varieties = {"Nuskhuri", "Asomtavruli"},
capitalized = true,
translit = "Geok-translit",
}
m["Geor"] = process_ranges{
"Georgia",
3317411,
"alfabet",
ranges = { -- ა-ჿ is lowercase Mkhedruli; Ა-Ჿ is uppercase Mkhedruli (Mtavruli)
0x0589, 0x0589,
0x10D0, 0x10FF,
0x1C90, 0x1CBA,
0x1CBD, 0x1CBF,
},
varieties = {"Mkhedruli", "Mtavruli"},
capitalized = true,
translit = "Geor-translit",
}
m["Glag"] = process_ranges{
"Glagol",
145625,
"alfabet",
ranges = {
0x0484, 0x0484,
0x0487, 0x0487,
0x0589, 0x0589,
0x10FB, 0x10FB,
0x2C00, 0x2C5F,
0x2E43, 0x2E43,
0xA66F, 0xA66F,
0x1E000, 0x1E006,
0x1E008, 0x1E018,
0x1E01B, 0x1E021,
0x1E023, 0x1E024,
0x1E026, 0x1E02A,
},
capitalized = true,
}
m["Gong"] = process_ranges{
"Gunjala Gondi",
18125340,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D60, 0x11D65,
0x11D67, 0x11D68,
0x11D6A, 0x11D8E,
0x11D90, 0x11D91,
0x11D93, 0x11D98,
0x11DA0, 0x11DA9,
},
}
m["Gonm"] = process_ranges{
"Masaram Gondi",
16977603,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D00, 0x11D06,
0x11D08, 0x11D09,
0x11D0B, 0x11D36,
0x11D3A, 0x11D3A,
0x11D3C, 0x11D3D,
0x11D3F, 0x11D47,
0x11D50, 0x11D59,
},
}
m["Goth"] = process_ranges{
"Goth",
467784,
"alfabet",
ranges = {
0x10330, 0x1034A,
},
wikipedia_article = "Gothic alphabet",
}
m["Gran"] = process_ranges{
"Grantha",
1119274,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0BE6, 0x0BF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CF2, 0x1CF4,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0x11300, 0x11303,
0x11305, 0x1130C,
0x1130F, 0x11310,
0x11313, 0x11328,
0x1132A, 0x11330,
0x11332, 0x11333,
0x11335, 0x11339,
0x1133B, 0x11344,
0x11347, 0x11348,
0x1134B, 0x1134D,
0x11350, 0x11350,
0x11357, 0x11357,
0x1135D, 0x11363,
0x11366, 0x1136C,
0x11370, 0x11374,
0x11FD0, 0x11FD1,
0x11FD3, 0x11FD3,
},
}
m["Grek"] = process_ranges{
"Yunani",
8216,
"alfabet",
ranges = {
0x0341, 0x0341,
0x0374, 0x0375,
0x037E, 0x037E,
0x0384, 0x038A,
0x038C, 0x038C,
0x038E, 0x03A1,
0x03A3, 0x03D7,
0x03DA, 0x03DB,
0x03DE, 0x03E1,
0x03F0, 0x03F1,
0x03F4, 0x03F4,
0x03FC, 0x03FC,
0x1D26, 0x1D2A,
0x1D5D, 0x1D61,
0x1D66, 0x1D6A,
0x1DBF, 0x1DBF,
0x2126, 0x2127,
0x2129, 0x2129,
0x213C, 0x2140,
0xAB65, 0xAB65,
0x10140, 0x1018E,
0x101A0, 0x101A0,
0x1D200, 0x1D245,
},
capitalized = true,
display_text = "Grek-common",
strip_diacritics = "Grek-common",
sort_key = {
remove_diacritics = "'ʼ;·`¨´῀" .. c.grave .. c.acute .. c.diaer .. c.caron .. c.turnedcommaabove .. c.commaabove .. c.revcommaabove .. c.macron .. c.breve .. c.diaerbelow .. c.brevebelow .. c.perispomeni .. c.ypogegrammeni .. c.RSQuo .. c.prime .. c.keraia .. c.lowerkeraia .. c.tonos .. c.coronis .. c.psili .. c.dasia,
from = {"ϝ", "ͷ", "ϛ", "ͱ", "ͺ", "ϳ", "ϻ", "[ϟϙ]", "[ςϲ]", "ͳ"},
to = {"ε" .. p[1], "ε" .. p[2], "ε" .. p[3], "ζ" .. p[1], "ι", "ι" .. p[1], "π" .. p[1], "π" .. p[2], "σ", "ϡ"},
},
}
m["Polyt"] = process_ranges{
"Yunani",
1475332,
m["Grek"][3],
ranges = union(m["Grek"].ranges, {
0x0340, 0x0340,
0x0342, 0x0345,
0x0370, 0x0373,
0x0376, 0x0377,
0x037A, 0x037D,
0x037F, 0x037F,
0x03D8, 0x03D9,
0x03DC, 0x03DD,
0x03F2, 0x03F3,
0x03F5, 0x03FB,
0x03FD, 0x03FF,
0x1F00, 0x1F15,
0x1F18, 0x1F1D,
0x1F20, 0x1F45,
0x1F48, 0x1F4D,
0x1F50, 0x1F57,
0x1F59, 0x1F59,
0x1F5B, 0x1F5B,
0x1F5D, 0x1F5D,
0x1F5F, 0x1F7D,
0x1F80, 0x1FB4,
0x1FB6, 0x1FC4,
0x1FC6, 0x1FD3,
0x1FD6, 0x1FDB,
0x1FDD, 0x1FEF,
0x1FF2, 0x1FF4,
0x1FF6, 0x1FFE,
}),
ietf_subtag = "Grek",
capitalized = m["Grek"].capitalized,
parent = "Grek",
display_text = m["Grek"].display_text,
strip_diacritics = "Polyt-stripdiacritics",
sort_key = m["Grek"].sort_key,
translit = "grc-translit",
}
m["Gujr"] = process_ranges{
"Gujarati",
733944,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A81, 0x0A83,
0x0A85, 0x0A8D,
0x0A8F, 0x0A91,
0x0A93, 0x0AA8,
0x0AAA, 0x0AB0,
0x0AB2, 0x0AB3,
0x0AB5, 0x0AB9,
0x0ABC, 0x0AC5,
0x0AC7, 0x0AC9,
0x0ACB, 0x0ACD,
0x0AD0, 0x0AD0,
0x0AE0, 0x0AE3,
0x0AE6, 0x0AF1,
0x0AF9, 0x0AFF,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ઓ", "અાૈ", "અા", "અૅ", "અે", "અૈ", "અૉ", "અો", "અૌ", "આૅ", "આૈ", "ૅા"},
to = {"અાૅ", "ઔ", "આ", "ઍ", "એ", "ઐ", "ઑ", "ઓ", "ઔ", "ઓ", "ઔ", "ૉ"}
},
}
m["Gukh"] = process_ranges{
"Khema",
110064239,
"abugida",
aliases = {"Gurung Khema", "Khema Phri", "Khema Lipi"},
ranges = {
0x0965, 0x0965,
0x16100, 0x16139,
},
}
m["Guru"] = process_ranges{
"Gurmukhi",
689894,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A01, 0x0A03,
0x0A05, 0x0A0A,
0x0A0F, 0x0A10,
0x0A13, 0x0A28,
0x0A2A, 0x0A30,
0x0A32, 0x0A33,
0x0A35, 0x0A36,
0x0A38, 0x0A39,
0x0A3C, 0x0A3C,
0x0A3E, 0x0A42,
0x0A47, 0x0A48,
0x0A4B, 0x0A4D,
0x0A51, 0x0A51,
0x0A59, 0x0A5C,
0x0A5E, 0x0A5E,
0x0A66, 0x0A76,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ਅਾ", "ਅੈ", "ਅੌ", "ੲਿ", "ੲੀ", "ੲੇ", "ੳੁ", "ੳੂ", "ੳੋ"},
to = {"ਆ", "ਐ", "ਔ", "ਇ", "ਈ", "ਏ", "ਉ", "ਊ", "ਓ"}
},
}
m["Hang"] = process_ranges{
"Hangul",
8222,
"sukukataan",
aliases = {"Hangeul"},
ranges = {
0x1100, 0x11FF,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302E, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3131, 0x318E,
0x3200, 0x321E,
0x3260, 0x327E,
0xA960, 0xA97C,
0xAC00, 0xD7A3,
0xD7B0, 0xD7C6,
0xD7CB, 0xD7FB,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFFA0, 0xFFBE,
0xFFC2, 0xFFC7,
0xFFCA, 0xFFCF,
0xFFD2, 0xFFD7,
0xFFDA, 0xFFDC,
},
}
m["Hani"] = process_ranges{
"Han",
8201,
"logogram",
ranges = {
0x2E80, 0x2E99,
0x2E9B, 0x2EF3,
0x2F00, 0x2FD5,
0x2FF0, 0x2FFF,
0x3001, 0x3003,
0x3005, 0x3011,
0x3013, 0x301F,
0x3021, 0x302D,
0x3030, 0x3030,
0x3037, 0x303F,
0x3190, 0x319F,
0x31C0, 0x31E5,
0x31EF, 0x31EF,
0x3220, 0x3247,
0x3280, 0x32B0,
0x32C0, 0x32CB,
0x30FB, 0x30FB,
0x32FF, 0x32FF,
0x3358, 0x3370,
0x337B, 0x337F,
0x33E0, 0x33FE,
0x3400, 0x4DBF,
0x4E00, 0x9FFF,
0xA700, 0xA707,
0xF900, 0xFA6D,
0xFA70, 0xFAD9,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0x16FE2, 0x16FE3,
0x16FF0, 0x16FF1,
0x1D360, 0x1D371,
0x1F250, 0x1F251,
0x20000, 0x2A6DF,
0x2A700, 0x2B739,
0x2B740, 0x2B81D,
0x2B820, 0x2CEA1,
0x2CEB0, 0x2EBE0,
0x2EBF0, 0x2EE5D,
0x2F800, 0x2FA1D,
0x30000, 0x3134A,
0x31350, 0x3347F,
},
varieties = {"Hanzi", "Kanji", "Hanja", "Chu Nom"},
spaces = false,
}
m["Hans"] = {
"Han Ringkas",
185614,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hant"] = {
"Han Tradisional",
178528,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hano"] = process_ranges{
"Hanunoo",
1584045,
"abugida",
aliases = {"Hanunó'o", "Hanuno'o"},
ranges = {
0x1720, 0x1736,
},
}
m["Hatr"] = process_ranges{
"Hatran",
20813038,
"abjad",
ranges = {
0x108E0, 0x108F2,
0x108F4, 0x108F5,
0x108FB, 0x108FF,
},
direction = "rtl",
}
m["Hebr"] = process_ranges{
"Ibrani",
33513,
"abjad", -- more precisely, impure abjad
ranges = {
0x0591, 0x05C7,
0x05D0, 0x05EA,
0x05EF, 0x05F4,
0x2135, 0x2138,
0xFB1D, 0xFB36,
0xFB38, 0xFB3C,
0xFB3E, 0xFB3E,
0xFB40, 0xFB41,
0xFB43, 0xFB44,
0xFB46, 0xFB4F,
},
direction = "rtl",
display_text = "Hebr-common",
sort_key = "Hebr-common",
strip_diacritics = "Hebr-common",
}
m["Hira"] = process_ranges{
"Hiragana",
48332,
"sukukataan",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3041, 0x3096,
0x3099, 0x30A0,
0x30FB, 0x30FC,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFF70, 0xFF70,
0xFF9E, 0xFF9F,
0x1B001, 0x1B11F,
0x1B132, 0x1B132,
0x1B150, 0x1B152,
0x1F200, 0x1F200,
},
varieties = {"Hentaigana"},
spaces = false,
}
m["Hluw"] = process_ranges{
"Hieroglif Anatolia",
521323,
"logogram, sukukataan",
ranges = {
0x14400, 0x14646,
},
wikipedia_article = "Anatolian hieroglyphs",
}
m["Hmng"] = process_ranges{
"Pahawh Hmong",
365954,
"sukukataan separa",
aliases = {"Hmong"},
ranges = {
0x16B00, 0x16B45,
0x16B50, 0x16B59,
0x16B5B, 0x16B61,
0x16B63, 0x16B77,
0x16B7D, 0x16B8F,
},
}
m["Hmnp"] = process_ranges{
"Nyiakeng Puachue Hmong",
33712499,
"alfabet",
ranges = {
0x1E100, 0x1E12C,
0x1E130, 0x1E13D,
0x1E140, 0x1E149,
0x1E14E, 0x1E14F,
},
}
m["Hung"] = process_ranges{
"Hungary Kuno",
446224,
"alfabet",
aliases = {"Hungarian runic"},
ranges = {
0x10C80, 0x10CB2,
0x10CC0, 0x10CF2,
0x10CFA, 0x10CFF,
},
capitalized = true,
direction = "rtl",
}
m["Ibrnn"] = {
"Iberia Timur Laut",
1113155,
"sukukataan separa",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Ibrns"] = {
"Iberia Tenggara",
2305351,
"sukukataan separa",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Image"] = {
-- To be used to avoid any formatting or link processing
"Kemasan Imej",
478798,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Inds"] = {
"Indus",
601388,
aliases = {"Harappan", "Indus Valley"},
}
m["Ipach"] = {
"Abjad Fonetik Antarabangsa",
21204,
aliases = {"IPA"},
ietf_subtag = "Latn",
}
m["Ital"] = process_ranges{
"Italik Kuno",
4891256,
"alfabet",
ranges = {
0x10300, 0x10323,
0x1032D, 0x1032F,
},
translit = "Ital-translit",
}
m["Java"] = process_ranges{
"Jawa",
879704,
"abugida",
ranges = {
0xA980, 0xA9CD,
0xA9CF, 0xA9D9,
0xA9DE, 0xA9DF,
},
}
m["Jurc"] = {
"Jurchen",
912240,
"logogram",
spaces = false,
}
m["Kali"] = process_ranges{
"Kayah Li",
4919239,
"abugida",
ranges = {
0xA900, 0xA92F,
},
}
m["Kana"] = process_ranges{
"Katakana",
82946,
"sukukataan",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3099, 0x309C,
0x30A0, 0x30FF,
0x31F0, 0x31FF,
0x32D0, 0x32FE,
0x3300, 0x3357,
0xFE45, 0xFE46,
0xFF61, 0xFF9F,
0x1AFF0, 0x1AFF3,
0x1AFF5, 0x1AFFB,
0x1AFFD, 0x1AFFE,
0x1B000, 0x1B000,
0x1B120, 0x1B122,
0x1B155, 0x1B155,
0x1B164, 0x1B167,
},
spaces = false,
}
m["Kawi"] = process_ranges{
"Kawi",
975802,
"abugida",
ranges = {
0x11F00, 0x11F10,
0x11F12, 0x11F3A,
0x11F3E, 0x11F5A,
},
}
m["Khar"] = process_ranges{
"Kharoshthi",
1161266,
"abugida",
ranges = {
0x10A00, 0x10A03,
0x10A05, 0x10A06,
0x10A0C, 0x10A13,
0x10A15, 0x10A17,
0x10A19, 0x10A35,
0x10A38, 0x10A3A,
0x10A3F, 0x10A48,
0x10A50, 0x10A58,
},
direction = "rtl",
}
m["Khmr"] = process_ranges{
"Khmer",
1054190,
"abugida",
ranges = {
0x1780, 0x17DD,
0x17E0, 0x17E9,
0x17F0, 0x17F9,
0x19E0, 0x19FF,
},
spaces = false,
normalizationFixes = handle_normalization_fixes{
from = {"ឣ", "ឤ"},
to = {"អ", "អា"}
},
}
m["Khoj"] = process_ranges{
"Khojki",
1740656,
"abugida",
ranges = {
0x0AE6, 0x0AEF,
0xA830, 0xA839,
0x11200, 0x11211,
0x11213, 0x11241,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑈀𑈬𑈱", "𑈀𑈬", "𑈀𑈱", "𑈀𑈳", "𑈁𑈱", "𑈆𑈬", "𑈬𑈰", "𑈬𑈱", "𑉀𑈮"},
to = {"𑈇", "𑈁", "𑈅", "𑈇", "𑈇", "𑈃", "𑈲", "𑈳", "𑈂"}
},
}
m["Khomt"] = {
"Thai Khom",
13023788,
"abugida",
-- Not in Unicode
}
m["Kitl"] = {
"Khitan Besar",
6401797,
"logogram",
spaces = false,
}
m["Kits"] = process_ranges{
"Khitan Kecil",
6401800,
"logogram, sukukataan",
ranges = {
0x16FE4, 0x16FE4,
0x18B00, 0x18CD5,
0x18CFF, 0x18CFF,
},
spaces = false,
}
m["Knda"] = process_ranges{
"Kannada",
839666,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C80, 0x0C8C,
0x0C8E, 0x0C90,
0x0C92, 0x0CA8,
0x0CAA, 0x0CB3,
0x0CB5, 0x0CB9,
0x0CBC, 0x0CC4,
0x0CC6, 0x0CC8,
0x0CCA, 0x0CCD,
0x0CD5, 0x0CD6,
0x0CDD, 0x0CDE,
0x0CE0, 0x0CE3,
0x0CE6, 0x0CEF,
0x0CF1, 0x0CF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA830, 0xA835,
},
normalizationFixes = handle_normalization_fixes{
from = {"ಉಾ", "ಋಾ", "ಒೌ"},
to = {"ಊ", "ೠ", "ಔ"}
},
translit = "kn-translit",
}
m["Kpel"] = {
"Kpelle",
1586299,
"sukukataan",
-- Not in Unicode
}
m["Krai"] = process_ranges{
"Kirat Rai",
123173834,
"abugida",
aliases = {"Rai", "Khambu Rai", "Rai Barṇamālā", "Kirat Khambu Rai"},
ranges = {
0x16D40, 0x16D79,
},
}
m["Kthi"] = process_ranges{
"Kaithi",
1253814,
"abugida",
ranges = {
0x0966, 0x096F,
0xA830, 0xA839,
0x11080, 0x110C2,
0x110CD, 0x110CD,
},
}
m["Kulit"] = {
"Kulitan",
6443044,
"abugida",
-- Not in Unicode
}
m["Lana"] = process_ranges{
"Tai Tham",
1314503,
"abugida",
aliases = {"Tham", "Tua Mueang", "Lanna"},
ranges = {
0x1A20, 0x1A5E,
0x1A60, 0x1A7C,
0x1A7F, 0x1A89,
0x1A90, 0x1A99,
0x1AA0, 0x1AAD,
},
spaces = false,
}
m["Laoo"] = process_ranges{
"Lao",
1815229,
"abugida",
ranges = {
0x0E81, 0x0E82,
0x0E84, 0x0E84,
0x0E86, 0x0E8A,
0x0E8C, 0x0EA3,
0x0EA5, 0x0EA5,
0x0EA7, 0x0EBD,
0x0EC0, 0x0EC4,
0x0EC6, 0x0EC6,
0x0EC8, 0x0ECE,
0x0ED0, 0x0ED9,
0x0EDC, 0x0EDF,
},
spaces = false,
}
m["Latn"] = process_ranges{
"Latin",
8229,
"alfabet",
aliases = {"Roman"},
ranges = {
0x0041, 0x005A,
0x0061, 0x007A,
0x00AA, 0x00AA,
0x00BA, 0x00BA,
0x00C0, 0x00D6,
0x00D8, 0x00F6,
0x00F8, 0x02B8,
0x02C0, 0x02C1,
0x02E0, 0x02E4,
0x0363, 0x036F,
0x0485, 0x0486,
0x0951, 0x0952,
0x10FB, 0x10FB,
0x1D00, 0x1D25,
0x1D2C, 0x1D5C,
0x1D62, 0x1D65,
0x1D6B, 0x1D77,
0x1D79, 0x1DBE,
0x1DF8, 0x1DF8,
0x1E00, 0x1EFF,
0x202F, 0x202F,
0x2071, 0x2071,
0x207F, 0x207F,
0x2090, 0x209C,
0x20F0, 0x20F0,
0x2100, 0x2125,
0x2128, 0x2128,
0x212A, 0x2134,
0x2139, 0x213B,
0x2141, 0x214E,
0x2160, 0x2188,
0x2C60, 0x2C7F,
0xA700, 0xA707,
0xA722, 0xA787,
0xA78B, 0xA7CD,
0xA7D0, 0xA7D1,
0xA7D3, 0xA7D3,
0xA7D5, 0xA7DC,
0xA7F2, 0xA7FF,
0xA92E, 0xA92E,
0xAB30, 0xAB5A,
0xAB5C, 0xAB64,
0xAB66, 0xAB69,
0xFB00, 0xFB06,
0xFF21, 0xFF3A,
0xFF41, 0xFF5A,
0x10780, 0x10785,
0x10787, 0x107B0,
0x107B2, 0x107BA,
0x1DF00, 0x1DF1E,
0x1DF25, 0x1DF2A,
},
varieties = {"Rumi", "Romaji", "Rōmaji", "Romaja"},
capitalized = true,
translit = false,
}
m["Latf"] = {
"Fraktur",
148443,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
other_names = {"Blackletter"}, -- Blackletter is actually the parent "script"
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Latg"] = {
"Gaelia",
1432616,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
other_names = {"Irish"},
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["pjt-Latn"] = {
"Latin",
nil,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Leke"] = {
"Leke",
19572613,
"abugida",
-- Not in Unicode
}
m["Lepc"] = process_ranges{
"Lepcha",
1481626,
"abugida",
aliases = {"Róng"},
ranges = {
0x1C00, 0x1C37,
0x1C3B, 0x1C49,
0x1C4D, 0x1C4F,
},
}
m["Limb"] = process_ranges{
"Limbu",
933796,
"abugida",
ranges = {
0x0965, 0x0965,
0x1900, 0x191E,
0x1920, 0x192B,
0x1930, 0x193B,
0x1940, 0x1940,
0x1944, 0x194F,
},
}
m["Lina"] = process_ranges{
"Linear A",
30972,
ranges = {
0x10107, 0x10133,
0x10600, 0x10736,
0x10740, 0x10755,
0x10760, 0x10767,
},
}
m["Linb"] = process_ranges{
"Linear B",
190102,
ranges = {
0x10000, 0x1000B,
0x1000D, 0x10026,
0x10028, 0x1003A,
0x1003C, 0x1003D,
0x1003F, 0x1004D,
0x10050, 0x1005D,
0x10080, 0x100FA,
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
},
}
m["Lisu"] = process_ranges{
"Fraser",
1194621,
"alfabet",
aliases = {"Old Lisu", "Lisu"},
ranges = {
0x300A, 0x300B,
0xA4D0, 0xA4FF,
0x11FB0, 0x11FB0,
},
normalizationFixes = handle_normalization_fixes{
from = {"['’]", "[.ꓸ][.ꓸ]", "[.ꓸ][,ꓹ]"},
to = {"ʼ", "ꓺ", "ꓻ"}
},
translit = "Lisu-translit",
sort_key = {
from = {"𑾰"},
to = {"ꓬ" .. p[1]}
},
}
m["Loma"] = {
"Loma",
13023816,
"sukukataan",
-- Not in Unicode
}
m["Lyci"] = process_ranges{
"Lycia",
913587,
"alfabet",
ranges = {
0x10280, 0x1029C,
},
}
m["Lydi"] = process_ranges{
"Lydia",
4261300,
"alfabet",
ranges = {
0x10920, 0x10939,
0x1093F, 0x1093F,
},
direction = "rtl",
}
m["Mahj"] = process_ranges{
"Mahajani",
6732850,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11150, 0x11176,
},
}
m["Maka"] = process_ranges{
"Makassar",
72947229,
"abugida",
aliases = {"Old Makasar"},
ranges = {
0x11EE0, 0x11EF8,
},
}
m["Mand"] = process_ranges{
"Mandaia",
1812130,
aliases = {"Mandaean"},
ranges = {
0x0640, 0x0640,
0x0840, 0x085B,
0x085E, 0x085E,
},
direction = "rtl",
}
m["Mani"] = process_ranges{
"Mani",
3544702,
"abjad",
ranges = {
0x0640, 0x0640,
0x10AC0, 0x10AE6,
0x10AEB, 0x10AF6,
},
direction = "rtl",
translit = "Mani-translit",
}
m["Marc"] = process_ranges{
"Marchen",
72403709,
"abugida",
ranges = {
0x11C70, 0x11C8F,
0x11C92, 0x11CA7,
0x11CA9, 0x11CB6,
},
}
m["Maya"] = process_ranges{
"Maya",
211248,
aliases = {"Maya hieroglyphic", "Mayan", "Mayan hieroglyphic"},
ranges = {
0x1D2E0, 0x1D2F3,
},
}
m["Medf"] = process_ranges{
"Medefaidrin",
1519764,
aliases = {"Oberi Okaime", "Oberi Ɔkaimɛ"},
ranges = {
0x16E40, 0x16E9A,
},
capitalized = true,
}
m["Mend"] = process_ranges{
"Mende",
951069,
aliases = {"Mende Kikakui"},
ranges = {
0x1E800, 0x1E8C4,
0x1E8C7, 0x1E8D6,
},
direction = "rtl",
}
m["Merc"] = process_ranges{
"Kursif Meroitik",
73028124,
"abugida",
ranges = {
0x109A0, 0x109B7,
0x109BC, 0x109CF,
0x109D2, 0x109FF,
},
direction = "rtl",
}
m["Mero"] = process_ranges{
"Hieroglif Meroitik",
73028623,
"abugida",
ranges = {
0x10980, 0x1099F,
},
direction = "rtl",
wikipedia_article = "Meroitic hieroglyphs",
}
m["Mlym"] = process_ranges{
"Malayalam",
1164129,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0D00, 0x0D0C,
0x0D0E, 0x0D10,
0x0D12, 0x0D44,
0x0D46, 0x0D48,
0x0D4A, 0x0D4F,
0x0D54, 0x0D63,
0x0D66, 0x0D7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0xA830, 0xA832,
},
normalizationFixes = handle_normalization_fixes{
from = {"ഇൗ", "ഉൗ", "എെ", "ഒാ", "ഒൗ", "ക്", "ണ്", "ന്റ", "ന്", "മ്", "യ്", "ര്", "ല്", "ള്", "ഴ്", "െെ", "ൻ്റ"},
to = {"ഈ", "ഊ", "ഐ", "ഓ", "ഔ", "ൿ", "ൺ", "ൻറ", "ൻ", "ൔ", "ൕ", "ർ", "ൽ", "ൾ", "ൖ", "ൈ", "ന്റ"}
},
translit = "ml-translit",
}
m["Modi"] = process_ranges{
"Modi",
1703713,
"abugida",
ranges = {
0xA830, 0xA839,
0x11600, 0x11644,
0x11650, 0x11659,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑘀𑘹", "𑘀𑘺", "𑘁𑘹", "𑘁𑘺"},
to = {"𑘊", "𑘋", "𑘌", "𑘍"}
},
}
do
local Mong_displaytext = {
from = {"([ᠨ-ᡂᡸ])ᠶ([ᠨ-ᡂᡸ])", "([ᠠ-ᡂᡸ])ᠸ([^᠋ᠠ-ᠧ])", "([ᠠ-ᡂᡸ])ᠸ$"},
to = {"%1ᠢ%2", "%1ᠧ%2", "%1ᠧ"}
}
m["Mong"] = process_ranges{
"Mongol",
1055705,
"alfabet",
aliases = {"Mongol bichig", "Hudum Mongol bichig"},
ranges = {
0x1800, 0x1805,
0x180A, 0x1819,
0x1820, 0x1842,
0x1878, 0x1878,
0x1880, 0x1897,
0x18A6, 0x18A6,
0x18A9, 0x18A9,
0x200C, 0x200D,
0x202F, 0x202F,
0x3001, 0x3002,
0x3008, 0x300B,
0x11660, 0x11668,
},
direction = "vertical-ltr",
display_text = Mong_displaytext,
strip_diacritics = Mong_displaytext,
translit = "Mong-translit",
}
m["mnc-Mong"] = process_ranges{
"Manchu",
122888,
m["Mong"][3],
ranges = {
0x1801, 0x1801,
0x1804, 0x1804,
0x1808, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x185D,
0x185F, 0x1861,
0x1864, 0x1869,
0x186C, 0x1871,
0x1873, 0x1877,
0x1880, 0x1888,
0x188F, 0x188F,
0x189A, 0x18A5,
0x18A8, 0x18A8,
0x18AA, 0x18AA,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "Mong",
translit = "mnc-translit",
}
m["sjo-Mong"] = process_ranges{
"Xibe",
113624153,
m["Mong"][3],
aliases = {"Sibe"},
ranges = {
0x1804, 0x1804,
0x1807, 0x1807,
0x180A, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x1828,
0x182A, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x1872,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "mnc-Mong",
}
m["xwo-Mong"] = process_ranges{
"Todo",
529085,
m["Mong"][3],
aliases = {"Todo", "Todo bichig"},
ranges = {
0x1800, 0x1801,
0x1804, 0x1806,
0x180A, 0x1820,
0x1828, 0x1828,
0x182F, 0x1831,
0x1834, 0x1834,
0x1837, 0x1838,
0x183A, 0x183B,
0x1840, 0x1840,
0x1843, 0x185C,
0x1880, 0x1887,
0x1889, 0x188F,
0x1894, 0x1894,
0x1896, 0x1899,
0x18A7, 0x18A7,
0x200C, 0x200D,
0x202F, 0x202F,
0x11669, 0x1166C,
},
direction = "vertical-ltr",
parent = "Mong",
translit = "xwo-translit",
}
end
m["Moon"] = {
"Moon",
918391,
"alfabet",
aliases = {"Moon System of Embossed Reading", "Moon type", "Moon writing", "Moon alphabet", "Moon code"},
-- Not in Unicode
}
m["Morse"] = {
"Kod Morse",
79897,
ietf_subtag = "Zsym",
}
m["Mroo"] = process_ranges{
"Mru",
75919253,
aliases = {"Mro", "Mrung"},
ranges = {
0x16A40, 0x16A5E,
0x16A60, 0x16A69,
0x16A6E, 0x16A6F,
},
}
m["Mtei"] = process_ranges{
"Meitei Mayek",
2981413,
"abugida",
aliases = {"Meetei Mayek", "Manipuri"},
ranges = {
0xAAE0, 0xAAF6,
0xABC0, 0xABED,
0xABF0, 0xABF9,
},
}
m["Mult"] = process_ranges{
"Multani",
17047906,
"abugida",
ranges = {
0x0A66, 0x0A6F,
0x11280, 0x11286,
0x11288, 0x11288,
0x1128A, 0x1128D,
0x1128F, 0x1129D,
0x1129F, 0x112A9,
},
}
m["Music"] = process_ranges{
"Notasi Muzik",
233861,
"piktogram",
ranges = {
0x2669, 0x266F,
0x1D100, 0x1D126,
0x1D129, 0x1D1EA,
},
ietf_subtag = "Zsym",
translit = false,
}
m["Mymr"] = process_ranges{
"Burma",
43887939,
"abugida",
aliases = {"Myanmar"},
ranges = {
0x1000, 0x109F,
0xA92E, 0xA92E,
0xA9E0, 0xA9FE,
0xAA60, 0xAA7F,
0x116D0, 0x116E3,
},
spaces = false,
}
m["Nagm"] = process_ranges{
"Mundari Bani",
106917274,
"alfabet",
aliases = {"Nag Mundari"},
ranges = {
0x1E4D0, 0x1E4F9,
},
}
m["Nand"] = process_ranges{
"Nandinagari",
6963324,
"abugida",
ranges = {
0x0964, 0x0965,
0x0CE6, 0x0CEF,
0x1CE9, 0x1CE9,
0x1CF2, 0x1CF2,
0x1CFA, 0x1CFA,
0xA830, 0xA835,
0x119A0, 0x119A7,
0x119AA, 0x119D7,
0x119DA, 0x119E4,
},
}
m["Narb"] = process_ranges{
"Arab Utara Kuno",
1472213,
"abjad",
aliases = {"Old North Arabian"},
ranges = {
0x10A80, 0x10A9F,
},
direction = "rtl",
translit = "Narb-translit",
}
m["Nbat"] = process_ranges{
"Nabataea",
855624,
"abjad",
aliases = {"Nabatean"},
ranges = {
0x10880, 0x1089E,
0x108A7, 0x108AF,
},
direction = "rtl",
}
m["Newa"] = process_ranges{
"Newa",
7237292,
"abugida",
aliases = {"Newar", "Newari", "Prachalit Nepal"},
ranges = {
0x11400, 0x1145B,
0x1145D, 0x11461,
},
}
m["Nkdb"] = {
"Dongba",
1190953,
"piktogram",
aliases = {"Naxi Dongba", "Nakhi Dongba", "Tomba", "Tompa", "Mo-so"},
spaces = false,
-- Not in Unicode
}
m["Nkgb"] = {
"Geba",
731189,
"sukukataan",
aliases = {"Nakhi Geba", "Naxi Geba"},
spaces = false,
-- Not in Unicode
}
m["Nkoo"] = process_ranges{
"N'Ko",
1062587,
"alfabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x07C0, 0x07FA,
0x07FD, 0x07FF,
0xFD3E, 0xFD3F,
},
direction = "rtl",
}
m["None"] = {
"tidak ditentukan",
nil,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Nshu"] = process_ranges{
"Nüshu",
56436,
"sukukataan",
aliases = {"Nushu"},
ranges = {
0x16FE1, 0x16FE1,
0x1B170, 0x1B2FB,
},
spaces = false,
}
m["Ogam"] = process_ranges{
"Ogham",
184661,
ranges = {
0x1680, 0x169C,
},
}
m["Olck"] = process_ranges{
"Ol Chiki",
201688,
aliases = {"Ol Chemetʼ", "Ol", "Santali"},
ranges = {
0x1C50, 0x1C7F,
},
}
m["Onao"] = process_ranges{
"Ol Onal",
108607084,
"alfabet",
ranges = {
0x0964, 0x0965,
0x1E5D0, 0x1E5FA,
0x1E5FF, 0x1E5FF,
},
}
m["Orkh"] = process_ranges{
"Turkik Kuno",
5058305,
aliases = {"Orkhon runic"},
ranges = {
0x10C00, 0x10C48,
},
direction = "rtl",
translit = "Orkh-translit",
}
m["Orya"] = process_ranges{
"Odia",
1760127,
"abugida",
aliases = {"Oriya"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B01, 0x0B03,
0x0B05, 0x0B0C,
0x0B0F, 0x0B10,
0x0B13, 0x0B28,
0x0B2A, 0x0B30,
0x0B32, 0x0B33,
0x0B35, 0x0B39,
0x0B3C, 0x0B44,
0x0B47, 0x0B48,
0x0B4B, 0x0B4D,
0x0B55, 0x0B57,
0x0B5C, 0x0B5D,
0x0B5F, 0x0B63,
0x0B66, 0x0B77,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ଅା", "ଏୗ", "ଓୗ"},
to = {"ଆ", "ଐ", "ଔ"}
},
}
m["Osge"] = process_ranges{
"Osage",
7105529,
ranges = {
0x104B0, 0x104D3,
0x104D8, 0x104FB,
},
capitalized = true,
translit = "Osge-translit",
}
m["Osma"] = process_ranges{
"Osmanya",
1377866,
ranges = {
0x10480, 0x1049D,
0x104A0, 0x104A9,
},
}
m["Ougr"] = process_ranges{
"Uyghur Kuno",
1998938,
"abjad, alfabet",
ranges = {
0x0640, 0x0640,
0x10AF2, 0x10AF2,
0x10F70, 0x10F89,
},
-- This should ideally be "vertical-ltr", but getting the CSS right is tricky because it's right-to-left horizontally, but left-to-right vertically. Currently, displaying it vertically causes it to display bottom-to-top.
direction = "rtl",
}
m["Palm"] = process_ranges{
"Palmyra",
17538100,
ranges = {
0x10860, 0x1087F,
},
direction = "rtl",
}
m["Pauc"] = process_ranges{
"Pau Cin Hau",
25339852,
ranges = {
0x11AC0, 0x11AF8,
},
}
m["Pcun"] = {
"Kuneiform Purba",
1650699,
"piktogram",
-- Not in Unicode
}
m["Pelm"] = {
"Elam Purba",
56305763,
"piktogram",
-- Not in Unicode
}
m["Perm"] = process_ranges{
"Permia Kuno",
147899,
ranges = {
0x0483, 0x0483,
0x10350, 0x1037A,
},
}
m["Phag"] = process_ranges{
"Phags-pa",
822836,
"abugida",
ranges = {
0x1802, 0x1803,
0x1805, 0x1805,
0x200C, 0x200D,
0x202F, 0x202F,
0x3002, 0x3002,
0xA840, 0xA877,
},
direction = "vertical-ltr",
}
m["Phli"] = process_ranges{
"Pahlavi Inskripsi",
24089793,
"abjad",
ranges = {
0x10B60, 0x10B72,
0x10B78, 0x10B7F,
},
direction = "rtl",
}
m["Phlp"] = process_ranges{
"Pahlavi Psalter",
7253954,
"abjad",
ranges = {
0x0640, 0x0640,
0x10B80, 0x10B91,
0x10B99, 0x10B9C,
0x10BA9, 0x10BAF,
},
direction = "rtl",
}
m["Phlv"] = {
"Pahlavi Buku",
72403118,
"abjad",
direction = "rtl",
wikipedia_article = "Pahlavi scripts#Book Pahlavi",
-- Not in Unicode
}
m["Phnx"] = process_ranges{
"Phoenicia",
26752,
"abjad",
ranges = {
0x10900, 0x1091B,
0x1091F, 0x1091F,
},
direction = "rtl",
translit = "Phnx-translit",
}
m["Plrd"] = process_ranges{
"Pollard",
601734,
"abugida",
aliases = {"Miao"},
ranges = {
0x16F00, 0x16F4A,
0x16F4F, 0x16F87,
0x16F8F, 0x16F9F,
},
}
m["Prti"] = process_ranges{
"Parthia Inskripsi",
13023804,
ranges = {
0x10B40, 0x10B55,
0x10B58, 0x10B5F,
},
direction = "rtl",
}
m["Psin"] = {
"Sinaitik Purba",
1065250,
"abjad",
direction = "rtl",
-- Not in Unicode
}
m["Ranj"] = {
"Ranjana",
2385276,
"abugida",
-- Not in Unicode
}
m["Rjng"] = process_ranges{
"Rejang",
2007960,
"abugida",
ranges = {
0xA930, 0xA953,
0xA95F, 0xA95F,
},
}
m["Rohg"] = process_ranges{
"Hanifi Rohingya",
21028705,
"alfabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0640, 0x0640,
0x06D4, 0x06D4,
0x10D00, 0x10D27,
0x10D30, 0x10D39,
},
direction = "rtl",
}
m["Roro"] = {
"Rongorongo",
209764,
-- Not in Unicode
}
m["Rumin"] = process_ranges{
"Penomboran Rumi",
nil,
ranges = {
0x10E60, 0x10E7E,
},
ietf_subtag = "Arab",
}
m["Runr"] = process_ranges{
"Rune",
82996,
"alfabet",
ranges = {
0x16A0, 0x16EA,
0x16EE, 0x16F8,
},
}
do
local Samr_stripdiacritics = {
remove_diacritics = c.CGJ .. u(0x0816) .. "-" .. u(0x082D),
}
m["Samr"] = process_ranges{
"Samaria",
1550930,
"abjad",
ranges = {
0x0800, 0x082D,
0x0830, 0x083E,
},
direction = "rtl",
strip_diacritics = Samr_stripdiacritics,
sort_key = Samr_stripdiacritics,
}
end
m["Sarb"] = process_ranges{
"Ancient South Arabian",
446074,
"abjad",
aliases = {"Old South Arabian"},
ranges = {
0x10A60, 0x10A7F,
},
direction = "rtl",
translit = "Sarb-translit",
}
m["Saur"] = process_ranges{
"Saurashtra",
3535165,
"abugida",
ranges = {
0xA880, 0xA8C5,
0xA8CE, 0xA8D9,
},
}
m["Semap"] = {
"flag semaphore",
250796,
"piktogram",
ietf_subtag = "Zsym",
}
m["Sgnw"] = process_ranges{
"SignWriting",
1497335,
"piktogram",
aliases = {"Sutton SignWriting"},
ranges = {
0x1D800, 0x1DA8B,
0x1DA9B, 0x1DA9F,
0x1DAA1, 0x1DAAF,
},
translit = false,
}
m["Shaw"] = process_ranges{
"Shaw",
1970098,
aliases = {"Shaw"},
ranges = {
0x10450, 0x1047F,
},
}
m["Shrd"] = process_ranges{
"Sharada",
2047117,
"abugida",
ranges = {
0x0951, 0x0951,
0x1CD7, 0x1CD7,
0x1CD9, 0x1CD9,
0x1CDC, 0x1CDD,
0x1CE0, 0x1CE0,
0xA830, 0xA835,
0xA838, 0xA838,
0x11180, 0x111DF,
},
translit = "Shrd-translit",
}
m["Shui"] = {
"Sui",
752854,
"logogram",
spaces = false,
-- Not in Unicode
}
m["Sidd"] = process_ranges{
"Siddham",
250379,
"abugida",
ranges = {
0x11580, 0x115B5,
0x115B8, 0x115DD,
},
translit = "Sidd-translit",
}
m["Sidt"] = {
"Sidetic",
36659,
"alfabet",
direction = "rtl",
-- Not in Unicode
}
m["Sind"] = process_ranges{
"Khudabadi",
6402810,
"abugida",
aliases = {"Khudawadi"},
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x112B0, 0x112EA,
0x112F0, 0x112F9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑊰𑋠", "𑊰𑋥", "𑊰𑋦", "𑊰𑋧", "𑊰𑋨"},
to = {"𑊱", "𑊶", "𑊷", "𑊸", "𑊹"}
},
}
m["Sinh"] = process_ranges{
"Sinhala",
1574992,
"abugida",
aliases = {"Sinhala"},
ranges = {
0x0964, 0x0965,
0x0D81, 0x0D83,
0x0D85, 0x0D96,
0x0D9A, 0x0DB1,
0x0DB3, 0x0DBB,
0x0DBD, 0x0DBD,
0x0DC0, 0x0DC6,
0x0DCA, 0x0DCA,
0x0DCF, 0x0DD4,
0x0DD6, 0x0DD6,
0x0DD8, 0x0DDF,
0x0DE6, 0x0DEF,
0x0DF2, 0x0DF4,
0x1CF2, 0x1CF2,
0x111E1, 0x111F4,
},
normalizationFixes = handle_normalization_fixes{
from = {"අා", "අැ", "අෑ", "උෟ", "ඍෘ", "ඏෟ", "එ්", "එෙ", "ඔෟ", "ෘෘ"},
to = {"ආ", "ඇ", "ඈ", "ඌ", "ඎ", "ඐ", "ඒ", "ඓ", "ඖ", "ෲ"}
},
}
m["Sogd"] = process_ranges{
"Sogdia",
578359,
"abjad",
ranges = {
0x0640, 0x0640,
0x10F30, 0x10F59,
},
direction = "rtl",
}
m["Sogo"] = process_ranges{
"Sogdia Kuno",
72403254,
"abjad",
ranges = {
0x10F00, 0x10F27,
},
direction = "rtl",
}
m["Sora"] = process_ranges{
"Sorang Sompeng",
7563292,
aliases = {"Sora Sompeng"},
ranges = {
0x110D0, 0x110E8,
0x110F0, 0x110F9,
},
}
m["Soyo"] = process_ranges{
"Soyombo",
8009382,
"abugida",
ranges = {
0x11A50, 0x11AA2,
},
}
m["Sund"] = process_ranges{
"Sunda",
51589,
"abugida",
ranges = {
0x1B80, 0x1BBF,
0x1CC0, 0x1CC7,
},
}
m["Sunu"] = process_ranges{
"Sunuwar",
109984965,
"alfabet",
ranges = {
0x11BC0, 0x11BE1,
0x11BF0, 0x11BF9,
},
}
m["Sylo"] = process_ranges{
"Sylheti Nagri",
144128,
"abugida",
aliases = {"Sylheti Nāgarī", "Syloti Nagri"},
ranges = {
0x0964, 0x0965,
0x09E6, 0x09EF,
0xA800, 0xA82C,
},
}
m["Syrc"] = process_ranges{
"Suryani",
26567,
"abjad", -- more precisely, impure abjad
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0640, 0x0640,
0x064B, 0x0655,
0x0670, 0x0670,
0x0700, 0x070D,
0x070F, 0x074A,
0x074D, 0x074F,
0x0860, 0x086A,
0x1DF8, 0x1DF8,
0x1DFA, 0x1DFA,
},
direction = "rtl",
}
-- Syre, Syrj, Syrn are apparently subsumed into Syrc; discuss if this causes issues
m["Tagb"] = process_ranges{
"Tagbanwa",
977444,
"abugida",
ranges = {
0x1735, 0x1736,
0x1760, 0x176C,
0x176E, 0x1770,
0x1772, 0x1773,
},
}
m["Takr"] = process_ranges{
"Takri",
759202,
"abugida",
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x11680, 0x116B9,
0x116C0, 0x116C9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑚀𑚭", "𑚀𑚴", "𑚀𑚵", "𑚆𑚲"},
to = {"𑚁", "𑚈", "𑚉", "𑚇"}
},
}
m["Tale"] = process_ranges{
"Tai Nüa",
2566326,
"abugida",
aliases = {"Tai Nuea", "New Tai Nüa", "New Tai Nuea", "Dehong Dai", "Tai Dehong", "Tai Le"},
ranges = {
0x1040, 0x1049,
0x1950, 0x196D,
0x1970, 0x1974,
},
spaces = false,
}
m["Talu"] = process_ranges{
"Tai Lue Baharu",
3498863,
"abugida",
ranges = {
0x1980, 0x19AB,
0x19B0, 0x19C9,
0x19D0, 0x19DA,
0x19DE, 0x19DF,
},
spaces = false,
}
m["Taml"] = process_ranges{
"Tamil",
26803,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B82, 0x0B83,
0x0B85, 0x0B8A,
0x0B8E, 0x0B90,
0x0B92, 0x0B95,
0x0B99, 0x0B9A,
0x0B9C, 0x0B9C,
0x0B9E, 0x0B9F,
0x0BA3, 0x0BA4,
0x0BA8, 0x0BAA,
0x0BAE, 0x0BB9,
0x0BBE, 0x0BC2,
0x0BC6, 0x0BC8,
0x0BCA, 0x0BCD,
0x0BD0, 0x0BD0,
0x0BD7, 0x0BD7,
0x0BE6, 0x0BFA,
0x1CDA, 0x1CDA,
0xA8F3, 0xA8F3,
0x11301, 0x11301,
0x11303, 0x11303,
0x1133B, 0x1133C,
0x11FC0, 0x11FF1,
0x11FFF, 0x11FFF,
},
normalizationFixes = handle_normalization_fixes{
from = {"அூ", "ஸ்ரீ"},
to = {"ஆ", "ஶ்ரீ"}
},
}
m["Tang"] = process_ranges{
"Tangut",
1373610,
"logogram, sukukataan",
ranges = {
0x31EF, 0x31EF,
0x16FE0, 0x16FE0,
0x17000, 0x187F7,
0x18800, 0x18AFF,
0x18D00, 0x18D08,
},
spaces = false,
translit = "txg-translit",
}
m["Tavt"] = process_ranges{
"Tai Viet",
11818517,
"abugida",
ranges = {
0xAA80, 0xAAC2,
0xAADB, 0xAADF,
},
spaces = false,
}
m["Tayo"] = process_ranges{
"Lai Tay",
16306701,
"abugida",
aliases = {"Tai Yo"},
direction = "vertical-rtl",
ranges = {
0x1E6C0, 0x1E6DE,
0x1E6E0, 0x1E6F5,
0x1E6FE, 0x1E6FF,
},
spaces = false,
}
m["Telu"] = process_ranges{
"Telugu",
570450,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C00, 0x0C0C,
0x0C0E, 0x0C10,
0x0C12, 0x0C28,
0x0C2A, 0x0C39,
0x0C3C, 0x0C44,
0x0C46, 0x0C48,
0x0C4A, 0x0C4D,
0x0C55, 0x0C56,
0x0C58, 0x0C5A,
0x0C5D, 0x0C5D,
0x0C60, 0x0C63,
0x0C66, 0x0C6F,
0x0C77, 0x0C7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ఒౌ", "ఒౕ", "ిౕ", "ెౕ", "ొౕ"},
to = {"ఔ", "ఓ", "ీ", "ే", "ో"}
},
}
m["Teng"] = {
"Tengwar",
473725,
}
m["Tfng"] = process_ranges{
"Tifinagh",
208503,
"abjad, alfabet",
ranges = {
0x2D30, 0x2D67,
0x2D6F, 0x2D70,
0x2D7F, 0x2D7F,
},
other_names = {"Libyco-Berber", "Berber"}, -- per Wikipedia, Libyco-Berber is the parent
}
m["Tglg"] = process_ranges{
"Baybayin",
812124,
"abugida",
aliases = {"Tagalog"},
varieties = {"Badlit", "Basahan", "Kur-itan"},
ranges = {
0x1700, 0x1715,
0x171F, 0x171F,
0x1735, 0x1736,
},
}
m["Thaa"] = process_ranges{
"Thaana",
877906,
"abugida",
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0660, 0x0669,
0x0780, 0x07B1,
0xFDF2, 0xFDF2,
0xFDFD, 0xFDFD,
},
direction = "rtl",
}
m["Thai"] = process_ranges{
"Thai",
236376,
"abugida",
ranges = {
0x0E01, 0x0E3A,
0x0E40, 0x0E5B,
},
spaces = false,
}
do
local Tibt_displaytext = {
from = {"ༀ", "༌", "།།", "༚༚", "༚༝", "༝༚", "༝༝", "ཷ", "ཹ", "ེེ", "ོོ"},
to = {"ཨོཾ", "་", "༎", "༛", "༟", "࿎", "༞", "ྲཱྀ", "ླཱྀ", "ཻ", "ཽ"}
}
m["Tibt"] = process_ranges{
"Tibet",
46861,
"abugida",
ranges = {
0x0F00, 0x0F47,
0x0F49, 0x0F6C,
0x0F71, 0x0F97,
0x0F99, 0x0FBC,
0x0FBE, 0x0FCC,
0x0FCE, 0x0FD4,
0x0FD9, 0x0FDA,
0x3008, 0x300B,
},
normalizationFixes = handle_normalization_fixes{
combiningClasses = {["༹"] = 1},
from = {"ཷ", "ཹ"},
to = {"ྲཱྀ", "ླཱྀ"}
},
display_text = Tibt_displaytext,
strip_diacritics = Tibt_displaytext,
sort_key = "Tibt-sortkey",
translit = "Tibt-translit",
}
m["sit-tam-Tibt"] = {
"Tamyig",
109875213,
m["Tibt"][3],
-- There is no inheritance of properties currently implemented for scripts. Per [[User:Theknightwho]], this
-- is because it's tricky to do since there are several types of child scripts: those that are mere display
-- variants (like fa-Arab), which should be eliminated in favor of CSS language selectors to
-- handle the font differences; those that are genuinely different scripts that happen to share the same
-- Unicode codepoints but have mostly different properties (e.g. Manchu vs. Mongolian); and those that are
-- somewhere in between (like Tamyig vs. Tibetan). As a result, we currently have to manually specify
-- which properties we want inherited as follows.
ranges = m["Tibt"].ranges,
characters = m["Tibt"].characters,
parent = "Tibt",
normalizationFixes = m["Tibt"].normalizationFixes,
display_text = m["Tibt"].display_text,
strip_diacritics = m["Tibt"].strip_diacritics,
sort_key = m["Tibt"].sort_key,
translit = m["Tibt"].translit,
}
end
m["Tirh"] = process_ranges{
"Tirhuta",
1765752,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x1CF2, 0x1CF2,
0xA830, 0xA839,
0x11480, 0x114C7,
0x114D0, 0x114D9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑒁𑒰", "𑒋𑒺", "𑒍𑒺", "𑒪𑒵", "𑒪𑒶"},
to = {"𑒂", "𑒌", "𑒎", "𑒉", "𑒊"}
},
}
m["Tnsa"] = process_ranges{
"Tangsa",
105576311,
"alfabet",
ranges = {
0x16A70, 0x16ABE,
0x16AC0, 0x16AC9,
},
}
m["Todr"] = process_ranges{
"Todhri",
10274731,
"alfabet",
direction = "rtl",
ranges = {
0x105C0, 0x105F3,
},
}
m["Tols"] = {
"Tolong Siki",
4459822,
"alfabet",
-- Not in Unicode
}
m["Toto"] = process_ranges{
"Toto",
104837516,
"abugida",
ranges = {
0x1E290, 0x1E2AE,
},
}
m["Tutg"] = process_ranges{
"Tigalari",
2604990,
"abugida",
aliases = {"Tulu"},
ranges = {
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA8F1, 0xA8F1,
0x11380, 0x11389,
0x1138B, 0x1138B,
0x1138E, 0x1138E,
0x11390, 0x113B5,
0x113B7, 0x113C0,
0x113C2, 0x113C2,
0x113C5, 0x113C5,
0x113C7, 0x113CA,
0x113CC, 0x113D5,
0x113D7, 0x113D8,
0x113E1, 0x113E2,
},
}
m["Ugar"] = process_ranges{
"Ugarit",
332652,
"abjad",
ranges = {
0x10380, 0x1039D,
0x1039F, 0x1039F,
},
}
m["Vaii"] = process_ranges{
"Vai",
523078,
"sukukataan",
ranges = {
0xA500, 0xA62B,
},
}
m["Visp"] = {
"Visible Speech",
1303365,
"alfabet",
-- Not in Unicode
}
m["Vith"] = process_ranges{
"Vithkuq",
3301993,
"alfabet",
ranges = {
0x10570, 0x1057A,
0x1057C, 0x1058A,
0x1058C, 0x10592,
0x10594, 0x10595,
0x10597, 0x105A1,
0x105A3, 0x105B1,
0x105B3, 0x105B9,
0x105BB, 0x105BC,
},
capitalized = true,
}
m["Wara"] = process_ranges{
"Varang Kshiti",
79199,
aliases = {"Warang Citi"},
ranges = {
0x118A0, 0x118F2,
0x118FF, 0x118FF,
},
capitalized = true,
}
m["Wcho"] = process_ranges{
"Wancho",
33713728,
"alfabet",
ranges = {
0x1E2C0, 0x1E2F9,
0x1E2FF, 0x1E2FF,
},
}
m["Wole"] = {
"Woleai",
6643710,
"sukukataan",
-- Not in Unicode
}
m["Xpeo"] = process_ranges{
"Parsi Kuno",
1471822,
ranges = {
0x103A0, 0x103C3,
0x103C8, 0x103D5,
},
}
m["Xsux"] = process_ranges{
"Kuneiform",
401,
aliases = {"Sumero-Akkadian Cuneiform"},
ranges = {
0x12000, 0x12399,
0x12400, 0x1246E,
0x12470, 0x12474,
0x12480, 0x12543,
},
}
m["Yezi"] = process_ranges{
"Yezidi",
13175481,
"alfabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0660, 0x0669,
0x10E80, 0x10EA9,
0x10EAB, 0x10EAD,
0x10EB0, 0x10EB1,
},
direction = "rtl",
}
m["Yiii"] = process_ranges{
"Yi",
1197646,
"sukukataan",
ranges = {
0x3001, 0x3002,
0x3008, 0x3011,
0x3014, 0x301B,
0x30FB, 0x30FB,
0xA000, 0xA48C,
0xA490, 0xA4C6,
0xFF61, 0xFF65,
},
}
m["Zanb"] = process_ranges{
"Zanabazar Square",
50809208,
"abugida",
ranges = {
0x11A00, 0x11A47,
},
}
m["Zmth"] = process_ranges{
"Notasi Matematik",
1140046,
ranges = {
0x00AC, 0x00AC,
0x00B1, 0x00B1,
0x00D7, 0x00D7,
0x00F7, 0x00F7,
0x03D0, 0x03D2,
0x03D5, 0x03D5,
0x03F0, 0x03F1,
0x03F4, 0x03F6,
0x0606, 0x0608,
0x2016, 0x2016,
0x2032, 0x2034,
0x2040, 0x2040,
0x2044, 0x2044,
0x2052, 0x2052,
0x205F, 0x205F,
0x2061, 0x2064,
0x207A, 0x207E,
0x208A, 0x208E,
0x20D0, 0x20DC,
0x20E1, 0x20E1,
0x20E5, 0x20E6,
0x20EB, 0x20EF,
0x2102, 0x2102,
0x2107, 0x2107,
0x210A, 0x2113,
0x2115, 0x2115,
0x2118, 0x211D,
0x2124, 0x2124,
0x2128, 0x2129,
0x212C, 0x212D,
0x212F, 0x2131,
0x2133, 0x2138,
0x213C, 0x2149,
0x214B, 0x214B,
0x2190, 0x21A7,
0x21A9, 0x21AE,
0x21B0, 0x21B1,
0x21B6, 0x21B7,
0x21BC, 0x21DB,
0x21DD, 0x21DD,
0x21E4, 0x21E5,
0x21F4, 0x22FF,
0x2308, 0x230B,
0x2320, 0x2321,
0x237C, 0x237C,
0x239B, 0x23B5,
0x23B7, 0x23B7,
0x23D0, 0x23D0,
0x23DC, 0x23E2,
0x25A0, 0x25A1,
0x25AE, 0x25B7,
0x25BC, 0x25C1,
0x25C6, 0x25C7,
0x25CA, 0x25CB,
0x25CF, 0x25D3,
0x25E2, 0x25E2,
0x25E4, 0x25E4,
0x25E7, 0x25EC,
0x25F8, 0x25FF,
0x2605, 0x2606,
0x2640, 0x2640,
0x2642, 0x2642,
0x2660, 0x2663,
0x266D, 0x266F,
0x27C0, 0x27FF,
0x2900, 0x2AFF,
0x2B30, 0x2B44,
0x2B47, 0x2B4C,
0xFB29, 0xFB29,
0xFE61, 0xFE66,
0xFE68, 0xFE68,
0xFF0B, 0xFF0B,
0xFF1C, 0xFF1E,
0xFF3C, 0xFF3C,
0xFF3E, 0xFF3E,
0xFF5C, 0xFF5C,
0xFF5E, 0xFF5E,
0xFFE2, 0xFFE2,
0xFFE9, 0xFFEC,
0x1D400, 0x1D454,
0x1D456, 0x1D49C,
0x1D49E, 0x1D49F,
0x1D4A2, 0x1D4A2,
0x1D4A5, 0x1D4A6,
0x1D4A9, 0x1D4AC,
0x1D4AE, 0x1D4B9,
0x1D4BB, 0x1D4BB,
0x1D4BD, 0x1D4C3,
0x1D4C5, 0x1D505,
0x1D507, 0x1D50A,
0x1D50D, 0x1D514,
0x1D516, 0x1D51C,
0x1D51E, 0x1D539,
0x1D53B, 0x1D53E,
0x1D540, 0x1D544,
0x1D546, 0x1D546,
0x1D54A, 0x1D550,
0x1D552, 0x1D6A5,
0x1D6A8, 0x1D7CB,
0x1D7CE, 0x1D7FF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
translit = false,
}
m["Zname"] = process_ranges{
"Notasi Muzik Znamenny",
965834,
"piktogram",
ranges = {
0x1CF00, 0x1CF2D,
0x1CF30, 0x1CF46,
0x1CF50, 0x1CFC3,
},
ietf_subtag = "Zsym",
translit = false,
}
m["Zsym"] = process_ranges{
"Simbolik",
80071,
"piktogram",
ranges = {
0x20DD, 0x20E0,
0x20E2, 0x20E4,
0x20E7, 0x20EA,
0x20F0, 0x20F0,
0x2100, 0x2101,
0x2103, 0x2106,
0x2108, 0x2109,
0x2114, 0x2114,
0x2116, 0x2117,
0x211E, 0x2123,
0x2125, 0x2127,
0x212A, 0x212B,
0x212E, 0x212E,
0x2132, 0x2132,
0x2139, 0x213B,
0x214A, 0x214A,
0x214C, 0x214F,
0x21A8, 0x21A8,
0x21AF, 0x21AF,
0x21B2, 0x21B5,
0x21B8, 0x21BB,
0x21DC, 0x21DC,
0x21DE, 0x21E3,
0x21E6, 0x21F3,
0x2300, 0x2307,
0x230C, 0x231F,
0x2322, 0x237B,
0x237D, 0x239A,
0x23B6, 0x23B6,
0x23B8, 0x23CF,
0x23D1, 0x23DB,
0x23E3, 0x23FF,
0x2500, 0x259F,
0x25A2, 0x25AD,
0x25B8, 0x25BB,
0x25C2, 0x25C5,
0x25C8, 0x25C9,
0x25CC, 0x25CE,
0x25D4, 0x25E1,
0x25E3, 0x25E3,
0x25E5, 0x25E6,
0x25ED, 0x25F7,
0x2600, 0x2604,
0x2607, 0x263F,
0x2641, 0x2641,
0x2643, 0x265F,
0x2664, 0x266C,
0x2670, 0x27BF,
0x2B00, 0x2B2F,
0x2B45, 0x2B46,
0x2B4D, 0x2B73,
0x2B76, 0x2B95,
0x2B97, 0x2BFF,
0x4DC0, 0x4DFF,
0x1F000, 0x1F02B,
0x1F030, 0x1F093,
0x1F0A0, 0x1F0AE,
0x1F0B1, 0x1F0BF,
0x1F0C1, 0x1F0CF,
0x1F0D1, 0x1F0F5,
0x1F300, 0x1F6D7,
0x1F6DC, 0x1F6EC,
0x1F6F0, 0x1F6FC,
0x1F700, 0x1F776,
0x1F77B, 0x1F7D9,
0x1F7E0, 0x1F7EB,
0x1F7F0, 0x1F7F0,
0x1F800, 0x1F80B,
0x1F810, 0x1F847,
0x1F850, 0x1F859,
0x1F860, 0x1F887,
0x1F890, 0x1F8AD,
0x1F8B0, 0x1F8B1,
0x1F900, 0x1FA53,
0x1FA60, 0x1FA6D,
0x1FA70, 0x1FA7C,
0x1FA80, 0x1FA88,
0x1FA90, 0x1FABD,
0x1FABF, 0x1FAC5,
0x1FACE, 0x1FADB,
0x1FAE0, 0x1FAE8,
0x1FAF0, 0x1FAF8,
0x1FB00, 0x1FB92,
0x1FB94, 0x1FBCA,
0x1FBF0, 0x1FBF9,
},
translit = false,
character_category = false, -- none
}
m["Zxxx"] = {
"unwritten",
104839715,
-- This should not have any characters listed
translit = false,
character_category = false, -- none
}
m["Zyyy"] = {
"undetermined",
104839687,
-- This should not have any characters listed, probably
translit = false,
character_category = false, -- none
}
m["Zzzz"] = {
"Tidak Terkod",
104839675,
-- This should not have any characters listed
translit = false,
character_category = false, -- none
}
-- These should be defined after the scripts they are composed of.
m["Hrkt"] = process_ranges{
"Kana",
187659,
"sukukataan",
aliases = {"Japanese syllabaries"},
ranges = union(
m["Hira"].ranges,
m["Kana"].ranges
),
spaces = false,
}
m["Jpan"] = process_ranges{
"Jepun",
190502,
"logogram, sukukataan",
ranges = union(
m["Hrkt"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
spaces = false,
sort_by_scraping = true,
}
m["Kore"] = process_ranges{
"Korea",
711797,
"logogram, sukukataan",
ranges = union(
m["Hang"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
-- `漢字(한자)`→`漢字`
-- `가-나-다`→`가나다`, `가--나--다`→`가-나-다`
-- `온돌(溫突/溫堗)`→`온돌` ([[ondol]])
strip_diacritics = {
remove_diacritics = u(0x302E) .. u(0x302F),
from = {"([" .. m["Hani"].characters .. "])%(.-%)", "^%-", "%-$", "%-(%-?)", "\1", "%([" .. m["Hani"].characters .. "/]+%)"},
to = {"%1", "\1", "\1", "%1", "-"}
}
}
return require("Module:languages").finalizeData(m, "script")
8hf8nl5m84l2o1zp6u6td9oueuy1zbd
373593
373592
2026-09-12T11:05:05Z
Hakimi97
2668
Membatalkan semakan [[Special:Diff/373592|373592]] oleh [[Special:Contributions/Hakimi97|Hakimi97]] ([[User talk:Hakimi97|bincang]])
373593
Scribunto
text/plain
--[=[
When adding new scripts to this file, please don't forget to add
style definitons for the script in [[MediaWiki:Gadget-LanguagesAndScripts.css]].
]=]
local concat = table.concat
local insert = table.insert
local ipairs = ipairs
local next = next
local remove = table.remove
local select = select
local sort = table.sort
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string/char")
return u(...)
end
-- We can't use mw.loadData() on [[Module:languages/chars]] because [[Module:languages/data]] itself is sometimes loaded
-- using mw.loadData(), and calling mw.loadData() on [[Module:languages/chars]] will insert metatables into the
-- character tables, which the second mw.loadData() will choke on.
local m_chars = require("Module:languages/chars")
local c = m_chars.chars
local p = m_chars.puaChars
local cs = m_chars.chars_substitutions
------------------------------------------------------------------------------------
--
-- Helper functions
--
------------------------------------------------------------------------------------
-- Note: a[2] > b[2] means opens are sorted before closes if otherwise equal.
local function sort_ranges(a, b)
return a[1] < b[1] or a[1] == b[1] and a[2] > b[2]
end
-- Returns the union of two or more range tables.
local function union(...)
local ranges = {}
for i = 1, select("#", ...) do
local argt = select(i, ...)
for j, v in ipairs(argt) do
insert(ranges, {v, j % 2 == 1 and 1 or -1})
end
end
sort(ranges, sort_ranges)
local ret, i = {}, 0
for _, range in ipairs(ranges) do
i = i + range[2]
if i == 0 and range[2] == -1 then -- close
insert(ret, range[1])
elseif i == 1 and range[2] == 1 then -- open
if ret[#ret] and range[1] <= ret[#ret] + 1 then
remove(ret) -- merge adjacent ranges
else
insert(ret, range[1])
end
end
end
return ret
end
-- Adds the `characters` key, which is determined by a script's `ranges` table.
local function process_ranges(sc)
local ranges, chars = sc.ranges, {}
for i = 2, #ranges, 2 do
if ranges[i] == ranges[i - 1] then
insert(chars, u(ranges[i]))
else
insert(chars, u(ranges[i - 1]))
if ranges[i] > ranges[i - 1] + 1 then
insert(chars, "-")
end
insert(chars, u(ranges[i]))
end
end
sc.characters = concat(chars)
ranges.n = #ranges
return sc
end
local function handle_normalization_fixes(fixes)
local combiningClasses = fixes.combiningClasses
if combiningClasses then
local chars, i = {}, 0
for char in next, combiningClasses do
i = i + 1
chars[i] = char
end
fixes.combiningClassCharacters = concat(chars)
end
return fixes
end
------------------------------------------------------------------------------------
--
-- Data
--
------------------------------------------------------------------------------------
local m = {}
m["Adlm"] = process_ranges{
"Adlam",
19606346,
"alfabet",
ranges = {
0x061F, 0x061F,
0x0640, 0x0640,
0x1E900, 0x1E94B,
0x1E950, 0x1E959,
0x1E95E, 0x1E95F,
},
capitalized = true,
direction = "rtl",
}
m["Afak"] = {
"Afaka",
382019,
"sukukataan",
-- Not in Unicode
}
m["Aghb"] = process_ranges{
"Albania Kaukasus",
2495716,
"alfabet",
ranges = {
0x10530, 0x10563,
0x1056F, 0x1056F,
},
}
m["Ahom"] = process_ranges{
"Ahom",
2839633,
"abugida",
ranges = {
0x11700, 0x1171A,
0x1171D, 0x1172B,
0x11730, 0x11746,
},
}
m["Arab"] = process_ranges{
"Arab",
1828555,
"abjad", -- more precisely, impure abjad
varieties = {"Jawi", "Perso-Arabic", "Sulat Sūg"},
ranges = {
0x0600, 0x06FF,
0x0750, 0x077F,
0x0870, 0x088E,
0x0890, 0x0891,
0x0897, 0x08E1,
0x08E3, 0x08FF,
0xFB50, 0xFBC2,
0xFBD3, 0xFD8F,
0xFD92, 0xFDC7,
0xFDCF, 0xFDCF,
0xFDF0, 0xFDFF,
0xFE70, 0xFE74,
0xFE76, 0xFEFC,
0x102E0, 0x102FB,
0x10E60, 0x10E7E,
0x10EC2, 0x10EC4,
0x10EFC, 0x10EFF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
direction = "rtl",
normalizationFixes = handle_normalization_fixes{
from = {"ٳ"},
to = {"اٟ"}
},
}
m["Aran"] = {
{
hnd = "Shahmukhi", -- Southern Hindko
hno = "Shahmukhi", -- Northern Hindko
["inc-opa"] = "Shahmukhi", -- Old Punjabi
lah = "Shahmukhi", -- Lahnda
pa = "Shahmukhi", -- Punjabi
phr = "Shahmukhi", -- Pahari-Potwari
skr = "Shahmukhi", -- Saraiki
default = "Arab",
},
1133121, -- FIXME: 133800 for Shahmukhi
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
aliases = {"Nastaliq", "Nastaleeq"},
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["Armi"] = process_ranges{
"Aram Imperial",
26978,
"abjad",
ranges = {
0x10840, 0x10855,
0x10857, 0x1085F,
},
direction = "rtl",
}
m["Armn"] = process_ranges{
"Armenia",
11932,
"alfabet",
ranges = {
0x0531, 0x0556,
0x0559, 0x058A,
0x058D, 0x058F,
0xFB13, 0xFB17,
},
capitalized = true,
translit = "Armn-translit",
}
m["Avst"] = process_ranges{
"Avesta",
790681,
"alfabet",
ranges = {
0x10B00, 0x10B35,
0x10B39, 0x10B3F,
},
direction = "rtl",
}
m["pal-Avst"] = {
"Pazend",
4925073,
m["Avst"][3],
ranges = m["Avst"].ranges,
characters = m["Avst"].characters,
direction = "rtl",
parent = "Avst",
}
m["Bali"] = process_ranges{
"Bali",
804984,
"abugida",
ranges = {
0x1B00, 0x1B4C,
0x1B4E, 0x1B7F,
},
}
m["Bamu"] = process_ranges{
"Bamum",
806024,
"sukukataan",
ranges = {
0xA6A0, 0xA6F7,
0x16800, 0x16A38,
},
}
m["Bass"] = process_ranges{
"Bassa",
810458,
"alfabet",
aliases = {"Bassa Vah", "Vah"},
ranges = {
0x16AD0, 0x16AED,
0x16AF0, 0x16AF5,
},
}
m["Batk"] = process_ranges{
"Batak",
51592,
"abugida",
ranges = {
0x1BC0, 0x1BF3,
0x1BFC, 0x1BFF,
},
}
m["Beng"] = process_ranges{
"Bengali",
756802,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09B0,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09EF,
0x09F2, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = handle_normalization_fixes{
from = {"অা", "ঋৃ", "ঌৢ"},
to = {"আ", "ৠ", "ৡ"}
},
}
m["as-Beng"] = process_ranges{
"Assam",
191272,
m["Beng"][3],
other_names = {"Eastern Nagari"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09AF,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = m["Beng"].normalizationFixes,
}
m["Bhks"] = process_ranges{
"Bhaiksuki",
17017839,
"abugida",
ranges = {
0x11C00, 0x11C08,
0x11C0A, 0x11C36,
0x11C38, 0x11C45,
0x11C50, 0x11C6C,
},
}
m["Blis"] = {
"Blissymbolic",
609817,
"logogram",
aliases = {"Blissymbols"},
-- Not in Unicode
}
m["Bopo"] = process_ranges{
"Zhuyin",
198269,
"sukukataan separa",
aliases = {"Zhuyin Fuhao", "Bopomofo"},
ranges = {
0x02EA, 0x02EB,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302A, 0x302D,
0x3030, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3105, 0x312F,
0x31A0, 0x31BF,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
},
}
m["Brah"] = process_ranges{
"Brahmi",
185083,
"abugida",
ranges = {
0x11000, 0x1104D,
0x11052, 0x11075,
0x1107F, 0x1107F,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑀅𑀸", "𑀋𑀾", "𑀏𑁂"},
to = {"𑀆", "𑀌", "𑀐"}
},
translit = "Brah-translit",
}
m["Brai"] = process_ranges{
"Braille",
79894,
"alfabet",
ranges = {
0x2800, 0x28FF,
},
}
m["Bugi"] = process_ranges{
"Lontara",
1074947,
"abugida",
aliases = {"Buginese"},
ranges = {
0x1A00, 0x1A1B,
0x1A1E, 0x1A1F,
0xA9CF, 0xA9CF,
},
}
m["Buhd"] = process_ranges{
"Buhid",
1002969,
"abugida",
ranges = {
0x1735, 0x1736,
0x1740, 0x1751,
0x1752, 0x1753,
},
}
m["Cakm"] = process_ranges{
"Chakma",
1059328,
"abugida",
ranges = {
0x09E6, 0x09EF,
0x1040, 0x1049,
0x11100, 0x11134,
0x11136, 0x11147,
},
}
m["Cans"] = process_ranges{
"Suku Kata Kanada",
2479183,
"abugida",
ranges = {
0x1400, 0x167F,
0x18B0, 0x18F5,
0x11AB0, 0x11ABF,
},
}
m["Cari"] = process_ranges{
"Carian",
1094567,
"alfabet",
ranges = {
0x102A0, 0x102D0,
},
}
m["Cham"] = process_ranges{
"Cham",
1060381,
"abugida",
ranges = {
0xAA00, 0xAA36,
0xAA40, 0xAA4D,
0xAA50, 0xAA59,
0xAA5C, 0xAA5F,
},
}
m["Cher"] = process_ranges{
"Cherokee",
26549,
"sukukataan",
ranges = {
0x13A0, 0x13F5,
0x13F8, 0x13FD,
0xAB70, 0xABBF,
},
}
m["Chis"] = {
"Chisoi",
123173777,
"abugida",
-- Not in Unicode
}
m["Chrs"] = process_ranges{
"Khwarezmian",
72386710,
"abjad",
aliases = {"Chorasmian"},
ranges = {
0x10FB0, 0x10FCB,
},
direction = "rtl",
}
m["Copt"] = process_ranges{
"Qibti",
321083,
"alfabet",
ranges = {
0x03E2, 0x03EF,
0x2C80, 0x2CF3,
0x2CF9, 0x2CFF,
0x102E0, 0x102FB,
},
capitalized = true,
}
m["Cpmn"] = process_ranges{
"Cypro-Minoan",
1751985,
"sukukataan",
aliases = {"Cypro Minoan"},
ranges = {
0x10100, 0x10101,
0x12F90, 0x12FF2,
},
}
m["Cprt"] = process_ranges{
"Cyprus",
1757689,
"sukukataan",
ranges = {
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080A, 0x10835,
0x10837, 0x10838,
0x1083C, 0x1083C,
0x1083F, 0x1083F,
},
direction = "rtl",
}
m["Cyrl"] = process_ranges{
"Cyril",
8209,
"alfabet",
ranges = {
0x0400, 0x052F,
0x1C80, 0x1C8A,
0x1D2B, 0x1D2B,
0x1D78, 0x1D78,
0x1DF8, 0x1DF8,
0x2DE0, 0x2DFF,
0x2E43, 0x2E43,
0xA640, 0xA69F,
0xFE2E, 0xFE2F,
0x1E030, 0x1E06D,
0x1E08F, 0x1E08F,
},
capitalized = true,
}
m["Cyrs"] = {
"Cyril Kuno",
442244,
m["Cyrl"][3],
aliases = {"Early Cyrillic"},
ranges = m["Cyrl"].ranges,
characters = m["Cyrl"].characters,
capitalized = m["Cyrl"].capitalized,
wikipedia_article = "Early Cyrillic alphabet",
normalizationFixes = handle_normalization_fixes{
from = {"Ѹ", "ѹ"},
to = {"Ꙋ", "ꙋ"}
},
strip_diacritics = {remove_diacritics = cs.Cyrs_remove_diacritics},
sort_key = {
remove_diacritics = cs.Cyrs_remove_diacritics,
from = {
"ї", "оу", -- 2 chars
"[ґꙣєѕꙃꙅꙁіꙇђꙉѻꙩꙫꙭꙮꚙꚛꙋѡѿꙍѽꙑѣꙗѥꙕѧꙙѩꙝꙛѫѭѯѱѳѵҁ]"
},
to = {
"и" .. p[1], "у", {
["ґ"] = "г" .. p[1], ["ꙣ"] = "д" .. p[1], ["є"] = "е", ["ѕ"] = "ж" .. p[1], ["ꙃ"] = "ж" .. p[1],
["ꙅ"] = "ж" .. p[1], ["ꙁ"] = "з", ["і"] = "и" .. p[1], ["ꙇ"] = "и" .. p[1], ["ђ"] = "и" .. p[2],
["ꙉ"] = "и" .. p[2], ["ѻ"] = "о", ["ꙩ"] = "о", ["ꙫ"] = "о", ["ꙭ"] = "о",
["ꙮ"] = "о", ["ꚙ"] = "о", ["ꚛ"] = "о", ["ꙋ"] = "у", ["ѡ"] = "х" .. p[1],
["ѿ"] = "х" .. p[1], ["ꙍ"] = "х" .. p[1], ["ѽ"] = "х" .. p[1], ["ꙑ"] = "ы", ["ѣ"] = "ь" .. p[1],
["ꙗ"] = "ь" .. p[2], ["ѥ"] = "ь" .. p[3], ["ꙕ"] = "ю", ["ѧ"] = "я", ["ꙙ"] = "я",
["ѩ"] = "я" .. p[1], ["ꙝ"] = "я" .. p[1], ["ꙛ"] = "я" .. p[2], ["ѫ"] = "я" .. p[3], ["ѭ"] = "я" .. p[4],
["ѯ"] = "я" .. p[5], ["ѱ"] = "я" .. p[6], ["ѳ"] = "я" .. p[7], ["ѵ"] = "я" .. p[8], ["ҁ"] = "я" .. p[9],
}
},
}
}
m["Deva"] = process_ranges{
{
ahr = "Balbodh", -- Ahirani
kfq = "Balbodh", -- Korku
kok = "Balbodh", -- Konkani
mr = "Balbodh", -- Marathi
omr = "Balbodh", -- Old Marathi
vah = "Balbodh", -- Varhadi
default = "Devanagari",
},
38592, -- FIXME: 16948817 for Balbodh
"abugida",
ranges = {
0x0900, 0x097F,
0x1CD0, 0x1CF6,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0xA830, 0xA839,
0xA8E0, 0xA8FF,
0x11B00, 0x11B09,
},
normalizationFixes = handle_normalization_fixes{
from = {"ॆॆ", "ेे", "ाॅ", "ाॆ", "ाꣿ", "ॊॆ", "ाे", "ाै", "ोे", "ाऺ", "ॖॖ", "अॅ", "अॆ", "अा", "एॅ", "एॆ", "एे", "एꣿ", "ऎॆ", "अॉ", "आॅ", "अॊ", "आॆ", "अो", "आे", "अौ", "आै", "ओे", "अऺ", "अऻ", "आऺ", "अाꣿ", "आꣿ", "ऒॆ", "अॖ", "अॗ", "ॶॖ", "्?ा"},
to = {"ꣿ", "ै", "ॉ", "ॊ", "ॏ", "ॏ", "ो", "ौ", "ौ", "ऻ", "ॗ", "ॲ", "ऄ", "आ", "ऍ", "ऎ", "ऐ", "ꣾ", "ꣾ", "ऑ", "ऑ", "ऒ", "ऒ", "ओ", "ओ", "औ", "औ", "औ", "ॳ", "ॴ", "ॴ", "ॵ", "ॵ", "ॵ", "ॶ", "ॷ", "ॷ"}
},
}
m["Diak"] = process_ranges{
"Dhives Akuru",
3307073,
"abugida",
aliases = {"Dhivehi Akuru", "Dives Akuru", "Divehi Akuru"},
ranges = {
0x11900, 0x11906,
0x11909, 0x11909,
0x1190C, 0x11913,
0x11915, 0x11916,
0x11918, 0x11935,
0x11937, 0x11938,
0x1193B, 0x11946,
0x11950, 0x11959,
},
}
m["Dogr"] = process_ranges{
"Dogra",
72402987,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11800, 0x1183B,
},
}
m["Dsrt"] = process_ranges{
"Deseret",
1200582,
"alfabet",
ranges = {
0x10400, 0x1044F,
},
capitalized = true,
}
m["Dupl"] = process_ranges{
"Duployan",
5316025,
"alfabet",
ranges = {
0x1BC00, 0x1BC6A,
0x1BC70, 0x1BC7C,
0x1BC80, 0x1BC88,
0x1BC90, 0x1BC99,
0x1BC9C, 0x1BCA3,
},
}
m["Egyd"] = {
"Demotik",
188519,
"abjad, logogram",
-- Not in Unicode
}
m["Egyh"] = {
"Hieratik",
208111,
"abjad, logogram",
-- Unified with Egyptian hieroglyphic in Unicode
}
m["Egyp"] = process_ranges{
"Hieroglif Mesir",
132659,
"abjad, logogram",
ranges = {
0x13000, 0x13455,
0x13460, 0x143FA,
},
varieties = {"Hieratic"},
wikipedia_article = "Egyptian hieroglyphs",
normalizationFixes = handle_normalization_fixes{
from = {"𓃁", "𓆖"},
to = {"𓃀𓂝", "𓆓𓏏𓇿"}
},
}
m["Elba"] = process_ranges{
"Elbasan",
1036714,
"alfabet",
ranges = {
0x10500, 0x10527,
},
}
m["Elym"] = process_ranges{
"Elymaic",
60744423,
"abjad",
ranges = {
0x10FE0, 0x10FF6,
},
direction = "rtl",
}
m["Ethi"] = process_ranges{
"Habsyah",
257634,
"abugida",
aliases = {"Ge'ez", "Geʽez"},
ranges = {
0x1200, 0x1248,
0x124A, 0x124D,
0x1250, 0x1256,
0x1258, 0x1258,
0x125A, 0x125D,
0x1260, 0x1288,
0x128A, 0x128D,
0x1290, 0x12B0,
0x12B2, 0x12B5,
0x12B8, 0x12BE,
0x12C0, 0x12C0,
0x12C2, 0x12C5,
0x12C8, 0x12D6,
0x12D8, 0x1310,
0x1312, 0x1315,
0x1318, 0x135A,
0x135D, 0x137C,
0x1380, 0x1399,
0x2D80, 0x2D96,
0x2DA0, 0x2DA6,
0x2DA8, 0x2DAE,
0x2DB0, 0x2DB6,
0x2DB8, 0x2DBE,
0x2DC0, 0x2DC6,
0x2DC8, 0x2DCE,
0x2DD0, 0x2DD6,
0x2DD8, 0x2DDE,
0xAB01, 0xAB06,
0xAB09, 0xAB0E,
0xAB11, 0xAB16,
0xAB20, 0xAB26,
0xAB28, 0xAB2E,
0x1E7E0, 0x1E7E6,
0x1E7E8, 0x1E7EB,
0x1E7ED, 0x1E7EE,
0x1E7F0, 0x1E7FE,
},
sort_key = "Ethi-sortkey",
strip_diacritics = {remove_diacritics = u(0x135D) .. u(0x135E) .. u(0x135F)}
}
m["Gara"] = process_ranges{
"Garay",
3095302,
"alfabet",
capitalized = true,
direction = "rtl",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x10D40, 0x10D65,
0x10D69, 0x10D85,
0x10D8E, 0x10D8F,
},
}
m["Geok"] = process_ranges{
"Khutsuri",
1090055,
"alfabet",
ranges = { -- Ⴀ-Ⴭ is Asomtavruli, ⴀ-ⴭ is Nuskhuri
0x10A0, 0x10C5,
0x10C7, 0x10C7,
0x10CD, 0x10CD,
0x10FB, 0x10FB,
0x2D00, 0x2D25,
0x2D27, 0x2D27,
0x2D2D, 0x2D2D,
},
varieties = {"Nuskhuri", "Asomtavruli"},
capitalized = true,
translit = "Geok-translit",
}
m["Geor"] = process_ranges{
"Georgia",
3317411,
"alfabet",
ranges = { -- ა-ჿ is lowercase Mkhedruli; Ა-Ჿ is uppercase Mkhedruli (Mtavruli)
0x0589, 0x0589,
0x10D0, 0x10FF,
0x1C90, 0x1CBA,
0x1CBD, 0x1CBF,
},
varieties = {"Mkhedruli", "Mtavruli"},
capitalized = true,
translit = "Geor-translit",
}
m["Glag"] = process_ranges{
"Glagol",
145625,
"alfabet",
ranges = {
0x0484, 0x0484,
0x0487, 0x0487,
0x0589, 0x0589,
0x10FB, 0x10FB,
0x2C00, 0x2C5F,
0x2E43, 0x2E43,
0xA66F, 0xA66F,
0x1E000, 0x1E006,
0x1E008, 0x1E018,
0x1E01B, 0x1E021,
0x1E023, 0x1E024,
0x1E026, 0x1E02A,
},
capitalized = true,
}
m["Gong"] = process_ranges{
"Gunjala Gondi",
18125340,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D60, 0x11D65,
0x11D67, 0x11D68,
0x11D6A, 0x11D8E,
0x11D90, 0x11D91,
0x11D93, 0x11D98,
0x11DA0, 0x11DA9,
},
}
m["Gonm"] = process_ranges{
"Masaram Gondi",
16977603,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D00, 0x11D06,
0x11D08, 0x11D09,
0x11D0B, 0x11D36,
0x11D3A, 0x11D3A,
0x11D3C, 0x11D3D,
0x11D3F, 0x11D47,
0x11D50, 0x11D59,
},
}
m["Goth"] = process_ranges{
"Goth",
467784,
"alfabet",
ranges = {
0x10330, 0x1034A,
},
wikipedia_article = "Gothic alphabet",
}
m["Gran"] = process_ranges{
"Grantha",
1119274,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0BE6, 0x0BF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CF2, 0x1CF4,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0x11300, 0x11303,
0x11305, 0x1130C,
0x1130F, 0x11310,
0x11313, 0x11328,
0x1132A, 0x11330,
0x11332, 0x11333,
0x11335, 0x11339,
0x1133B, 0x11344,
0x11347, 0x11348,
0x1134B, 0x1134D,
0x11350, 0x11350,
0x11357, 0x11357,
0x1135D, 0x11363,
0x11366, 0x1136C,
0x11370, 0x11374,
0x11FD0, 0x11FD1,
0x11FD3, 0x11FD3,
},
}
m["Grek"] = process_ranges{
"Yunani",
8216,
"alfabet",
ranges = {
0x0341, 0x0341,
0x0374, 0x0375,
0x037E, 0x037E,
0x0384, 0x038A,
0x038C, 0x038C,
0x038E, 0x03A1,
0x03A3, 0x03D7,
0x03DA, 0x03DB,
0x03DE, 0x03E1,
0x03F0, 0x03F1,
0x03F4, 0x03F4,
0x03FC, 0x03FC,
0x1D26, 0x1D2A,
0x1D5D, 0x1D61,
0x1D66, 0x1D6A,
0x1DBF, 0x1DBF,
0x2126, 0x2127,
0x2129, 0x2129,
0x213C, 0x2140,
0xAB65, 0xAB65,
0x10140, 0x1018E,
0x101A0, 0x101A0,
0x1D200, 0x1D245,
},
capitalized = true,
display_text = "Grek-common",
strip_diacritics = "Grek-common",
sort_key = {
remove_diacritics = "'ʼ;·`¨´῀" .. c.grave .. c.acute .. c.diaer .. c.caron .. c.turnedcommaabove .. c.commaabove .. c.revcommaabove .. c.macron .. c.breve .. c.diaerbelow .. c.brevebelow .. c.perispomeni .. c.ypogegrammeni .. c.RSQuo .. c.prime .. c.keraia .. c.lowerkeraia .. c.tonos .. c.coronis .. c.psili .. c.dasia,
from = {"ϝ", "ͷ", "ϛ", "ͱ", "ͺ", "ϳ", "ϻ", "[ϟϙ]", "[ςϲ]", "ͳ"},
to = {"ε" .. p[1], "ε" .. p[2], "ε" .. p[3], "ζ" .. p[1], "ι", "ι" .. p[1], "π" .. p[1], "π" .. p[2], "σ", "ϡ"},
},
}
m["Polyt"] = process_ranges{
"Yunani",
1475332,
m["Grek"][3],
ranges = union(m["Grek"].ranges, {
0x0340, 0x0340,
0x0342, 0x0345,
0x0370, 0x0373,
0x0376, 0x0377,
0x037A, 0x037D,
0x037F, 0x037F,
0x03D8, 0x03D9,
0x03DC, 0x03DD,
0x03F2, 0x03F3,
0x03F5, 0x03FB,
0x03FD, 0x03FF,
0x1F00, 0x1F15,
0x1F18, 0x1F1D,
0x1F20, 0x1F45,
0x1F48, 0x1F4D,
0x1F50, 0x1F57,
0x1F59, 0x1F59,
0x1F5B, 0x1F5B,
0x1F5D, 0x1F5D,
0x1F5F, 0x1F7D,
0x1F80, 0x1FB4,
0x1FB6, 0x1FC4,
0x1FC6, 0x1FD3,
0x1FD6, 0x1FDB,
0x1FDD, 0x1FEF,
0x1FF2, 0x1FF4,
0x1FF6, 0x1FFE,
}),
ietf_subtag = "Grek",
capitalized = m["Grek"].capitalized,
parent = "Grek",
display_text = m["Grek"].display_text,
strip_diacritics = "Polyt-stripdiacritics",
sort_key = m["Grek"].sort_key,
translit = "grc-translit",
}
m["Gujr"] = process_ranges{
"Gujarati",
733944,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A81, 0x0A83,
0x0A85, 0x0A8D,
0x0A8F, 0x0A91,
0x0A93, 0x0AA8,
0x0AAA, 0x0AB0,
0x0AB2, 0x0AB3,
0x0AB5, 0x0AB9,
0x0ABC, 0x0AC5,
0x0AC7, 0x0AC9,
0x0ACB, 0x0ACD,
0x0AD0, 0x0AD0,
0x0AE0, 0x0AE3,
0x0AE6, 0x0AF1,
0x0AF9, 0x0AFF,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ઓ", "અાૈ", "અા", "અૅ", "અે", "અૈ", "અૉ", "અો", "અૌ", "આૅ", "આૈ", "ૅા"},
to = {"અાૅ", "ઔ", "આ", "ઍ", "એ", "ઐ", "ઑ", "ઓ", "ઔ", "ઓ", "ઔ", "ૉ"}
},
}
m["Gukh"] = process_ranges{
"Khema",
110064239,
"abugida",
aliases = {"Gurung Khema", "Khema Phri", "Khema Lipi"},
ranges = {
0x0965, 0x0965,
0x16100, 0x16139,
},
}
m["Guru"] = process_ranges{
"Gurmukhi",
689894,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A01, 0x0A03,
0x0A05, 0x0A0A,
0x0A0F, 0x0A10,
0x0A13, 0x0A28,
0x0A2A, 0x0A30,
0x0A32, 0x0A33,
0x0A35, 0x0A36,
0x0A38, 0x0A39,
0x0A3C, 0x0A3C,
0x0A3E, 0x0A42,
0x0A47, 0x0A48,
0x0A4B, 0x0A4D,
0x0A51, 0x0A51,
0x0A59, 0x0A5C,
0x0A5E, 0x0A5E,
0x0A66, 0x0A76,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ਅਾ", "ਅੈ", "ਅੌ", "ੲਿ", "ੲੀ", "ੲੇ", "ੳੁ", "ੳੂ", "ੳੋ"},
to = {"ਆ", "ਐ", "ਔ", "ਇ", "ਈ", "ਏ", "ਉ", "ਊ", "ਓ"}
},
}
m["Hang"] = process_ranges{
"Hangul",
8222,
"sukukataan",
aliases = {"Hangeul"},
ranges = {
0x1100, 0x11FF,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302E, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3131, 0x318E,
0x3200, 0x321E,
0x3260, 0x327E,
0xA960, 0xA97C,
0xAC00, 0xD7A3,
0xD7B0, 0xD7C6,
0xD7CB, 0xD7FB,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFFA0, 0xFFBE,
0xFFC2, 0xFFC7,
0xFFCA, 0xFFCF,
0xFFD2, 0xFFD7,
0xFFDA, 0xFFDC,
},
}
m["Hani"] = process_ranges{
"Han",
8201,
"logogram",
ranges = {
0x2E80, 0x2E99,
0x2E9B, 0x2EF3,
0x2F00, 0x2FD5,
0x2FF0, 0x2FFF,
0x3001, 0x3003,
0x3005, 0x3011,
0x3013, 0x301F,
0x3021, 0x302D,
0x3030, 0x3030,
0x3037, 0x303F,
0x3190, 0x319F,
0x31C0, 0x31E5,
0x31EF, 0x31EF,
0x3220, 0x3247,
0x3280, 0x32B0,
0x32C0, 0x32CB,
0x30FB, 0x30FB,
0x32FF, 0x32FF,
0x3358, 0x3370,
0x337B, 0x337F,
0x33E0, 0x33FE,
0x3400, 0x4DBF,
0x4E00, 0x9FFF,
0xA700, 0xA707,
0xF900, 0xFA6D,
0xFA70, 0xFAD9,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0x16FE2, 0x16FE3,
0x16FF0, 0x16FF1,
0x1D360, 0x1D371,
0x1F250, 0x1F251,
0x20000, 0x2A6DF,
0x2A700, 0x2B739,
0x2B740, 0x2B81D,
0x2B820, 0x2CEA1,
0x2CEB0, 0x2EBE0,
0x2EBF0, 0x2EE5D,
0x2F800, 0x2FA1D,
0x30000, 0x3134A,
0x31350, 0x3347F,
},
varieties = {"Hanzi", "Kanji", "Hanja", "Chu Nom"},
spaces = false,
}
m["Hans"] = {
"Han Ringkas",
185614,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hant"] = {
"Han Tradisional",
178528,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hano"] = process_ranges{
"Hanunoo",
1584045,
"abugida",
aliases = {"Hanunó'o", "Hanuno'o"},
ranges = {
0x1720, 0x1736,
},
}
m["Hatr"] = process_ranges{
"Hatran",
20813038,
"abjad",
ranges = {
0x108E0, 0x108F2,
0x108F4, 0x108F5,
0x108FB, 0x108FF,
},
direction = "rtl",
}
m["Hebr"] = process_ranges{
"Ibrani",
33513,
"abjad", -- more precisely, impure abjad
ranges = {
0x0591, 0x05C7,
0x05D0, 0x05EA,
0x05EF, 0x05F4,
0x2135, 0x2138,
0xFB1D, 0xFB36,
0xFB38, 0xFB3C,
0xFB3E, 0xFB3E,
0xFB40, 0xFB41,
0xFB43, 0xFB44,
0xFB46, 0xFB4F,
},
direction = "rtl",
display_text = "Hebr-common",
sort_key = "Hebr-common",
strip_diacritics = "Hebr-common",
}
m["Hira"] = process_ranges{
"Hiragana",
48332,
"sukukataan",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3041, 0x3096,
0x3099, 0x30A0,
0x30FB, 0x30FC,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFF70, 0xFF70,
0xFF9E, 0xFF9F,
0x1B001, 0x1B11F,
0x1B132, 0x1B132,
0x1B150, 0x1B152,
0x1F200, 0x1F200,
},
varieties = {"Hentaigana"},
spaces = false,
}
m["Hluw"] = process_ranges{
"Hieroglif Anatolia",
521323,
"logogram, sukukataan",
ranges = {
0x14400, 0x14646,
},
wikipedia_article = "Anatolian hieroglyphs",
}
m["Hmng"] = process_ranges{
"Pahawh Hmong",
365954,
"sukukataan separa",
aliases = {"Hmong"},
ranges = {
0x16B00, 0x16B45,
0x16B50, 0x16B59,
0x16B5B, 0x16B61,
0x16B63, 0x16B77,
0x16B7D, 0x16B8F,
},
}
m["Hmnp"] = process_ranges{
"Nyiakeng Puachue Hmong",
33712499,
"alfabet",
ranges = {
0x1E100, 0x1E12C,
0x1E130, 0x1E13D,
0x1E140, 0x1E149,
0x1E14E, 0x1E14F,
},
}
m["Hung"] = process_ranges{
"Hungary Kuno",
446224,
"alfabet",
aliases = {"Hungarian runic"},
ranges = {
0x10C80, 0x10CB2,
0x10CC0, 0x10CF2,
0x10CFA, 0x10CFF,
},
capitalized = true,
direction = "rtl",
}
m["Ibrnn"] = {
"Iberia Timur Laut",
1113155,
"sukukataan separa",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Ibrns"] = {
"Iberia Tenggara",
2305351,
"sukukataan separa",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Image"] = {
-- To be used to avoid any formatting or link processing
"Kemasan Imej",
478798,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Inds"] = {
"Indus",
601388,
aliases = {"Harappan", "Indus Valley"},
}
m["Ipach"] = {
"Abjad Fonetik Antarabangsa",
21204,
aliases = {"IPA"},
ietf_subtag = "Latn",
}
m["Ital"] = process_ranges{
"Italik Kuno",
4891256,
"alfabet",
ranges = {
0x10300, 0x10323,
0x1032D, 0x1032F,
},
translit = "Ital-translit",
}
m["Java"] = process_ranges{
"Jawa",
879704,
"abugida",
ranges = {
0xA980, 0xA9CD,
0xA9CF, 0xA9D9,
0xA9DE, 0xA9DF,
},
}
m["Jurc"] = {
"Jurchen",
912240,
"logogram",
spaces = false,
}
m["Kali"] = process_ranges{
"Kayah Li",
4919239,
"abugida",
ranges = {
0xA900, 0xA92F,
},
}
m["Kana"] = process_ranges{
"Katakana",
82946,
"sukukataan",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3099, 0x309C,
0x30A0, 0x30FF,
0x31F0, 0x31FF,
0x32D0, 0x32FE,
0x3300, 0x3357,
0xFE45, 0xFE46,
0xFF61, 0xFF9F,
0x1AFF0, 0x1AFF3,
0x1AFF5, 0x1AFFB,
0x1AFFD, 0x1AFFE,
0x1B000, 0x1B000,
0x1B120, 0x1B122,
0x1B155, 0x1B155,
0x1B164, 0x1B167,
},
spaces = false,
}
m["Kawi"] = process_ranges{
"Kawi",
975802,
"abugida",
ranges = {
0x11F00, 0x11F10,
0x11F12, 0x11F3A,
0x11F3E, 0x11F5A,
},
}
m["Khar"] = process_ranges{
"Kharoshthi",
1161266,
"abugida",
ranges = {
0x10A00, 0x10A03,
0x10A05, 0x10A06,
0x10A0C, 0x10A13,
0x10A15, 0x10A17,
0x10A19, 0x10A35,
0x10A38, 0x10A3A,
0x10A3F, 0x10A48,
0x10A50, 0x10A58,
},
direction = "rtl",
}
m["Khmr"] = process_ranges{
"Khmer",
1054190,
"abugida",
ranges = {
0x1780, 0x17DD,
0x17E0, 0x17E9,
0x17F0, 0x17F9,
0x19E0, 0x19FF,
},
spaces = false,
normalizationFixes = handle_normalization_fixes{
from = {"ឣ", "ឤ"},
to = {"អ", "អា"}
},
}
m["Khoj"] = process_ranges{
"Khojki",
1740656,
"abugida",
ranges = {
0x0AE6, 0x0AEF,
0xA830, 0xA839,
0x11200, 0x11211,
0x11213, 0x11241,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑈀𑈬𑈱", "𑈀𑈬", "𑈀𑈱", "𑈀𑈳", "𑈁𑈱", "𑈆𑈬", "𑈬𑈰", "𑈬𑈱", "𑉀𑈮"},
to = {"𑈇", "𑈁", "𑈅", "𑈇", "𑈇", "𑈃", "𑈲", "𑈳", "𑈂"}
},
}
m["Khomt"] = {
"Thai Khom",
13023788,
"abugida",
-- Not in Unicode
}
m["Kitl"] = {
"Khitan Besar",
6401797,
"logogram",
spaces = false,
}
m["Kits"] = process_ranges{
"Khitan Kecil",
6401800,
"logogram, sukukataan",
ranges = {
0x16FE4, 0x16FE4,
0x18B00, 0x18CD5,
0x18CFF, 0x18CFF,
},
spaces = false,
}
m["Knda"] = process_ranges{
"Kannada",
839666,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C80, 0x0C8C,
0x0C8E, 0x0C90,
0x0C92, 0x0CA8,
0x0CAA, 0x0CB3,
0x0CB5, 0x0CB9,
0x0CBC, 0x0CC4,
0x0CC6, 0x0CC8,
0x0CCA, 0x0CCD,
0x0CD5, 0x0CD6,
0x0CDD, 0x0CDE,
0x0CE0, 0x0CE3,
0x0CE6, 0x0CEF,
0x0CF1, 0x0CF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA830, 0xA835,
},
normalizationFixes = handle_normalization_fixes{
from = {"ಉಾ", "ಋಾ", "ಒೌ"},
to = {"ಊ", "ೠ", "ಔ"}
},
translit = "kn-translit",
}
m["Kpel"] = {
"Kpelle",
1586299,
"sukukataan",
-- Not in Unicode
}
m["Krai"] = process_ranges{
"Kirat Rai",
123173834,
"abugida",
aliases = {"Rai", "Khambu Rai", "Rai Barṇamālā", "Kirat Khambu Rai"},
ranges = {
0x16D40, 0x16D79,
},
}
m["Kthi"] = process_ranges{
"Kaithi",
1253814,
"abugida",
ranges = {
0x0966, 0x096F,
0xA830, 0xA839,
0x11080, 0x110C2,
0x110CD, 0x110CD,
},
}
m["Kulit"] = {
"Kulitan",
6443044,
"abugida",
-- Not in Unicode
}
m["Lana"] = process_ranges{
"Tai Tham",
1314503,
"abugida",
aliases = {"Tham", "Tua Mueang", "Lanna"},
ranges = {
0x1A20, 0x1A5E,
0x1A60, 0x1A7C,
0x1A7F, 0x1A89,
0x1A90, 0x1A99,
0x1AA0, 0x1AAD,
},
spaces = false,
}
m["Laoo"] = process_ranges{
"Lao",
1815229,
"abugida",
ranges = {
0x0E81, 0x0E82,
0x0E84, 0x0E84,
0x0E86, 0x0E8A,
0x0E8C, 0x0EA3,
0x0EA5, 0x0EA5,
0x0EA7, 0x0EBD,
0x0EC0, 0x0EC4,
0x0EC6, 0x0EC6,
0x0EC8, 0x0ECE,
0x0ED0, 0x0ED9,
0x0EDC, 0x0EDF,
},
spaces = false,
}
m["Latn"] = process_ranges{
"Latin",
8229,
"alfabet",
aliases = {"Roman"},
ranges = {
0x0041, 0x005A,
0x0061, 0x007A,
0x00AA, 0x00AA,
0x00BA, 0x00BA,
0x00C0, 0x00D6,
0x00D8, 0x00F6,
0x00F8, 0x02B8,
0x02C0, 0x02C1,
0x02E0, 0x02E4,
0x0363, 0x036F,
0x0485, 0x0486,
0x0951, 0x0952,
0x10FB, 0x10FB,
0x1D00, 0x1D25,
0x1D2C, 0x1D5C,
0x1D62, 0x1D65,
0x1D6B, 0x1D77,
0x1D79, 0x1DBE,
0x1DF8, 0x1DF8,
0x1E00, 0x1EFF,
0x202F, 0x202F,
0x2071, 0x2071,
0x207F, 0x207F,
0x2090, 0x209C,
0x20F0, 0x20F0,
0x2100, 0x2125,
0x2128, 0x2128,
0x212A, 0x2134,
0x2139, 0x213B,
0x2141, 0x214E,
0x2160, 0x2188,
0x2C60, 0x2C7F,
0xA700, 0xA707,
0xA722, 0xA787,
0xA78B, 0xA7CD,
0xA7D0, 0xA7D1,
0xA7D3, 0xA7D3,
0xA7D5, 0xA7DC,
0xA7F2, 0xA7FF,
0xA92E, 0xA92E,
0xAB30, 0xAB5A,
0xAB5C, 0xAB64,
0xAB66, 0xAB69,
0xFB00, 0xFB06,
0xFF21, 0xFF3A,
0xFF41, 0xFF5A,
0x10780, 0x10785,
0x10787, 0x107B0,
0x107B2, 0x107BA,
0x1DF00, 0x1DF1E,
0x1DF25, 0x1DF2A,
},
varieties = {"Rumi", "Romaji", "Rōmaji", "Romaja"},
capitalized = true,
translit = false,
}
m["Latf"] = {
"Fraktur",
148443,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
other_names = {"Blackletter"}, -- Blackletter is actually the parent "script"
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Latg"] = {
"Gaelia",
1432616,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
other_names = {"Irish"},
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["pjt-Latn"] = {
"Latin",
nil,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Leke"] = {
"Leke",
19572613,
"abugida",
-- Not in Unicode
}
m["Lepc"] = process_ranges{
"Lepcha",
1481626,
"abugida",
aliases = {"Róng"},
ranges = {
0x1C00, 0x1C37,
0x1C3B, 0x1C49,
0x1C4D, 0x1C4F,
},
}
m["Limb"] = process_ranges{
"Limbu",
933796,
"abugida",
ranges = {
0x0965, 0x0965,
0x1900, 0x191E,
0x1920, 0x192B,
0x1930, 0x193B,
0x1940, 0x1940,
0x1944, 0x194F,
},
}
m["Lina"] = process_ranges{
"Linear A",
30972,
ranges = {
0x10107, 0x10133,
0x10600, 0x10736,
0x10740, 0x10755,
0x10760, 0x10767,
},
}
m["Linb"] = process_ranges{
"Linear B",
190102,
ranges = {
0x10000, 0x1000B,
0x1000D, 0x10026,
0x10028, 0x1003A,
0x1003C, 0x1003D,
0x1003F, 0x1004D,
0x10050, 0x1005D,
0x10080, 0x100FA,
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
},
}
m["Lisu"] = process_ranges{
"Fraser",
1194621,
"alfabet",
aliases = {"Old Lisu", "Lisu"},
ranges = {
0x300A, 0x300B,
0xA4D0, 0xA4FF,
0x11FB0, 0x11FB0,
},
normalizationFixes = handle_normalization_fixes{
from = {"['’]", "[.ꓸ][.ꓸ]", "[.ꓸ][,ꓹ]"},
to = {"ʼ", "ꓺ", "ꓻ"}
},
translit = "Lisu-translit",
sort_key = {
from = {"𑾰"},
to = {"ꓬ" .. p[1]}
},
}
m["Loma"] = {
"Loma",
13023816,
"sukukataan",
-- Not in Unicode
}
m["Lyci"] = process_ranges{
"Lycia",
913587,
"alfabet",
ranges = {
0x10280, 0x1029C,
},
}
m["Lydi"] = process_ranges{
"Lydia",
4261300,
"alfabet",
ranges = {
0x10920, 0x10939,
0x1093F, 0x1093F,
},
direction = "rtl",
}
m["Mahj"] = process_ranges{
"Mahajani",
6732850,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11150, 0x11176,
},
}
m["Maka"] = process_ranges{
"Makassar",
72947229,
"abugida",
aliases = {"Old Makasar"},
ranges = {
0x11EE0, 0x11EF8,
},
}
m["Mand"] = process_ranges{
"Mandaia",
1812130,
aliases = {"Mandaean"},
ranges = {
0x0640, 0x0640,
0x0840, 0x085B,
0x085E, 0x085E,
},
direction = "rtl",
}
m["Mani"] = process_ranges{
"Mani",
3544702,
"abjad",
ranges = {
0x0640, 0x0640,
0x10AC0, 0x10AE6,
0x10AEB, 0x10AF6,
},
direction = "rtl",
translit = "Mani-translit",
}
m["Marc"] = process_ranges{
"Marchen",
72403709,
"abugida",
ranges = {
0x11C70, 0x11C8F,
0x11C92, 0x11CA7,
0x11CA9, 0x11CB6,
},
}
m["Maya"] = process_ranges{
"Maya",
211248,
aliases = {"Maya hieroglyphic", "Mayan", "Mayan hieroglyphic"},
ranges = {
0x1D2E0, 0x1D2F3,
},
}
m["Medf"] = process_ranges{
"Medefaidrin",
1519764,
aliases = {"Oberi Okaime", "Oberi Ɔkaimɛ"},
ranges = {
0x16E40, 0x16E9A,
},
capitalized = true,
}
m["Mend"] = process_ranges{
"Mende",
951069,
aliases = {"Mende Kikakui"},
ranges = {
0x1E800, 0x1E8C4,
0x1E8C7, 0x1E8D6,
},
direction = "rtl",
}
m["Merc"] = process_ranges{
"Kursif Meroitik",
73028124,
"abugida",
ranges = {
0x109A0, 0x109B7,
0x109BC, 0x109CF,
0x109D2, 0x109FF,
},
direction = "rtl",
}
m["Mero"] = process_ranges{
"Hieroglif Meroitik",
73028623,
"abugida",
ranges = {
0x10980, 0x1099F,
},
direction = "rtl",
wikipedia_article = "Meroitic hieroglyphs",
}
m["Mlym"] = process_ranges{
"Malayalam",
1164129,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0D00, 0x0D0C,
0x0D0E, 0x0D10,
0x0D12, 0x0D44,
0x0D46, 0x0D48,
0x0D4A, 0x0D4F,
0x0D54, 0x0D63,
0x0D66, 0x0D7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0xA830, 0xA832,
},
normalizationFixes = handle_normalization_fixes{
from = {"ഇൗ", "ഉൗ", "എെ", "ഒാ", "ഒൗ", "ക്", "ണ്", "ന്റ", "ന്", "മ്", "യ്", "ര്", "ല്", "ള്", "ഴ്", "െെ", "ൻ്റ"},
to = {"ഈ", "ഊ", "ഐ", "ഓ", "ഔ", "ൿ", "ൺ", "ൻറ", "ൻ", "ൔ", "ൕ", "ർ", "ൽ", "ൾ", "ൖ", "ൈ", "ന്റ"}
},
translit = "ml-translit",
}
m["Modi"] = process_ranges{
"Modi",
1703713,
"abugida",
ranges = {
0xA830, 0xA839,
0x11600, 0x11644,
0x11650, 0x11659,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑘀𑘹", "𑘀𑘺", "𑘁𑘹", "𑘁𑘺"},
to = {"𑘊", "𑘋", "𑘌", "𑘍"}
},
}
do
local Mong_displaytext = {
from = {"([ᠨ-ᡂᡸ])ᠶ([ᠨ-ᡂᡸ])", "([ᠠ-ᡂᡸ])ᠸ([^᠋ᠠ-ᠧ])", "([ᠠ-ᡂᡸ])ᠸ$"},
to = {"%1ᠢ%2", "%1ᠧ%2", "%1ᠧ"}
}
m["Mong"] = process_ranges{
"Mongol",
1055705,
"alfabet",
aliases = {"Mongol bichig", "Hudum Mongol bichig"},
ranges = {
0x1800, 0x1805,
0x180A, 0x1819,
0x1820, 0x1842,
0x1878, 0x1878,
0x1880, 0x1897,
0x18A6, 0x18A6,
0x18A9, 0x18A9,
0x200C, 0x200D,
0x202F, 0x202F,
0x3001, 0x3002,
0x3008, 0x300B,
0x11660, 0x11668,
},
direction = "vertical-ltr",
display_text = Mong_displaytext,
strip_diacritics = Mong_displaytext,
translit = "Mong-translit",
}
m["mnc-Mong"] = process_ranges{
"Manchu",
122888,
m["Mong"][3],
ranges = {
0x1801, 0x1801,
0x1804, 0x1804,
0x1808, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x185D,
0x185F, 0x1861,
0x1864, 0x1869,
0x186C, 0x1871,
0x1873, 0x1877,
0x1880, 0x1888,
0x188F, 0x188F,
0x189A, 0x18A5,
0x18A8, 0x18A8,
0x18AA, 0x18AA,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "Mong",
translit = "mnc-translit",
}
m["sjo-Mong"] = process_ranges{
"Xibe",
113624153,
m["Mong"][3],
aliases = {"Sibe"},
ranges = {
0x1804, 0x1804,
0x1807, 0x1807,
0x180A, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x1828,
0x182A, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x1872,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "mnc-Mong",
}
m["xwo-Mong"] = process_ranges{
"Todo",
529085,
m["Mong"][3],
aliases = {"Todo", "Todo bichig"},
ranges = {
0x1800, 0x1801,
0x1804, 0x1806,
0x180A, 0x1820,
0x1828, 0x1828,
0x182F, 0x1831,
0x1834, 0x1834,
0x1837, 0x1838,
0x183A, 0x183B,
0x1840, 0x1840,
0x1843, 0x185C,
0x1880, 0x1887,
0x1889, 0x188F,
0x1894, 0x1894,
0x1896, 0x1899,
0x18A7, 0x18A7,
0x200C, 0x200D,
0x202F, 0x202F,
0x11669, 0x1166C,
},
direction = "vertical-ltr",
parent = "Mong",
translit = "xwo-translit",
}
end
m["Moon"] = {
"Moon",
918391,
"alfabet",
aliases = {"Moon System of Embossed Reading", "Moon type", "Moon writing", "Moon alphabet", "Moon code"},
-- Not in Unicode
}
m["Morse"] = {
"Kod Morse",
79897,
ietf_subtag = "Zsym",
}
m["Mroo"] = process_ranges{
"Mru",
75919253,
aliases = {"Mro", "Mrung"},
ranges = {
0x16A40, 0x16A5E,
0x16A60, 0x16A69,
0x16A6E, 0x16A6F,
},
}
m["Mtei"] = process_ranges{
"Meitei Mayek",
2981413,
"abugida",
aliases = {"Meetei Mayek", "Manipuri"},
ranges = {
0xAAE0, 0xAAF6,
0xABC0, 0xABED,
0xABF0, 0xABF9,
},
}
m["Mult"] = process_ranges{
"Multani",
17047906,
"abugida",
ranges = {
0x0A66, 0x0A6F,
0x11280, 0x11286,
0x11288, 0x11288,
0x1128A, 0x1128D,
0x1128F, 0x1129D,
0x1129F, 0x112A9,
},
}
m["Music"] = process_ranges{
"Notasi Muzik",
233861,
"piktogram",
ranges = {
0x2669, 0x266F,
0x1D100, 0x1D126,
0x1D129, 0x1D1EA,
},
ietf_subtag = "Zsym",
translit = false,
}
m["Mymr"] = process_ranges{
"Burma",
43887939,
"abugida",
aliases = {"Myanmar"},
ranges = {
0x1000, 0x109F,
0xA92E, 0xA92E,
0xA9E0, 0xA9FE,
0xAA60, 0xAA7F,
0x116D0, 0x116E3,
},
spaces = false,
}
m["Nagm"] = process_ranges{
"Mundari Bani",
106917274,
"alfabet",
aliases = {"Nag Mundari"},
ranges = {
0x1E4D0, 0x1E4F9,
},
}
m["Nand"] = process_ranges{
"Nandinagari",
6963324,
"abugida",
ranges = {
0x0964, 0x0965,
0x0CE6, 0x0CEF,
0x1CE9, 0x1CE9,
0x1CF2, 0x1CF2,
0x1CFA, 0x1CFA,
0xA830, 0xA835,
0x119A0, 0x119A7,
0x119AA, 0x119D7,
0x119DA, 0x119E4,
},
}
m["Narb"] = process_ranges{
"Arab Utara Kuno",
1472213,
"abjad",
aliases = {"Old North Arabian"},
ranges = {
0x10A80, 0x10A9F,
},
direction = "rtl",
translit = "Narb-translit",
}
m["Nbat"] = process_ranges{
"Nabataea",
855624,
"abjad",
aliases = {"Nabatean"},
ranges = {
0x10880, 0x1089E,
0x108A7, 0x108AF,
},
direction = "rtl",
}
m["Newa"] = process_ranges{
"Newa",
7237292,
"abugida",
aliases = {"Newar", "Newari", "Prachalit Nepal"},
ranges = {
0x11400, 0x1145B,
0x1145D, 0x11461,
},
}
m["Nkdb"] = {
"Dongba",
1190953,
"piktogram",
aliases = {"Naxi Dongba", "Nakhi Dongba", "Tomba", "Tompa", "Mo-so"},
spaces = false,
-- Not in Unicode
}
m["Nkgb"] = {
"Geba",
731189,
"sukukataan",
aliases = {"Nakhi Geba", "Naxi Geba"},
spaces = false,
-- Not in Unicode
}
m["Nkoo"] = process_ranges{
"N'Ko",
1062587,
"alfabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x07C0, 0x07FA,
0x07FD, 0x07FF,
0xFD3E, 0xFD3F,
},
direction = "rtl",
}
m["None"] = {
"tidak ditentukan",
nil,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Nshu"] = process_ranges{
"Nüshu",
56436,
"sukukataan",
aliases = {"Nushu"},
ranges = {
0x16FE1, 0x16FE1,
0x1B170, 0x1B2FB,
},
spaces = false,
}
m["Ogam"] = process_ranges{
"Ogham",
184661,
ranges = {
0x1680, 0x169C,
},
}
m["Olck"] = process_ranges{
"Ol Chiki",
201688,
aliases = {"Ol Chemetʼ", "Ol", "Santali"},
ranges = {
0x1C50, 0x1C7F,
},
}
m["Onao"] = process_ranges{
"Ol Onal",
108607084,
"alfabet",
ranges = {
0x0964, 0x0965,
0x1E5D0, 0x1E5FA,
0x1E5FF, 0x1E5FF,
},
}
m["Orkh"] = process_ranges{
"Turkik Kuno",
5058305,
aliases = {"Orkhon runic"},
ranges = {
0x10C00, 0x10C48,
},
direction = "rtl",
translit = "Orkh-translit",
}
m["Orya"] = process_ranges{
"Odia",
1760127,
"abugida",
aliases = {"Oriya"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B01, 0x0B03,
0x0B05, 0x0B0C,
0x0B0F, 0x0B10,
0x0B13, 0x0B28,
0x0B2A, 0x0B30,
0x0B32, 0x0B33,
0x0B35, 0x0B39,
0x0B3C, 0x0B44,
0x0B47, 0x0B48,
0x0B4B, 0x0B4D,
0x0B55, 0x0B57,
0x0B5C, 0x0B5D,
0x0B5F, 0x0B63,
0x0B66, 0x0B77,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ଅା", "ଏୗ", "ଓୗ"},
to = {"ଆ", "ଐ", "ଔ"}
},
}
m["Osge"] = process_ranges{
"Osage",
7105529,
ranges = {
0x104B0, 0x104D3,
0x104D8, 0x104FB,
},
capitalized = true,
translit = "Osge-translit",
}
m["Osma"] = process_ranges{
"Osmanya",
1377866,
ranges = {
0x10480, 0x1049D,
0x104A0, 0x104A9,
},
}
m["Ougr"] = process_ranges{
"Uyghur Kuno",
1998938,
"abjad, alfabet",
ranges = {
0x0640, 0x0640,
0x10AF2, 0x10AF2,
0x10F70, 0x10F89,
},
-- This should ideally be "vertical-ltr", but getting the CSS right is tricky because it's right-to-left horizontally, but left-to-right vertically. Currently, displaying it vertically causes it to display bottom-to-top.
direction = "rtl",
}
m["Palm"] = process_ranges{
"Palmyra",
17538100,
ranges = {
0x10860, 0x1087F,
},
direction = "rtl",
}
m["Pauc"] = process_ranges{
"Pau Cin Hau",
25339852,
ranges = {
0x11AC0, 0x11AF8,
},
}
m["Pcun"] = {
"Kuneiform Purba",
1650699,
"piktogram",
-- Not in Unicode
}
m["Pelm"] = {
"Elam Purba",
56305763,
"piktogram",
-- Not in Unicode
}
m["Perm"] = process_ranges{
"Permia Kuno",
147899,
ranges = {
0x0483, 0x0483,
0x10350, 0x1037A,
},
}
m["Phag"] = process_ranges{
"Phags-pa",
822836,
"abugida",
ranges = {
0x1802, 0x1803,
0x1805, 0x1805,
0x200C, 0x200D,
0x202F, 0x202F,
0x3002, 0x3002,
0xA840, 0xA877,
},
direction = "vertical-ltr",
}
m["Phli"] = process_ranges{
"Pahlavi Inskripsi",
24089793,
"abjad",
ranges = {
0x10B60, 0x10B72,
0x10B78, 0x10B7F,
},
direction = "rtl",
}
m["Phlp"] = process_ranges{
"Pahlavi Psalter",
7253954,
"abjad",
ranges = {
0x0640, 0x0640,
0x10B80, 0x10B91,
0x10B99, 0x10B9C,
0x10BA9, 0x10BAF,
},
direction = "rtl",
}
m["Phlv"] = {
"Pahlavi Buku",
72403118,
"abjad",
direction = "rtl",
wikipedia_article = "Pahlavi scripts#Book Pahlavi",
-- Not in Unicode
}
m["Phnx"] = process_ranges{
"Phoenicia",
26752,
"abjad",
ranges = {
0x10900, 0x1091B,
0x1091F, 0x1091F,
},
direction = "rtl",
translit = "Phnx-translit",
}
m["Plrd"] = process_ranges{
"Pollard",
601734,
"abugida",
aliases = {"Miao"},
ranges = {
0x16F00, 0x16F4A,
0x16F4F, 0x16F87,
0x16F8F, 0x16F9F,
},
}
m["Prti"] = process_ranges{
"Parthia Inskripsi",
13023804,
ranges = {
0x10B40, 0x10B55,
0x10B58, 0x10B5F,
},
direction = "rtl",
}
m["Psin"] = {
"Sinaitik Purba",
1065250,
"abjad",
direction = "rtl",
-- Not in Unicode
}
m["Ranj"] = {
"Ranjana",
2385276,
"abugida",
-- Not in Unicode
}
m["Rjng"] = process_ranges{
"Rejang",
2007960,
"abugida",
ranges = {
0xA930, 0xA953,
0xA95F, 0xA95F,
},
}
m["Rohg"] = process_ranges{
"Hanifi Rohingya",
21028705,
"alfabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0640, 0x0640,
0x06D4, 0x06D4,
0x10D00, 0x10D27,
0x10D30, 0x10D39,
},
direction = "rtl",
}
m["Roro"] = {
"Rongorongo",
209764,
-- Not in Unicode
}
m["Rumin"] = process_ranges{
"Penomboran Rumi",
nil,
ranges = {
0x10E60, 0x10E7E,
},
ietf_subtag = "Arab",
}
m["Runr"] = process_ranges{
"Rune",
82996,
"alfabet",
ranges = {
0x16A0, 0x16EA,
0x16EE, 0x16F8,
},
}
do
local Samr_stripdiacritics = {
remove_diacritics = c.CGJ .. u(0x0816) .. "-" .. u(0x082D),
}
m["Samr"] = process_ranges{
"Samaria",
1550930,
"abjad",
ranges = {
0x0800, 0x082D,
0x0830, 0x083E,
},
direction = "rtl",
strip_diacritics = Samr_stripdiacritics,
sort_key = Samr_stripdiacritics,
}
end
m["Sarb"] = process_ranges{
"Ancient South Arabian",
446074,
"abjad",
aliases = {"Old South Arabian"},
ranges = {
0x10A60, 0x10A7F,
},
direction = "rtl",
translit = "Sarb-translit",
}
m["Saur"] = process_ranges{
"Saurashtra",
3535165,
"abugida",
ranges = {
0xA880, 0xA8C5,
0xA8CE, 0xA8D9,
},
}
m["Semap"] = {
"flag semaphore",
250796,
"piktogram",
ietf_subtag = "Zsym",
}
m["Sgnw"] = process_ranges{
"SignWriting",
1497335,
"piktogram",
aliases = {"Sutton SignWriting"},
ranges = {
0x1D800, 0x1DA8B,
0x1DA9B, 0x1DA9F,
0x1DAA1, 0x1DAAF,
},
translit = false,
}
m["Shaw"] = process_ranges{
"Shaw",
1970098,
aliases = {"Shaw"},
ranges = {
0x10450, 0x1047F,
},
}
m["Shrd"] = process_ranges{
"Sharada",
2047117,
"abugida",
ranges = {
0x0951, 0x0951,
0x1CD7, 0x1CD7,
0x1CD9, 0x1CD9,
0x1CDC, 0x1CDD,
0x1CE0, 0x1CE0,
0xA830, 0xA835,
0xA838, 0xA838,
0x11180, 0x111DF,
},
translit = "Shrd-translit",
}
m["Shui"] = {
"Sui",
752854,
"logogram",
spaces = false,
-- Not in Unicode
}
m["Sidd"] = process_ranges{
"Siddham",
250379,
"abugida",
ranges = {
0x11580, 0x115B5,
0x115B8, 0x115DD,
},
translit = "Sidd-translit",
}
m["Sidt"] = {
"Sidetic",
36659,
"alfabet",
direction = "rtl",
-- Not in Unicode
}
m["Sind"] = process_ranges{
"Khudabadi",
6402810,
"abugida",
aliases = {"Khudawadi"},
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x112B0, 0x112EA,
0x112F0, 0x112F9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑊰𑋠", "𑊰𑋥", "𑊰𑋦", "𑊰𑋧", "𑊰𑋨"},
to = {"𑊱", "𑊶", "𑊷", "𑊸", "𑊹"}
},
}
m["Sinh"] = process_ranges{
"Sinhala",
1574992,
"abugida",
aliases = {"Sinhala"},
ranges = {
0x0964, 0x0965,
0x0D81, 0x0D83,
0x0D85, 0x0D96,
0x0D9A, 0x0DB1,
0x0DB3, 0x0DBB,
0x0DBD, 0x0DBD,
0x0DC0, 0x0DC6,
0x0DCA, 0x0DCA,
0x0DCF, 0x0DD4,
0x0DD6, 0x0DD6,
0x0DD8, 0x0DDF,
0x0DE6, 0x0DEF,
0x0DF2, 0x0DF4,
0x1CF2, 0x1CF2,
0x111E1, 0x111F4,
},
normalizationFixes = handle_normalization_fixes{
from = {"අා", "අැ", "අෑ", "උෟ", "ඍෘ", "ඏෟ", "එ්", "එෙ", "ඔෟ", "ෘෘ"},
to = {"ආ", "ඇ", "ඈ", "ඌ", "ඎ", "ඐ", "ඒ", "ඓ", "ඖ", "ෲ"}
},
}
m["Sogd"] = process_ranges{
"Sogdia",
578359,
"abjad",
ranges = {
0x0640, 0x0640,
0x10F30, 0x10F59,
},
direction = "rtl",
}
m["Sogo"] = process_ranges{
"Sogdia Kuno",
72403254,
"abjad",
ranges = {
0x10F00, 0x10F27,
},
direction = "rtl",
}
m["Sora"] = process_ranges{
"Sorang Sompeng",
7563292,
aliases = {"Sora Sompeng"},
ranges = {
0x110D0, 0x110E8,
0x110F0, 0x110F9,
},
}
m["Soyo"] = process_ranges{
"Soyombo",
8009382,
"abugida",
ranges = {
0x11A50, 0x11AA2,
},
}
m["Sund"] = process_ranges{
"Sunda",
51589,
"abugida",
ranges = {
0x1B80, 0x1BBF,
0x1CC0, 0x1CC7,
},
}
m["Sunu"] = process_ranges{
"Sunuwar",
109984965,
"alfabet",
ranges = {
0x11BC0, 0x11BE1,
0x11BF0, 0x11BF9,
},
}
m["Sylo"] = process_ranges{
"Sylheti Nagri",
144128,
"abugida",
aliases = {"Sylheti Nāgarī", "Syloti Nagri"},
ranges = {
0x0964, 0x0965,
0x09E6, 0x09EF,
0xA800, 0xA82C,
},
}
m["Syrc"] = process_ranges{
"Suryani",
26567,
"abjad", -- more precisely, impure abjad
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0640, 0x0640,
0x064B, 0x0655,
0x0670, 0x0670,
0x0700, 0x070D,
0x070F, 0x074A,
0x074D, 0x074F,
0x0860, 0x086A,
0x1DF8, 0x1DF8,
0x1DFA, 0x1DFA,
},
direction = "rtl",
}
-- Syre, Syrj, Syrn are apparently subsumed into Syrc; discuss if this causes issues
m["Tagb"] = process_ranges{
"Tagbanwa",
977444,
"abugida",
ranges = {
0x1735, 0x1736,
0x1760, 0x176C,
0x176E, 0x1770,
0x1772, 0x1773,
},
}
m["Takr"] = process_ranges{
"Takri",
759202,
"abugida",
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x11680, 0x116B9,
0x116C0, 0x116C9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑚀𑚭", "𑚀𑚴", "𑚀𑚵", "𑚆𑚲"},
to = {"𑚁", "𑚈", "𑚉", "𑚇"}
},
}
m["Tale"] = process_ranges{
"Tai Nüa",
2566326,
"abugida",
aliases = {"Tai Nuea", "New Tai Nüa", "New Tai Nuea", "Dehong Dai", "Tai Dehong", "Tai Le"},
ranges = {
0x1040, 0x1049,
0x1950, 0x196D,
0x1970, 0x1974,
},
spaces = false,
}
m["Talu"] = process_ranges{
"Tai Lue Baharu",
3498863,
"abugida",
ranges = {
0x1980, 0x19AB,
0x19B0, 0x19C9,
0x19D0, 0x19DA,
0x19DE, 0x19DF,
},
spaces = false,
}
m["Taml"] = process_ranges{
"Tamil",
26803,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B82, 0x0B83,
0x0B85, 0x0B8A,
0x0B8E, 0x0B90,
0x0B92, 0x0B95,
0x0B99, 0x0B9A,
0x0B9C, 0x0B9C,
0x0B9E, 0x0B9F,
0x0BA3, 0x0BA4,
0x0BA8, 0x0BAA,
0x0BAE, 0x0BB9,
0x0BBE, 0x0BC2,
0x0BC6, 0x0BC8,
0x0BCA, 0x0BCD,
0x0BD0, 0x0BD0,
0x0BD7, 0x0BD7,
0x0BE6, 0x0BFA,
0x1CDA, 0x1CDA,
0xA8F3, 0xA8F3,
0x11301, 0x11301,
0x11303, 0x11303,
0x1133B, 0x1133C,
0x11FC0, 0x11FF1,
0x11FFF, 0x11FFF,
},
normalizationFixes = handle_normalization_fixes{
from = {"அூ", "ஸ்ரீ"},
to = {"ஆ", "ஶ்ரீ"}
},
}
m["Tang"] = process_ranges{
"Tangut",
1373610,
"logogram, sukukataan",
ranges = {
0x31EF, 0x31EF,
0x16FE0, 0x16FE0,
0x17000, 0x187F7,
0x18800, 0x18AFF,
0x18D00, 0x18D08,
},
spaces = false,
translit = "txg-translit",
}
m["Tavt"] = process_ranges{
"Tai Viet",
11818517,
"abugida",
ranges = {
0xAA80, 0xAAC2,
0xAADB, 0xAADF,
},
spaces = false,
}
m["Tayo"] = process_ranges{
"Lai Tay",
16306701,
"abugida",
aliases = {"Tai Yo"},
direction = "vertical-rtl",
ranges = {
0x1E6C0, 0x1E6DE,
0x1E6E0, 0x1E6F5,
0x1E6FE, 0x1E6FF,
},
spaces = false,
}
m["Telu"] = process_ranges{
"Telugu",
570450,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C00, 0x0C0C,
0x0C0E, 0x0C10,
0x0C12, 0x0C28,
0x0C2A, 0x0C39,
0x0C3C, 0x0C44,
0x0C46, 0x0C48,
0x0C4A, 0x0C4D,
0x0C55, 0x0C56,
0x0C58, 0x0C5A,
0x0C5D, 0x0C5D,
0x0C60, 0x0C63,
0x0C66, 0x0C6F,
0x0C77, 0x0C7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ఒౌ", "ఒౕ", "ిౕ", "ెౕ", "ొౕ"},
to = {"ఔ", "ఓ", "ీ", "ే", "ో"}
},
}
m["Teng"] = {
"Tengwar",
473725,
}
m["Tfng"] = process_ranges{
"Tifinagh",
208503,
"abjad, alfabet",
ranges = {
0x2D30, 0x2D67,
0x2D6F, 0x2D70,
0x2D7F, 0x2D7F,
},
other_names = {"Libyco-Berber", "Berber"}, -- per Wikipedia, Libyco-Berber is the parent
}
m["Tglg"] = process_ranges{
"Baybayin",
812124,
"abugida",
aliases = {"Tagalog"},
varieties = {"Badlit", "Basahan", "Kur-itan"},
ranges = {
0x1700, 0x1715,
0x171F, 0x171F,
0x1735, 0x1736,
},
}
m["Thaa"] = process_ranges{
"Thaana",
877906,
"abugida",
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0660, 0x0669,
0x0780, 0x07B1,
0xFDF2, 0xFDF2,
0xFDFD, 0xFDFD,
},
direction = "rtl",
}
m["Thai"] = process_ranges{
"Thai",
236376,
"abugida",
ranges = {
0x0E01, 0x0E3A,
0x0E40, 0x0E5B,
},
spaces = false,
}
do
local Tibt_displaytext = {
from = {"ༀ", "༌", "།།", "༚༚", "༚༝", "༝༚", "༝༝", "ཷ", "ཹ", "ེེ", "ོོ"},
to = {"ཨོཾ", "་", "༎", "༛", "༟", "࿎", "༞", "ྲཱྀ", "ླཱྀ", "ཻ", "ཽ"}
}
m["Tibt"] = process_ranges{
"Tibet",
46861,
"abugida",
ranges = {
0x0F00, 0x0F47,
0x0F49, 0x0F6C,
0x0F71, 0x0F97,
0x0F99, 0x0FBC,
0x0FBE, 0x0FCC,
0x0FCE, 0x0FD4,
0x0FD9, 0x0FDA,
0x3008, 0x300B,
},
normalizationFixes = handle_normalization_fixes{
combiningClasses = {["༹"] = 1},
from = {"ཷ", "ཹ"},
to = {"ྲཱྀ", "ླཱྀ"}
},
display_text = Tibt_displaytext,
strip_diacritics = Tibt_displaytext,
sort_key = "Tibt-sortkey",
translit = "Tibt-translit",
}
m["sit-tam-Tibt"] = {
"Tamyig",
109875213,
m["Tibt"][3],
-- There is no inheritance of properties currently implemented for scripts. Per [[User:Theknightwho]], this
-- is because it's tricky to do since there are several types of child scripts: those that are mere display
-- variants (like fa-Arab), which should be eliminated in favor of CSS language selectors to
-- handle the font differences; those that are genuinely different scripts that happen to share the same
-- Unicode codepoints but have mostly different properties (e.g. Manchu vs. Mongolian); and those that are
-- somewhere in between (like Tamyig vs. Tibetan). As a result, we currently have to manually specify
-- which properties we want inherited as follows.
ranges = m["Tibt"].ranges,
characters = m["Tibt"].characters,
parent = "Tibt",
normalizationFixes = m["Tibt"].normalizationFixes,
display_text = m["Tibt"].display_text,
strip_diacritics = m["Tibt"].strip_diacritics,
sort_key = m["Tibt"].sort_key,
translit = m["Tibt"].translit,
}
end
m["Tirh"] = process_ranges{
"Tirhuta",
1765752,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x1CF2, 0x1CF2,
0xA830, 0xA839,
0x11480, 0x114C7,
0x114D0, 0x114D9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑒁𑒰", "𑒋𑒺", "𑒍𑒺", "𑒪𑒵", "𑒪𑒶"},
to = {"𑒂", "𑒌", "𑒎", "𑒉", "𑒊"}
},
}
m["Tnsa"] = process_ranges{
"Tangsa",
105576311,
"alfabet",
ranges = {
0x16A70, 0x16ABE,
0x16AC0, 0x16AC9,
},
}
m["Todr"] = process_ranges{
"Todhri",
10274731,
"alfabet",
direction = "rtl",
ranges = {
0x105C0, 0x105F3,
},
}
m["Tols"] = {
"Tolong Siki",
4459822,
"alfabet",
-- Not in Unicode
}
m["Toto"] = process_ranges{
"Toto",
104837516,
"abugida",
ranges = {
0x1E290, 0x1E2AE,
},
}
m["Tutg"] = process_ranges{
"Tigalari",
2604990,
"abugida",
aliases = {"Tulu"},
ranges = {
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA8F1, 0xA8F1,
0x11380, 0x11389,
0x1138B, 0x1138B,
0x1138E, 0x1138E,
0x11390, 0x113B5,
0x113B7, 0x113C0,
0x113C2, 0x113C2,
0x113C5, 0x113C5,
0x113C7, 0x113CA,
0x113CC, 0x113D5,
0x113D7, 0x113D8,
0x113E1, 0x113E2,
},
}
m["Ugar"] = process_ranges{
"Ugarit",
332652,
"abjad",
ranges = {
0x10380, 0x1039D,
0x1039F, 0x1039F,
},
}
m["Vaii"] = process_ranges{
"Vai",
523078,
"sukukataan",
ranges = {
0xA500, 0xA62B,
},
}
m["Visp"] = {
"Visible Speech",
1303365,
"alfabet",
-- Not in Unicode
}
m["Vith"] = process_ranges{
"Vithkuq",
3301993,
"alfabet",
ranges = {
0x10570, 0x1057A,
0x1057C, 0x1058A,
0x1058C, 0x10592,
0x10594, 0x10595,
0x10597, 0x105A1,
0x105A3, 0x105B1,
0x105B3, 0x105B9,
0x105BB, 0x105BC,
},
capitalized = true,
}
m["Wara"] = process_ranges{
"Varang Kshiti",
79199,
aliases = {"Warang Citi"},
ranges = {
0x118A0, 0x118F2,
0x118FF, 0x118FF,
},
capitalized = true,
}
m["Wcho"] = process_ranges{
"Wancho",
33713728,
"alfabet",
ranges = {
0x1E2C0, 0x1E2F9,
0x1E2FF, 0x1E2FF,
},
}
m["Wole"] = {
"Woleai",
6643710,
"sukukataan",
-- Not in Unicode
}
m["Xpeo"] = process_ranges{
"Parsi Kuno",
1471822,
ranges = {
0x103A0, 0x103C3,
0x103C8, 0x103D5,
},
}
m["Xsux"] = process_ranges{
"Kuneiform",
401,
aliases = {"Sumero-Akkadian Cuneiform"},
ranges = {
0x12000, 0x12399,
0x12400, 0x1246E,
0x12470, 0x12474,
0x12480, 0x12543,
},
}
m["Yezi"] = process_ranges{
"Yezidi",
13175481,
"alfabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0660, 0x0669,
0x10E80, 0x10EA9,
0x10EAB, 0x10EAD,
0x10EB0, 0x10EB1,
},
direction = "rtl",
}
m["Yiii"] = process_ranges{
"Yi",
1197646,
"sukukataan",
ranges = {
0x3001, 0x3002,
0x3008, 0x3011,
0x3014, 0x301B,
0x30FB, 0x30FB,
0xA000, 0xA48C,
0xA490, 0xA4C6,
0xFF61, 0xFF65,
},
}
m["Zanb"] = process_ranges{
"Zanabazar Square",
50809208,
"abugida",
ranges = {
0x11A00, 0x11A47,
},
}
m["Zmth"] = process_ranges{
"Notasi Matematik",
1140046,
ranges = {
0x00AC, 0x00AC,
0x00B1, 0x00B1,
0x00D7, 0x00D7,
0x00F7, 0x00F7,
0x03D0, 0x03D2,
0x03D5, 0x03D5,
0x03F0, 0x03F1,
0x03F4, 0x03F6,
0x0606, 0x0608,
0x2016, 0x2016,
0x2032, 0x2034,
0x2040, 0x2040,
0x2044, 0x2044,
0x2052, 0x2052,
0x205F, 0x205F,
0x2061, 0x2064,
0x207A, 0x207E,
0x208A, 0x208E,
0x20D0, 0x20DC,
0x20E1, 0x20E1,
0x20E5, 0x20E6,
0x20EB, 0x20EF,
0x2102, 0x2102,
0x2107, 0x2107,
0x210A, 0x2113,
0x2115, 0x2115,
0x2118, 0x211D,
0x2124, 0x2124,
0x2128, 0x2129,
0x212C, 0x212D,
0x212F, 0x2131,
0x2133, 0x2138,
0x213C, 0x2149,
0x214B, 0x214B,
0x2190, 0x21A7,
0x21A9, 0x21AE,
0x21B0, 0x21B1,
0x21B6, 0x21B7,
0x21BC, 0x21DB,
0x21DD, 0x21DD,
0x21E4, 0x21E5,
0x21F4, 0x22FF,
0x2308, 0x230B,
0x2320, 0x2321,
0x237C, 0x237C,
0x239B, 0x23B5,
0x23B7, 0x23B7,
0x23D0, 0x23D0,
0x23DC, 0x23E2,
0x25A0, 0x25A1,
0x25AE, 0x25B7,
0x25BC, 0x25C1,
0x25C6, 0x25C7,
0x25CA, 0x25CB,
0x25CF, 0x25D3,
0x25E2, 0x25E2,
0x25E4, 0x25E4,
0x25E7, 0x25EC,
0x25F8, 0x25FF,
0x2605, 0x2606,
0x2640, 0x2640,
0x2642, 0x2642,
0x2660, 0x2663,
0x266D, 0x266F,
0x27C0, 0x27FF,
0x2900, 0x2AFF,
0x2B30, 0x2B44,
0x2B47, 0x2B4C,
0xFB29, 0xFB29,
0xFE61, 0xFE66,
0xFE68, 0xFE68,
0xFF0B, 0xFF0B,
0xFF1C, 0xFF1E,
0xFF3C, 0xFF3C,
0xFF3E, 0xFF3E,
0xFF5C, 0xFF5C,
0xFF5E, 0xFF5E,
0xFFE2, 0xFFE2,
0xFFE9, 0xFFEC,
0x1D400, 0x1D454,
0x1D456, 0x1D49C,
0x1D49E, 0x1D49F,
0x1D4A2, 0x1D4A2,
0x1D4A5, 0x1D4A6,
0x1D4A9, 0x1D4AC,
0x1D4AE, 0x1D4B9,
0x1D4BB, 0x1D4BB,
0x1D4BD, 0x1D4C3,
0x1D4C5, 0x1D505,
0x1D507, 0x1D50A,
0x1D50D, 0x1D514,
0x1D516, 0x1D51C,
0x1D51E, 0x1D539,
0x1D53B, 0x1D53E,
0x1D540, 0x1D544,
0x1D546, 0x1D546,
0x1D54A, 0x1D550,
0x1D552, 0x1D6A5,
0x1D6A8, 0x1D7CB,
0x1D7CE, 0x1D7FF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
translit = false,
}
m["Zname"] = process_ranges{
"Notasi Muzik Znamenny",
965834,
"piktogram",
ranges = {
0x1CF00, 0x1CF2D,
0x1CF30, 0x1CF46,
0x1CF50, 0x1CFC3,
},
ietf_subtag = "Zsym",
translit = false,
}
m["Zsym"] = process_ranges{
"Simbolik",
80071,
"piktogram",
ranges = {
0x20DD, 0x20E0,
0x20E2, 0x20E4,
0x20E7, 0x20EA,
0x20F0, 0x20F0,
0x2100, 0x2101,
0x2103, 0x2106,
0x2108, 0x2109,
0x2114, 0x2114,
0x2116, 0x2117,
0x211E, 0x2123,
0x2125, 0x2127,
0x212A, 0x212B,
0x212E, 0x212E,
0x2132, 0x2132,
0x2139, 0x213B,
0x214A, 0x214A,
0x214C, 0x214F,
0x21A8, 0x21A8,
0x21AF, 0x21AF,
0x21B2, 0x21B5,
0x21B8, 0x21BB,
0x21DC, 0x21DC,
0x21DE, 0x21E3,
0x21E6, 0x21F3,
0x2300, 0x2307,
0x230C, 0x231F,
0x2322, 0x237B,
0x237D, 0x239A,
0x23B6, 0x23B6,
0x23B8, 0x23CF,
0x23D1, 0x23DB,
0x23E3, 0x23FF,
0x2500, 0x259F,
0x25A2, 0x25AD,
0x25B8, 0x25BB,
0x25C2, 0x25C5,
0x25C8, 0x25C9,
0x25CC, 0x25CE,
0x25D4, 0x25E1,
0x25E3, 0x25E3,
0x25E5, 0x25E6,
0x25ED, 0x25F7,
0x2600, 0x2604,
0x2607, 0x263F,
0x2641, 0x2641,
0x2643, 0x265F,
0x2664, 0x266C,
0x2670, 0x27BF,
0x2B00, 0x2B2F,
0x2B45, 0x2B46,
0x2B4D, 0x2B73,
0x2B76, 0x2B95,
0x2B97, 0x2BFF,
0x4DC0, 0x4DFF,
0x1F000, 0x1F02B,
0x1F030, 0x1F093,
0x1F0A0, 0x1F0AE,
0x1F0B1, 0x1F0BF,
0x1F0C1, 0x1F0CF,
0x1F0D1, 0x1F0F5,
0x1F300, 0x1F6D7,
0x1F6DC, 0x1F6EC,
0x1F6F0, 0x1F6FC,
0x1F700, 0x1F776,
0x1F77B, 0x1F7D9,
0x1F7E0, 0x1F7EB,
0x1F7F0, 0x1F7F0,
0x1F800, 0x1F80B,
0x1F810, 0x1F847,
0x1F850, 0x1F859,
0x1F860, 0x1F887,
0x1F890, 0x1F8AD,
0x1F8B0, 0x1F8B1,
0x1F900, 0x1FA53,
0x1FA60, 0x1FA6D,
0x1FA70, 0x1FA7C,
0x1FA80, 0x1FA88,
0x1FA90, 0x1FABD,
0x1FABF, 0x1FAC5,
0x1FACE, 0x1FADB,
0x1FAE0, 0x1FAE8,
0x1FAF0, 0x1FAF8,
0x1FB00, 0x1FB92,
0x1FB94, 0x1FBCA,
0x1FBF0, 0x1FBF9,
},
translit = false,
character_category = false, -- none
}
m["Zxxx"] = {
"unwritten",
104839715,
-- This should not have any characters listed
translit = false,
character_category = false, -- none
}
m["Zyyy"] = {
"undetermined",
104839687,
-- This should not have any characters listed, probably
translit = false,
character_category = false, -- none
}
m["Zzzz"] = {
"Tidak Terkod",
104839675,
-- This should not have any characters listed
translit = false,
character_category = false, -- none
}
-- These should be defined after the scripts they are composed of.
m["Hrkt"] = process_ranges{
"Kana",
187659,
"sukukataan",
aliases = {"Japanese syllabaries"},
ranges = union(
m["Hira"].ranges,
m["Kana"].ranges
),
spaces = false,
}
m["Jpan"] = process_ranges{
"Jepun",
190502,
"logogram, sukukataan",
ranges = union(
m["Hrkt"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
spaces = false,
sort_by_scraping = true,
}
m["Kore"] = process_ranges{
"Korea",
711797,
"logogram, sukukataan",
ranges = union(
m["Hang"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
-- `漢字(한자)`→`漢字`
-- `가-나-다`→`가나다`, `가--나--다`→`가-나-다`
-- `온돌(溫突/溫堗)`→`온돌` ([[ondol]])
strip_diacritics = {
remove_diacritics = u(0x302E) .. u(0x302F),
from = {"([" .. m["Hani"].characters .. "])%(.-%)", "^%-", "%-$", "%-(%-?)", "\1", "%([" .. m["Hani"].characters .. "/]+%)"},
to = {"%1", "\1", "\1", "%1", "-"}
}
}
return require("Module:languages").finalizeData(m, "script")
i5lsnqjtqr5sgrt7skls3fdv0v510zm
Modul:yi-translit
828
10112
373587
95158
2026-09-11T19:35:56Z
SNN95
2113
kemaskini
373587
Scribunto
text/plain
local export = {}
local tt = {
["א"] = "q",
["אָ"] = "o",
["אַ"] = "a",
["בּ"] = "b",
["ב"] = "b",
["בֿ"] = "v",
["גּ"] = "g",
["ג"] = "g",
["גֿ"] = "g",
["דּ"] = "d",
["ד"] = "d",
["דֿ"] = "d",
["ה"] = "H",
["ו"] = "w",
["וּ"] = "u",
["וו"] = "v",
["װ"] = "v",
["וי"] = "oy",
["ױ"] = "oy",
["ז"] = "z",
["ח"] = "kh",
["ט"] = "t",
["י"] = "y",
["יִ"] = "i",
["יִ"] = "i",
["יי"] = "ey",
["ײ"] = "ey",
["ייַ"] = "ay",
["ײַ"] = "ay",
["ײַ"] = "ay",
["כּ"] = "k",
["כ"] = "kh",
["כֿ"] = "kh",
["ךּ"] = "k",
["ך"] = "kh",
["ךֿ"] = "kh",
["ל"] = "l",
["מ"] = "m",
["ם"] = "m",
["נ"] = "n",
["ן"] = "n",
["ס"] = "s",
["ע"] = "e",
["פּ"] = "p",
["פ"] = "F",
["פֿ"] = "f",
["ףּ"] = "p",
["ף"] = "f",
["ףֿ"] = "f",
["צ"] = "ts",
["ץ"] = "ts",
["ק"] = "k",
["ר"] = "r",
["שׁ"] = "sh",
["ש"] = "sh",
["שׂ"] = "s",
["תּ"] = "t",
["ת"] = "s",
["תֿ"] = "s",
["־"] = "-",
["׳"] = "'",
["״"] = "\"",
}
-- in precedence order
local tokens = {
"ייַ",
"אָ",
"אַ",
"בּ",
"בֿ",
"גּ",
"גֿ",
"דּ",
"דֿ",
"וּ",
"וו",
"יִ",
"יִ",
"יי",
"ײַ",
"וי",
"כּ",
"כֿ",
"ךּ",
"ךֿ",
"פּ",
"פֿ",
"ףּ",
"ףֿ",
"שׁ",
"שׂ",
"תּ",
"תֿ",
"א",
"ב",
"ג",
"ד",
"ה",
"ו",
"ױ",
"װ",
"ז",
"ח",
"ט",
"י",
"ײ",
"ײַ",
"כ",
"ך",
"ל",
"מ",
"ם",
"נ",
"ן",
"ס",
"ע",
"פ",
"ף",
"צ",
"ץ",
"ק",
"ר",
"ש",
"ת",
"־",
"׳",
"״",
}
local hebrew_only_tokens = {
"בֿ",
"ח",
"כּ",
"שׂ",
"ת",
}
local function track(page)
require("Module:debug/track")("yi-translit/" .. page)
return true
end
function export.tr(text, lang, sc)
local hebrew_only = false
for _, token in ipairs(hebrew_only_tokens) do
if string.find(text, token) ~= nil then
hebrew_only = true
break
end
end
for _, token in ipairs(tokens) do
text = string.gsub(text, token, tt[token])
end
local suffix = text ~= '-' and string.sub(text, 1, 1) == '-'
local prefix = text ~= '-' and string.sub(text, -1, -1) == '-'
if suffix then
text = string.gsub(text, "^-", "-q")
end
if prefix then
text = string.gsub(text, "-$", "q-")
end
text = string.gsub(text, "([bcdfFghHjklmnpqrstvwxz])y$", "%1i")
text = string.gsub(text, "([bcdfFghHjklmnpqrstvwxz])y([^aeiouwy])", "%1i%2")
text = string.gsub(text, "([bcdfFghHjklmnpqrstvwxz])y([^aeiouwy])", "%1i%2") -- repeated to handle overlapping cases
text = string.gsub(text, "([abcdefFghHijklmnopqrstuvxyz])w", "%1u")
hebrew_only = hebrew_only or (string.find(text, "w") ~= nil)
text = string.gsub(text, "w", "v")
hebrew_only = hebrew_only or (string.find(text, "F") ~= nil)
text = string.gsub(text, "F$", "p")
text = string.gsub(text, "F([^a-zFH])", "p%1")
text = string.gsub(text, "F", "f")
text = string.gsub(text, "zsh", "zh")
if suffix then
text = string.gsub(text, "^%-q", "-")
end
if prefix then
text = string.gsub(text, "q%-$", "-")
end
text = string.gsub(text, "q([aeo]y)", "%1")
text = string.gsub(text, "q([iu])", "%1")
hebrew_only = hebrew_only or (string.find(text, "q") ~= nil)
text = string.gsub(text, "q", "a")
-- hebrew_only = hebrew_only or (string.find(text, "H[^aeiou]") ~= nil) or (string.find(text, "H$") ~= nil)
text = string.gsub(text, "H", "h")
if hebrew_only then
track("hebrew-only")
end
return text
end
return export
sov0ox12b4vyyfr3kiqjmtr1umbt5cw
Modul:affix
828
10384
373580
373512
2026-09-11T18:45:50Z
SNN95
2113
373580
Scribunto
text/plain
local export = {}
local debug_force_cat = false -- if set to true, always display categories even on userspace pages
local m_links = require("Module:links")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local etymology_module = "Module:etymology"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local utilities_module = "Module:utilities"
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.affix_lang_data_module_prefix = "Module:affix/lang-data/"
local ulen = m_str_utils.len
local rfind = m_str_utils.find
local rmatch = m_str_utils.match
local pluralize = require(en_utilities_module).pluralize
local u = m_str_utils.char
local ucfirst = m_str_utils.ucfirst
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
function export.affix_variants(canonical, variants)
local mappings = {}
for _, variant in ipairs(variants) do
mappings[variant] = canonical
end
return mappings
end
function export.id_mapping(default, ids)
local mapping = { default = default }
if ids then
for id, target in pairs(ids) do
mapping[id] = target
end
end
return mapping
end
function export.id_mapping_with_affix_variants(base, id_variants)
local mappings = {}
for id, variants in pairs(id_variants) do
for _, variant in ipairs(variants) do
mappings[variant] = export.id_mapping(base, {[id] = base})
end
end
return mappings
end
function export.merge_tables(...)
local result = {}
for i = 1, select('#', ...) do
local t = select(i, ...)
if t then
for k, v in pairs(t) do
result[k] = v
end
end
end
return result
end
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.langs_with_lang_specific_data = {
["az"] = true,
["fi"] = true,
["fr"] = true,
["izh"] = true,
["la"] = true,
["sah"] = true,
["tr"] = true,
["trk-pro"] = true,
}
local default_pos = "perkataan"
-- Fungsi khas untuk membetulkan artifak 's' selepas pluralize dijalankan
local function get_normalized_pos(pos)
pos = pos or default_pos
pos = pluralize(pos)
local pos_lower = pos:lower()
if pos_lower == "perkataans" or pos_lower == "terms" or pos_lower == "words" then
return "perkataan"
elseif pos_lower == "istilahs" then
return "istilah"
end
return pos
end
-----------------------------------------------------------------------------------------
-- Template and display hyphens --
-----------------------------------------------------------------------------------------
local ZWNJ = u(0x200C) -- zero-width non-joiner
local template_hyphens = {
["Arab"] = "ـ" .. ZWNJ .. "-",
["Aran"] = "ـ" .. ZWNJ .. "-",
["Hebr"] = "־",
["Mong"] = "᠊",
}
local lookup_hyphens = {
["Hebr"] = "־",
["Arab"] = "ـ",
["Aran"] = "ـ",
}
local function default_display_hyphen(script, hyph)
if not hyph then
return template_hyphens[script] or "-"
end
return hyph
end
local function arab_get_display_hyphen(_script, hyph)
if not hyph then
return "ـ" -- tatweel
elseif hyph == ZWNJ then
return ""
else
return hyph
end
end
local function no_display_hyphen(_script, _hyph)
return ""
end
local display_hyphens = {
["Arab"] = arab_get_display_hyphen,
["Aran"] = arab_get_display_hyphen,
["Bopo"] = no_display_hyphen,
["Hani"] = no_display_hyphen,
["Hans"] = no_display_hyphen,
["Hant"] = no_display_hyphen,
["Jpan"] = no_display_hyphen,
["Jurc"] = no_display_hyphen,
["Kitl"] = no_display_hyphen,
["Kits"] = no_display_hyphen,
["Laoo"] = no_display_hyphen,
["Nshu"] = no_display_hyphen,
["Shui"] = no_display_hyphen,
["Tang"] = no_display_hyphen,
["Thaa"] = no_display_hyphen,
["Thai"] = no_display_hyphen,
["Tibt"] = no_display_hyphen,
}
-----------------------------------------------------------------------------------------
-- Basic Utility functions --
-----------------------------------------------------------------------------------------
local function glossary_link(entry, text)
text = text or entry
return "[[Lampiran:Glosari#" .. entry .. "|" .. text .. "]]"
end
local function track(page)
if type(page) == "table" then
for i, pg in ipairs(page) do
page[i] = "affix/" .. pg
end
else
page = "affix/" .. page
end
require("Module:debug/track")(page)
end
local function ine(val)
return val ~= "" and val or nil
end
-----------------------------------------------------------------------------------------
-- Compound types --
-----------------------------------------------------------------------------------------
local function make_compound_type(anchor, malay_text)
malay_text = malay_text or anchor
return {
text = "kata majmuk " .. glossary_link(anchor, malay_text),
cat = "Kata majmuk " .. malay_text,
}
end
local function make_non_glossary_compound_type(anchor, malay_text)
malay_text = malay_text or anchor
local link = "[[" .. anchor .. "|" .. malay_text .. "]]"
return {
text = "kata majmuk " .. link,
cat = "Kata majmuk " .. malay_text,
}
end
local function make_raw_compound_type(anchor, malay_text)
malay_text = malay_text or anchor
return {
text = glossary_link(anchor, malay_text),
cat = malay_text,
}
end
local function make_borrowing_type(anchor, malay_text)
malay_text = malay_text or anchor
return {
text = glossary_link(anchor, malay_text),
borrowing_type = malay_text,
}
end
export.etymology_types = {
["adapted borrowing"] = make_borrowing_type("adapted borrowing", "pinjaman yang disesuaikan"),
["adap"] = "adapted borrowing",
["abor"] = "adapted borrowing",
["alliterative"] = make_non_glossary_compound_type("alliterative", "aliterasi"),
["allit"] = "alliterative",
["antonymous"] = make_non_glossary_compound_type("antonymous", "antonim"),
["ant"] = "antonymous",
["bahuvrihi"] = make_compound_type("bahuvrihi", "bahuvrīhi"),
["bahu"] = "bahuvrihi",
["bv"] = "bahuvrihi",
["coordinative"] = make_compound_type("coordinative", "koordinatif"),
["coord"] = "coordinative",
["descriptive"] = make_compound_type("descriptive", "deskriptif"),
["desc"] = "descriptive",
["determinative"] = make_compound_type("determinative", "determinatif"),
["det"] = "determinative",
["dvandva"] = make_compound_type("dvandva"),
["dva"] = "dvandva",
["dvigu"] = make_compound_type("dvigu"),
["dvi"] = "dvigu",
["endocentric"] = make_compound_type("endocentric", "endosentrik"),
["endo"] = "endocentric",
["exocentric"] = make_compound_type("exocentric", "eksosentrik"),
["exo"] = "exocentric",
["izafet I"] = make_compound_type("izafet I"),
["iz1"] = "izafet I",
["izafet II"] = make_compound_type("izafet II"),
["iz2"] = "izafet II",
["izafet III"] = make_compound_type("izafet III"),
["iz3"] = "izafet III",
["karmadharaya"] = make_compound_type("karmadharaya", "karmadhāraya"),
["karma"] = "karmadharaya",
["kd"] = "karmadharaya",
["kenning"] = make_raw_compound_type("kenning"),
["ken"] = "kenning",
["rhyming"] = make_non_glossary_compound_type("rhyming", "berima"),
["rhy"] = "rhyming",
["synonymous"] = make_non_glossary_compound_type("synonymous", "sinonim"),
["syn"] = "synonymous",
["tatpurusa"] = make_compound_type("tatpurusa", "tatpuruṣa"),
["tat"] = "tatpurusa",
["tp"] = "tatpurusa",
}
local function process_etymology_type(typ, nocap, notext, has_parts, lang)
local text_sections = {}
local categories = {}
local borrowing_type
if typ then
local typdata = export.etymology_types[typ]
if type(typdata) == "string" then
typdata = export.etymology_types[typdata]
end
if not typdata then
error("Ralat dalaman: Jenis tidak dikenali '" .. typ .. "'")
end
local text = typdata.text
if not nocap then
text = ucfirst(text)
end
local cat = typdata.cat
borrowing_type = typdata.borrowing_type
local oftext = typdata.oftext or " daripada"
if not notext then
table.insert(text_sections, text)
if has_parts then
table.insert(text_sections, oftext)
table.insert(text_sections, " ")
end
end
if cat then
table.insert(categories, cat .. " bahasa " .. lang:getFullName())
end
end
return text_sections, categories, borrowing_type
end
-----------------------------------------------------------------------------------------
-- Utility functions --
-----------------------------------------------------------------------------------------
local function ipairs_with_gaps(t)
local indices = m_table.numKeys(t)
local max_index = #indices > 0 and math.max(unpack(indices)) or 0
local i = 0
return function()
if i < max_index then
i = i + 1
return i, t[i]
end
end
end
export.ipairs_with_gaps = ipairs_with_gaps
function export.join_formatted_parts(data)
local cattext
local lang = data.data.lang
local force_cat = data.data.force_cat or debug_force_cat
if data.data.nocat then
cattext = ""
else
for i, cat in ipairs(data.categories) do
if type(cat) == "table" then
data.categories[i] = require(utilities_module).format_categories({cat.cat},
lang, cat.sort_key, cat.sort_base, force_cat)
else
data.categories[i] = require(utilities_module).format_categories({cat}, lang,
data.data.sort_key, nil, force_cat)
end
end
cattext = table.concat(data.categories)
end
local result = table.concat(data.parts_formatted, not data.separator_already_added and " +‎ " or nil) ..
(data.data.lit and ", secara harfiah " .. m_links.mark(data.data.lit, "gloss") or "")
local q = data.data.q
local qq = data.data.qq
local l = data.data.l
local ll = data.data.ll
local infl = data.data.infl
if q and q[1] or qq and qq[1] or l and l[1] or ll and ll[1] or infl and infl[1] then
result = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = result,
q = q,
qq = qq,
l = l,
ll = ll,
infl = infl,
}
end
return result .. cattext
end
local function strip_diacritics_no_links(lang, term)
return lang:stripDiacritics(m_links.remove_links(term))
end
local function canonicalize_part(part, lang, sc)
if not part then
return
end
part.part_lang = part.lang
part.lang = part.lang or lang
part.sc = part.sc or sc
local term = part.term
if not term then
return
elseif not part.fragment then
part.term, part.fragment = m_links.get_fragment(term)
else
part.term = m_links.get_fragment(term)
end
end
function export.link_term(part, data, include_separator)
local result
if part.part_lang then
result = require(etymology_module).format_derived {
lang = data.lang,
terms = {part},
sources = {part.lang},
sort_key = data.sort_key,
nocat = data.nocat,
template_name = "affix",
qualifiers_labels_on_outside = true,
borrowing_type = data.borrowing_type,
force_cat = data.force_cat or debug_force_cat,
}
else
result = m_links.full_link(part, "term", nil, "show qualifiers")
end
if include_separator and part.separator then
return part.separator .. result
else
return result
end
end
local function canonicalize_script_code(scode)
return (scode:gsub("^.*%-", ""))
end
-----------------------------------------------------------------------------------------
-- Affix-handling functions --
-----------------------------------------------------------------------------------------
local function detect_script_and_hyphens(text, lang, sc)
local scode
if sc then
scode = sc:getCode()
else
local possible_script_codes = lang:getScriptCodes()
local num_possible_script_codes = m_table.length(possible_script_codes)
if num_possible_script_codes == 0 then
error("Ralat mendalam! Bahasa " .. lang:getCanonicalName() .. " tidak mempunyai kod skrip.")
end
if num_possible_script_codes == 1 then
scode = possible_script_codes[1]
else
local may_have_nondefault_hyphen = false
for _, script_code in ipairs(possible_script_codes) do
script_code = canonicalize_script_code(script_code)
if template_hyphens[script_code] or display_hyphens[script_code] then
may_have_nondefault_hyphen = true
break
end
end
if not may_have_nondefault_hyphen then
scode = "Latn"
else
scode = lang:findBestScript(text):getCode()
end
end
end
scode = canonicalize_script_code(scode)
local template_hyphen = template_hyphens[scode] or "-"
local lookup_hyphen = lookup_hyphens[scode] or "-"
local display_hyphen = display_hyphens[scode] or default_display_hyphen
return scode, template_hyphen, display_hyphen, lookup_hyphen
end
local function reconstruct_term_per_hyphens(term, affix_type, scode, thyph_re, new_hyphen)
local function get_hyphen(hyph)
if type(new_hyphen) == "string" then
return new_hyphen
end
return new_hyphen(scode, hyph)
end
if affix_type == "non-affix" then
return term
elseif affix_type == "apitan" then
local before, before_hyphen, after_hyphen, after = rmatch(term, "^(.*)" .. thyph_re .. " " .. thyph_re
.. "(.*)$")
if not before or ulen(term) <= 3 then
return term
end
return before .. get_hyphen(before_hyphen) .. " " .. get_hyphen(after_hyphen) .. after
elseif affix_type == "sisipan" or affix_type == "jalinan" then
local before_hyphen, middle, after_hyphen = rmatch(term, "^" .. thyph_re .. "(.*)" .. thyph_re .. "$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "awalan" then
local middle, after_hyphen = rmatch(term, "^(.*)" .. thyph_re .. "$")
if middle and ulen(term) <= 1 then
return term
end
return (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "akhiran" then
local before_hyphen, middle = rmatch(term, "^" .. thyph_re .. "(.*)$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term)
else
error(("Ralat dalaman: Jenis imbuhan tidak dikenali '%s'"):format(affix_type))
end
end
local function lookup_affix_mapping(affix, affix_type, lang, scode, thyph_re, lookup_hyph, affix_id)
local function do_lookup(afx)
local lookup_affix = reconstruct_term_per_hyphens(afx, affix_type, scode, thyph_re, lookup_hyph)
local function do_lookup_for_langcode(langcode)
if export.langs_with_lang_specific_data[langcode] then
local langdata = mw.loadData(export.affix_lang_data_module_prefix .. langcode)
if langdata.affix_mappings then
local mapping = langdata.affix_mappings[lookup_affix]
if mapping then
if type(mapping) == "table" then
mapping = mapping[affix_id] or mapping.default or mapping[affix_id or false]
if mapping then
return mapping
end
else
return mapping
end
end
end
end
end
local langcode = lang:getCode()
local mapping = do_lookup_for_langcode(langcode)
if mapping then
return mapping
end
local full_langcode = lang:getFullCode()
if full_langcode ~= langcode then
mapping = do_lookup_for_langcode(full_langcode)
if mapping then
return mapping
end
end
return nil
end
if affix:find("%[%[") then
return nil
end
return do_lookup(affix) or do_lookup(lang:stripDiacritics(affix)) or nil
end
function export.parse_term_for_affixes(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not term then
return "non-affix", nil, nil, nil
end
if term == "^" then
term = ""
return "non-affix", term, term, term
end
if term:find("^%^") then
local langcode = lang:getCode()
if langcode ~= "ko" and langcode ~= "okm" and langcode ~= "jje" then
error("Penggunaan ^ untuk memaksa status bukan imbuhan tidak lagi disokong; gunakan pengubahsuai sebaris <naf> atau <root> " ..
"selepas komponen tersebut")
end
end
local reconstructed = ""
if term:find("^%*") then
reconstructed = "*"
term = term:gsub("^%*", "")
end
local scode, thyph, dhyph, lhyph = detect_script_and_hyphens(term, lang, sc)
thyph = "([" .. thyph .. "])"
if not affix_type then
if rfind(term, thyph .. " " .. thyph) then
affix_type = "apitan"
else
local has_beginning_hyphen = rfind(term, "^" .. thyph)
local has_ending_hyphen = rfind(term, thyph .. "$")
if has_beginning_hyphen and has_ending_hyphen then
affix_type = "jalinan"
elseif has_ending_hyphen then
affix_type = "awalan"
elseif has_beginning_hyphen then
affix_type = "akhiran"
else
affix_type = "non-affix"
end
end
end
local link_term, display_term, lookup_term
if affix_type == "non-affix" then
link_term = term
display_term = term
lookup_term = term
else
display_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, dhyph)
if do_affix_mapping then
link_term = lookup_affix_mapping(term, affix_type, lang, scode, thyph, lhyph, affix_id)
if link_term then
link_term = reconstruct_term_per_hyphens(link_term, affix_type, scode, thyph, dhyph)
else
link_term = display_term
end
else
link_term = display_term
end
if return_lookup_affix then
lookup_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, lhyph)
else
lookup_term = display_term
end
end
link_term = reconstructed .. link_term
display_term = reconstructed .. display_term
lookup_term = reconstructed .. lookup_term
return affix_type, link_term, display_term, lookup_term
end
function export.make_affix(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not (affix_type == "awalan" or affix_type == "akhiran" or affix_type == "apitan" or affix_type == "sisipan" or
affix_type == "jalinan" or affix_type == "non-affix") then
error("Ralat dalaman: Jenis imbuhan tidak sah " .. (affix_type or "(nil)"))
end
local _, link_term, display_term, lookup_term = export.parse_term_for_affixes(term, lang, sc, affix_type,
do_affix_mapping, return_lookup_affix, affix_id)
return link_term, display_term, lookup_term
end
-----------------------------------------------------------------------------------------
-- Main entry points --
-----------------------------------------------------------------------------------------
local function generate_affix_categories(data)
data.pos = get_normalized_pos(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.surface_analysis or data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local whole_words = 0
local is_affix_or_compound = false
for i, part in ipairs_with_gaps(data.parts) do
part = part or {}
data.parts[i] = part
canonicalize_part(part, data.lang, data.sc)
part.affix_type, part.affix_link_term, part.affix_display_term = export.parse_term_for_affixes(part.term,
part.lang, part.sc, part.type, not part.alt, nil, part.id)
part.term = ine(part.affix_link_term)
part.alt = part.alt or (part.affix_display_term ~= part.affix_link_term and part.affix_display_term) or nil
end
if not data.noaffixcat then
for i, part in ipairs_with_gaps(data.parts) do
local affix_type = part.affix_type
if affix_type ~= "non-affix" then
is_affix_or_compound = true
local part_sort_base = nil
local part_sort = part.sort or data.sort_key
if i == 1 and data.parts[2] and data.parts[2].term then
local part2 = data.parts[2]
part_sort_base = ine(part2.affix_link_term) or ine(part2.alt)
if part_sort_base then
part_sort_base = strip_diacritics_no_links(part2.lang, part_sort_base)
end
end
if part.pos and rfind(part.pos, "patronym") then
table.insert(categories, {cat = "Patronim bahasa " .. data.lang:getFullName(), sort_key = part_sort, sort_base = part_sort_base})
end
if data.pos ~= "perkataan" and part.pos and rfind(part.pos, "diminutive") then
table.insert(categories, {cat = ucfirst(data.pos) .. " diminutif bahasa " .. data.lang:getFullName(), sort_key = part_sort,
sort_base = part_sort_base})
end
if ine(part.affix_link_term) and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, part.affix_link_term) ..
(part.id and " (" .. part.id .. ")" or ""),
sort_key = part_sort, sort_base = part_sort_base})
end
else
whole_words = whole_words + 1
if whole_words == 2 then
is_affix_or_compound = true
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
end
end
end
if not is_affix_or_compound and not data.allow_no_affixes_or_compounds then
error("Parameter tidak menyertakan sebarang imbuhan, dan istilah tersebut bukanlah kata majmuk. Sila berikan sekurang-kurangnya satu imbuhan.")
end
end
return text_sections, categories, borrowing_type
end
function export.show_affix(data)
local text_sections, categories, _ = generate_affix_categories(data)
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if data.surface_analysis then
local text = "dengan " .. glossary_link("surface analysis", "analisis permukaan") .. ", "
if not data.nocap then
text = ucfirst(text)
end
table.insert(text_sections, 1, text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.get_affix_categories_only(data)
local _, categories, _ = generate_affix_categories(data)
return categories
end
function export.show_surface_analysis(data)
data.surface_analysis = true
data.allow_no_affixes_or_compounds = true
return export.show_affix(data)
end
function export.show_compound(data)
data.pos = get_normalized_pos(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local parts_formatted = {}
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
local whole_words = 0
for i, part in ipairs(data.parts) do
canonicalize_part(part, data.lang, data.sc)
local affix_type, link_term, display_term = export.parse_term_for_affixes(part.term, part.lang, part.sc,
part.type, not part.alt, nil, part.id)
if affix_type == "jalinan" or (part.type and part.type ~= "non-affix") then
if link_term and link_term ~= "" and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, link_term), sort_key = part.sort or data.sort_key})
end
part.term = link_term ~= "" and link_term or nil
part.alt = part.alt or (display_term ~= link_term and display_term) or nil
else
if affix_type ~= "non-affix" then
local langcode = data.lang:getCode()
track { affix_type, affix_type .. "/lang/" .. langcode }
local full_langcode = data.lang:getFullCode()
if langcode ~= full_langcode then
track(affix_type .. "/lang/" .. full_langcode)
end
else
whole_words = whole_words + 1
end
end
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if whole_words == 1 then
track("one whole word")
elseif whole_words == 0 then
track("looks like confix")
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.show_compound_like(data)
data.allow_no_affixes_or_compounds = true
local text_sections, categories, _ = generate_affix_categories(data)
if data.cat then
table.insert(categories, data.cat .. " bahasa " .. data.lang:getFullName())
end
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if #data.parts > 0 and data.oftext then
table.insert(text_sections, 1, " " .. data.oftext .. " ")
end
if data.text then
table.insert(text_sections, 1, data.text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
local function make_part_into_affix(part, lang, sc, affix_type)
canonicalize_part(part, lang, sc)
local link_term, display_term = export.make_affix(part.term, part.lang, part.sc, affix_type, not part.alt, nil, part.id)
part.term = link_term
part.alt = part.alt and export.make_affix(part.alt, part.lang, part.sc, affix_type) or (display_term ~= link_term and display_term) or nil
local Latn = require(scripts_module).getByCode("Latn")
part.tr = export.make_affix(part.tr, part.lang, Latn, affix_type)
part.ts = export.make_affix(part.ts, part.lang, Latn, affix_type)
end
local function track_wrong_affix_type(template, part, expected_affix_type)
if part and not part.type then
local affix_type = export.parse_term_for_affixes(part.term, part.lang, part.sc)
if affix_type ~= expected_affix_type then
local part_name = expected_affix_type or "base"
local langcode = part.lang:getCode()
local full_langcode = part.lang:getFullCode()
require("Module:debug/track") {
template,
template .. "/" .. part_name,
template .. "/" .. part_name .. "/" .. (affix_type or "none"),
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. langcode
}
if full_langcode ~= langcode then
require("Module:debug/track")(
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. full_langcode
)
end
end
end
end
local function insert_affix_category(categories, pos, affix_type, part, sort_key, sort_base, lang)
if part.term and not part.part_lang then
local cat = ucfirst(pos) .. " bahasa " .. lang:getFullName() .. " ber" .. affix_type .. " dengan " .. strip_diacritics_no_links(part.lang, part.term) ..
(part.id and " (" .. part.id .. ")" or "")
if sort_key or sort_base then
table.insert(categories, {cat = cat, sort_key = sort_key, sort_base = sort_base})
else
table.insert(categories, cat)
end
end
end
function export.show_circumfix(data)
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("apitan", data.prefix, "awalan")
track_wrong_affix_type("apitan", data.base, nil)
track_wrong_affix_type("apitan", data.suffix, "akhiran")
local circumfix = nil
if data.prefix.term and data.suffix.term then
circumfix = data.prefix.term .. " " .. data.suffix.term
data.prefix.alt = data.prefix.alt or data.prefix.term
data.suffix.alt = data.suffix.alt or data.suffix.term
data.prefix.term = circumfix
data.suffix.term = circumfix
end
local parts_formatted = {}
local categories = {}
local sort_base
if data.base.term then
sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
end
table.insert(parts_formatted, export.link_term(data.prefix, data))
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.suffix, data))
if not data.prefix.part_lang then
table.insert(categories, {cat=ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " dengan apitan " .. strip_diacritics_no_links(data.prefix.lang,
circumfix), sort_key=data.sort_key, sort_base=sort_base})
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_confix(data)
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("confix", data.prefix, "awalan")
track_wrong_affix_type("confix", data.base, nil)
track_wrong_affix_type("confix", data.suffix, "akhiran")
local parts_formatted = {}
local prefix_sort_base
if data.base and data.base.term then
prefix_sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
elseif data.suffix.term then
prefix_sort_base = strip_diacritics_no_links(data.suffix.lang, data.suffix.term)
end
local categories = {}
table.insert(parts_formatted, export.link_term(data.prefix, data))
insert_affix_category(categories, data.pos, "awalan", data.prefix, data.sort_key, prefix_sort_base, data.lang)
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
end
table.insert(parts_formatted, export.link_term(data.suffix, data))
insert_affix_category(categories, data.pos, "akhiran", data.suffix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_infix(data)
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.infix, data.lang, data.sc, "sisipan")
track_wrong_affix_type("sisipan", data.base, nil)
track_wrong_affix_type("sisipan", data.infix, "sisipan")
local parts_formatted = {}
local categories = {}
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.infix, data))
insert_affix_category(categories, data.pos, "sisipan", data.infix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_prefix(data)
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, prefix in ipairs(data.prefixes) do
make_part_into_affix(prefix, data.lang, data.sc, "awalan")
end
for i, prefix in ipairs(data.prefixes) do
track_wrong_affix_type("awalan", prefix, "awalan")
end
track_wrong_affix_type("awalan", data.base, nil)
local parts_formatted = {}
local first_sort_base = nil
local categories = {}
if data.prefixes[2] then
first_sort_base = ine(data.prefixes[2].term) or ine(data.prefixes[2].alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.prefixes[2].lang, first_sort_base)
end
elseif data.base then
first_sort_base = ine(data.base.term) or ine(data.base.alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.base.lang, first_sort_base)
end
end
for i, prefix in ipairs(data.prefixes) do
table.insert(parts_formatted, export.link_term(prefix, data))
insert_affix_category(categories, data.pos, "awalan", prefix, data.sort_key, i == 1 and first_sort_base or nil, data.lang)
end
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_suffix(data)
local categories = {}
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, suffix in ipairs(data.suffixes) do
make_part_into_affix(suffix, data.lang, data.sc, "akhiran")
end
track_wrong_affix_type("akhiran", data.base, nil)
for i, suffix in ipairs(data.suffixes) do
track_wrong_affix_type("akhiran", suffix, "akhiran")
end
local parts_formatted = {}
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
for i, suffix in ipairs(data.suffixes) do
table.insert(parts_formatted, export.link_term(suffix, data))
end
for i, suffix in ipairs(data.suffixes) do
insert_affix_category(categories, data.pos, "akhiran", suffix, nil, nil, data.lang)
if suffix.pos and rfind(suffix.pos, "patronym") then
table.insert(categories, "Patronim bahasa " .. data.lang:getFullName())
end
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
return export
phk8pm6fsslngsc8rykmmj4ssqc0ku4
Modul:languages/print
828
10471
373590
223513
2026-09-12T02:29:35Z
Hakimi97
2668
Mengemas kini mengikut padanan Wikikamus bahasa Inggeris (semakan [[:en:Special:Diff/92363677|92363677]])
373590
Scribunto
text/plain
local export = {}
local byte = string.byte
local concat = table.concat
local escape = require("Module:debug/escape")
local format = string.format
local highlight = require("Module:debug").highlight
local insert = table.insert
local pairs = pairs
local require = require
local sorted_pairs = require("Module:table").sortedPairs
local toJSON = require("Module:JSON").toJSON
local function iterate_data(func, module_name)
for code, data in pairs(require(module_name)) do
func(code, data)
end
end
local function for_code_and_data(func, module_type)
if module_type == "language" then
iterate_data(func, "Module:languages/data/2")
for b = byte("a"), byte("z") do
iterate_data(func, format("Module:languages/data/3/%c", b))
end
iterate_data(func, "Module:languages/data/exceptional")
elseif module_type == "etymology" then
iterate_data(func, "Module:etymology languages/data")
elseif module_type == "family" then
iterate_data(func, "Module:families/data")
elseif module_type == "script" then
iterate_data(func, "Module:scripts/data")
end
end
local function dump_string(s)
return format('"%s"', escape(s, "double"))
end
local function dump_table(data)
local output, i = {"return {"}, 1
for k, v in sorted_pairs(data) do
i = i + 1
output[i] = format("\t[%s] = %s,", dump_string(k), dump_string(v))
end
insert(output, "}")
return concat(output, "\n")
end
local function print_data(t, output)
if output == "plain" then
return dump_table(t)
elseif output == "json" then
return toJSON(t, {compress = true, sort_keys = true})
end
return highlight(dump_table(t))
end
function export.code_to_name(frame)
local args, result = frame.args, {}
for_code_and_data(function(code, data)
local rawname = data[1]
if type(rawname) == "table" then -- e.g. script code `Aran`
for lang, name in pairs(rawname) do
if lang == "default" then
result[code] = name
else
result[code .. ":" .. lang] = name
end
end
else
result[code] = rawname
end
end, args[2])
return print_data(result, args[1])
end
function export.name_to_code(frame)
local args, result = frame.args, {}
local langtype = args[2]
local get_obj
if langtype == "script" then
get_obj = require("Module:scripts").getByCode
else
local get_lang = require("Module:languages").getByCode
function get_obj(code)
return get_lang(code, nil, true, true)
end
end
local function add_name_and_code(name, code)
local current = result[name]
if not current then
result[name] = code
return
end
-- Sometimes, multiple scripts have the same name; less so now than before, but we still (at the
-- moment) have pjt-Latn called "Latin". Prefer the senior code.
local check = get_obj(current)
while check do
if check:getCode() == code then
result[name] = code
break
end
check = check:getParent()
end
end
for_code_and_data(function(code, data)
local rawname = data[1]
if type(rawname) == "table" then -- e.g. script code `Aran`
for _, name in pairs(rawname) do
add_name_and_code(name, code)
end
else
add_name_and_code(rawname, code)
end
end, langtype)
return print_data(result, args[1])
end
function export.appendix_constructed_canonical_names()
local names = {}
for_code_and_data(function(_, data)
if data.type == "appendix-constructed" then
insert(names, data[1])
end
end, "language")
require("Module:collation").sort(names)
return toJSON(names, {compress = true})
end
-- Compare a language data module with its /extra submodule.
local function get_extra_data_diff(suffix)
local data_module = require("Module:languages/data/" .. suffix)
local extra_module = require("Module:languages/data/" .. suffix .. "/extra")
local missing, extraneous = {}, {}
for code in pairs(data_module) do
if extra_module[code] == nil then
insert(missing, code)
end
end
for code in pairs(extra_module) do
if data_module[code] == nil then
insert(extraneous, code)
end
end
require("Module:collation").sort(missing)
require("Module:collation").sort(extraneous)
return missing, extraneous
end
function export.extra_data_diff(frame)
local missing, extraneous = get_extra_data_diff(frame.args[2])
if frame.args[1] == "json" then
return toJSON({ missing = missing, extraneous = extraneous }, { compress = true })
end
return format("missing: %s\nextraneous: %s", concat(missing, ", "), concat(extraneous, ", "))
end
-- Language codes defined in a data module but missing from its /extra submodule.
function export.missing_extra_codes(frame)
local missing, _ = get_extra_data_diff(frame.args[2])
if frame.args[1] == "json" then
return toJSON(missing, { compress = true })
end
return concat(missing, "\n")
end
return export
3ilabr6h5qjvn4er6b1mjjt6m90neg7
Modul:scripts/canonical names
828
11502
373595
249395
2026-09-12T11:07:03Z
Hakimi97
2668
[[MediaWiki:UpdateLanguageNameAndCode.js|dikemas kini menggunakan gajet bahasa]]
373595
Scribunto
text/plain
return {
["Abjad Fonetik Antarabangsa"] = "Ipach",
["Adlam"] = "Adlm",
["Afaka"] = "Afak",
["Ahom"] = "Ahom",
["Albania Kaukasus"] = "Aghb",
["Ancient South Arabian"] = "Sarb",
["Arab"] = "Arab",
["Arab Utara Kuno"] = "Narb",
["Aram Imperial"] = "Armi",
["Armenia"] = "Armn",
["Assam"] = "as-Beng",
["Avesta"] = "Avst",
["Balbodh"] = "Deva",
["Bali"] = "Bali",
["Bamum"] = "Bamu",
["Bassa"] = "Bass",
["Batak"] = "Batk",
["Baybayin"] = "Tglg",
["Bengali"] = "Beng",
["Bhaiksuki"] = "Bhks",
["Blissymbolic"] = "Blis",
["Brahmi"] = "Brah",
["Braille"] = "Brai",
["Buhid"] = "Buhd",
["Burma"] = "Mymr",
["Carian"] = "Cari",
["Chakma"] = "Cakm",
["Cham"] = "Cham",
["Cherokee"] = "Cher",
["Chisoi"] = "Chis",
["Cypro-Minoan"] = "Cpmn",
["Cyprus"] = "Cprt",
["Cyril"] = "Cyrl",
["Cyril Kuno"] = "Cyrs",
["Demotik"] = "Egyd",
["Deseret"] = "Dsrt",
["Devanagari"] = "Deva",
["Dhives Akuru"] = "Diak",
["Dogra"] = "Dogr",
["Dongba"] = "Nkdb",
["Duployan"] = "Dupl",
["Elam Purba"] = "Pelm",
["Elbasan"] = "Elba",
["Elymaic"] = "Elym",
["Fraktur"] = "Latf",
["Fraser"] = "Lisu",
["Gaelia"] = "Latg",
["Garay"] = "Gara",
["Geba"] = "Nkgb",
["Georgia"] = "Geor",
["Glagol"] = "Glag",
["Goth"] = "Goth",
["Grantha"] = "Gran",
["Gujarati"] = "Gujr",
["Gunjala Gondi"] = "Gong",
["Gurmukhi"] = "Guru",
["Habsyah"] = "Ethi",
["Han"] = "Hani",
["Han Ringkas"] = "Hans",
["Han Tradisional"] = "Hant",
["Hangul"] = "Hang",
["Hanifi Rohingya"] = "Rohg",
["Hanunoo"] = "Hano",
["Hatran"] = "Hatr",
["Hieratik"] = "Egyh",
["Hieroglif Anatolia"] = "Hluw",
["Hieroglif Meroitik"] = "Mero",
["Hieroglif Mesir"] = "Egyp",
["Hiragana"] = "Hira",
["Hungary Kuno"] = "Hung",
["Iberia Tenggara"] = "Ibrns",
["Iberia Timur Laut"] = "Ibrnn",
["Ibrani"] = "Hebr",
["Indus"] = "Inds",
["Italik Kuno"] = "Ital",
["Jawa"] = "Java",
["Jepun"] = "Jpan",
["Jurchen"] = "Jurc",
["Kaithi"] = "Kthi",
["Kana"] = "Hrkt",
["Kannada"] = "Knda",
["Katakana"] = "Kana",
["Kawi"] = "Kawi",
["Kayah Li"] = "Kali",
["Kemasan Imej"] = "Image",
["Kharoshthi"] = "Khar",
["Khema"] = "Gukh",
["Khitan Besar"] = "Kitl",
["Khitan Kecil"] = "Kits",
["Khmer"] = "Khmr",
["Khojki"] = "Khoj",
["Khudabadi"] = "Sind",
["Khutsuri"] = "Geok",
["Khwarezmian"] = "Chrs",
["Kirat Rai"] = "Krai",
["Kod Morse"] = "Morse",
["Korea"] = "Kore",
["Kpelle"] = "Kpel",
["Kulitan"] = "Kulit",
["Kuneiform"] = "Xsux",
["Kuneiform Purba"] = "Pcun",
["Kursif Meroitik"] = "Merc",
["Lai Tay"] = "Tayo",
["Lao"] = "Laoo",
["Latin"] = "Latn",
["Leke"] = "Leke",
["Lepcha"] = "Lepc",
["Limbu"] = "Limb",
["Linear A"] = "Lina",
["Linear B"] = "Linb",
["Loma"] = "Loma",
["Lontara"] = "Bugi",
["Lycia"] = "Lyci",
["Lydia"] = "Lydi",
["Mahajani"] = "Mahj",
["Makassar"] = "Maka",
["Malayalam"] = "Mlym",
["Manchu"] = "mnc-Mong",
["Mandaia"] = "Mand",
["Mani"] = "Mani",
["Marchen"] = "Marc",
["Masaram Gondi"] = "Gonm",
["Maya"] = "Maya",
["Medefaidrin"] = "Medf",
["Meitei Mayek"] = "Mtei",
["Mende"] = "Mend",
["Modi"] = "Modi",
["Mongol"] = "Mong",
["Moon"] = "Moon",
["Mru"] = "Mroo",
["Multani"] = "Mult",
["Mundari Bani"] = "Nagm",
["N'Ko"] = "Nkoo",
["Nabataea"] = "Nbat",
["Nandinagari"] = "Nand",
["Newa"] = "Newa",
["Notasi Matematik"] = "Zmth",
["Notasi Muzik"] = "Music",
["Notasi Muzik Znamenny"] = "Zname",
["Nyiakeng Puachue Hmong"] = "Hmnp",
["Nüshu"] = "Nshu",
["Odia"] = "Orya",
["Ogham"] = "Ogam",
["Ol Chiki"] = "Olck",
["Ol Onal"] = "Onao",
["Osage"] = "Osge",
["Osmanya"] = "Osma",
["Pahawh Hmong"] = "Hmng",
["Pahlavi Buku"] = "Phlv",
["Pahlavi Inskripsi"] = "Phli",
["Pahlavi Psalter"] = "Phlp",
["Palmyra"] = "Palm",
["Parsi Kuno"] = "Xpeo",
["Parthia Inskripsi"] = "Prti",
["Pau Cin Hau"] = "Pauc",
["Pazend"] = "pal-Avst",
["Penomboran Rumi"] = "Rumin",
["Permia Kuno"] = "Perm",
["Phags-pa"] = "Phag",
["Phoenicia"] = "Phnx",
["Pollard"] = "Plrd",
["Qibti"] = "Copt",
["Ranjana"] = "Ranj",
["Rejang"] = "Rjng",
["Rongorongo"] = "Roro",
["Rune"] = "Runr",
["Samaria"] = "Samr",
["Saurashtra"] = "Saur",
["Shahmukhi"] = "Aran",
["Sharada"] = "Shrd",
["Shaw"] = "Shaw",
["Siddham"] = "Sidd",
["Sidetic"] = "Sidt",
["SignWriting"] = "Sgnw",
["Simbolik"] = "Zsym",
["Sinaitik Purba"] = "Psin",
["Sinhala"] = "Sinh",
["Sogdia"] = "Sogd",
["Sogdia Kuno"] = "Sogo",
["Sorang Sompeng"] = "Sora",
["Soyombo"] = "Soyo",
["Sui"] = "Shui",
["Suku Kata Kanada"] = "Cans",
["Sunda"] = "Sund",
["Sunuwar"] = "Sunu",
["Suryani"] = "Syrc",
["Sylheti Nagri"] = "Sylo",
["Tagbanwa"] = "Tagb",
["Tai Lue Baharu"] = "Talu",
["Tai Nüa"] = "Tale",
["Tai Tham"] = "Lana",
["Tai Viet"] = "Tavt",
["Takri"] = "Takr",
["Tamil"] = "Taml",
["Tamyig"] = "sit-tam-Tibt",
["Tangsa"] = "Tnsa",
["Tangut"] = "Tang",
["Telugu"] = "Telu",
["Tengwar"] = "Teng",
["Thaana"] = "Thaa",
["Thai"] = "Thai",
["Thai Khom"] = "Khomt",
["Tibet"] = "Tibt",
["Tidak Terkod"] = "Zzzz",
["Tifinagh"] = "Tfng",
["Tigalari"] = "Tutg",
["Tirhuta"] = "Tirh",
["Todhri"] = "Todr",
["Todo"] = "xwo-Mong",
["Tolong Siki"] = "Tols",
["Toto"] = "Toto",
["Turkik Kuno"] = "Orkh",
["Ugarit"] = "Ugar",
["Uyghur Kuno"] = "Ougr",
["Vai"] = "Vaii",
["Varang Kshiti"] = "Wara",
["Visible Speech"] = "Visp",
["Vithkuq"] = "Vith",
["Wancho"] = "Wcho",
["Woleai"] = "Wole",
["Xibe"] = "sjo-Mong",
["Yezidi"] = "Yezi",
["Yi"] = "Yiii",
["Yunani"] = "Grek",
["Zanabazar Square"] = "Zanb",
["Zhuyin"] = "Bopo",
["flag semaphore"] = "Semap",
["tidak ditentukan"] = "None",
["undetermined"] = "Zyyy",
["unwritten"] = "Zxxx",
}
3ujit36h0etxegv5r6d96hwedgajvqd
Modul:descendants tree
828
33742
373586
226945
2026-09-11T19:33:32Z
SNN95
2113
kemaskini
373586
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_remove_comments_module = "Module:string/removeComments"
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function pattern_escape(...)
pattern_escape = require(string_pattern_escape_module)
return pattern_escape(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function track(page)
--[[Special:WhatLinksHere/Wiktionary:Tracking/descendants tree/PAGE]]
return debug_track("descendants tree/" .. page)
end
local function preview_error(what, entry_name, language_name, reason)
mw.log("Could not retrieve " .. what .. " for " .. language_name .. " in the entry [["
.. entry_name .. "]]: " .. reason .. ".")
track(what .. " error")
end
local function get_content_after_senseid(content, entry_name, lang, id)
local code = lang:getFullCode()
local t_start, t_end
-- UGH. We need to set `not_transcluded` to true otherwise the template parser won't find all the templates
-- on large pages. We should probably default `not_transcluded` to true in general.
for template in require("Module:template parser").find_templates(content, true) do
local name = template:get_name()
if name == "senseid" then
local args = template:get_arguments()
if args[1] == code and args[2] == id then
t_start = template.index
end
elseif name == "etymid" then
local args = template:get_arguments()
if args[1] == code and args[2] == id then
t_start = template.index
elseif t_start ~= nil and t_end == nil then
t_end = template.index
end
elseif name == "head" or name == "etymon" then
local args = template:get_arguments()
local id_arg = args.id
if args[1] == code and id_arg == id then
t_start = template.index
elseif id_arg ~= nil and t_start ~= nil and t_end == nil then
t_end = template.index
end
end
end
if t_start == nil then
error("Could not find the correct senseid template in the entry [["
.. entry_name .. "]] (with language " .. code .. " and id '" .. id .. "')")
end
if t_end == nil then
-- terminate on L2 or another "Etymology ..." header
-- match L2 and remove it and everything after it
content = string.gsub(content:sub(t_start), "\n==[^=].+$", "")
-- match Etymology header and remove it and everything after it
content = string.gsub(content, "\n===+%s*Etymology.+$", "")
return content
end
return content:sub(t_start, t_end)
end
function export.get_alternative_forms(lang, entry_name, id, default_separator)
local page = mw.title.new(entry_name)
local content = page:getContent()
local function alt_form_error(reason)
preview_error("alternative forms", entry_name, lang:getFullName(), reason)
end
if not content then
-- FIXME, should be an error
alt_form_error("nonexistent page")
track("alts-nonexistent-page")
return ""
end
local _, index = string.find(content,
"==[ \t]*" .. pattern_escape(lang:getFullName()) .. "[ \t]*==")
if not index then
-- FIXME, should be an error
alt_form_error("L2 header for language not found")
track("alts-lang-not-found")
return ""
end
if id then
content = get_content_after_senseid(content, entry_name, lang, id)
index = 0
end
local _, next_lang = string.find(content, "\n==[^=\n]+==", index, false)
local _, index = string.find(content, "\n(====?=?)[ \t]*Alternative forms[ \t]*%1", index, false)
if not index then
_, index = string.find(content, "\n(====?=?)[ \t]*Alternative reconstructions[ \t]*%1", index, false)
end
if not index then
-- FIXME, should be an error
alt_form_error("'Alternative forms' section for language not found")
track("alts-section-not-found")
return ""
end
local langCodeRegex = pattern_escape(lang:getFullCode())
index = string.find(content, "{{alt[ei]?r?|" .. langCodeRegex .. "|[^|}]+", index)
if (not index) or (next_lang and next_lang < index) then
-- FIXME, should be an error
alt_form_error("no 'alt' or 'alter' template in 'Alternative forms' section for language")
track("alts-alter-not-found")
return ""
end
local next_section = string.find(content, "\n(=+)[^=]+%1", index)
local alternative_forms_section = string.sub(content, index, next_section)
local terms_list = {}
local altforms = require("Module:alternative forms")
for template in require("Module:template parser").find_templates(alternative_forms_section) do
if template:get_name() == "alter" then
local args = template:get_arguments()
if args[1] == lang:getFullCode() then
saw_alter = true
local formatted_altforms = altforms.display_alternative_forms(args, entry_name, "allow self link", default_separator)
table.insert(terms_list, formatted_altforms)
end
end
end
if #terms_list == 0 then
-- FIXME, should be an error
alt_form_error("no terms in 'alt' or 'alter' template in 'Alternative forms' section for language")
track("alts-no-terms-in-alter")
return ""
end
return table.concat(terms_list, default_separator or ", ")
end
function export.get_descendants(lang, entry_name, id, noerror)
local page = mw.title.new(entry_name)
local content = page:getContent()
local namespace = mw.title.getCurrentTitle().nsText
local function desc_error(reason)
preview_error("descendants", entry_name, lang:getFullName(), reason)
end
if not content then
-- FIXME, should be an error
desc_error("nonexistent page")
track("desctree-nonexistent-page")
return ""
end
-- Ignore HTML comments, columns and blank lines.
content = remove_comments(content)
:gsub("{{top%d}}%s", "")
:gsub("{{mid%d}}%s", "")
:gsub("{{bottom}}%s", "")
:gsub("\n?{{(desc?%-%l+)|?[^}]*}}",
function (template_name)
if template_name == "desc-top" or template_name == "desc-bottom" or template_name == "des-top" or template_name == "des-mid" or template_name == "des-bottom" then
return ""
end
end)
:gsub("\n%s*\n", "\n")
local _, index = string.find(content,
"%f[^\n%z]==[ \t]*" .. lang:getFullName() .. "[ \t]*==", nil, true)
if not index then
_, index = string.find(content, "%f[^\n%z]==[ \t]*"
.. pattern_escape(lang:getFullName())
.. "[ \t]*==", nil, false)
end
if not index then
desc_error("L2 header for language not found")
-- FIXME, should be an error
track("desctree-lang-not-found")
return ""
end
if id then
content = get_content_after_senseid(content, entry_name, lang, id)
index = 0
end
local _, next_lang = string.find(content, "\n==[^=\n]+==", index, false)
local _, index = string.find(content, "\n(====*)[ \t]*Descendants[ \t]*%1", index, false)
local function desctree_no_descendants(with_lang_in_error)
if noerror and (namespace == "" or namespace == "Reconstruction") then
track("desctree-no-descendants")
return "<small class=\"error previewonly\">(" ..
"Please either change this template to {{desc}} " ..
"or insert a ====Descendants==== section in [[" ..
entry_name .. "#" .. lang:getFullName() .. "]])</small>" ..
"[[Category:" .. lang:getFullName() .. " descendants to be fixed in desctree]]"
else
error(("No Descendants section was found in the entry [[%s]]%s"):format(entry_name,
with_lang_in_error and (" under the header for %s"):format(lang:getFullName()) or ""))
end
end
if not index then
return desctree_no_descendants()
elseif next_lang and next_lang < index then
return desctree_no_descendants("with lang in error")
end
-- Skip past final equals sign.
index = index + 1
-- Skip past spaces or tabs.
while true do
local new_index = string.match(content, "^[ \t]+()", index)
if not new_index then
break
end
index = new_index
end
local items = require("Module:array")()
local frame = mw.getCurrentFrame()
local previous_list_markers = ""
-- Skip paragraphs at beginning of Descendants section.
while true do
local new_index = content:match("^\n[^%*:=][^\n]*()", index)
if not new_index then
break
else
index = new_index
end
end
previous_index = 1
-- Find a consecutive series of list items that begins directly after the
-- Descendants header.
-- start_index and previous_index are used to check that list items are
-- consecutive.
for start_index, list_markers, item, index in string.gmatch(content:sub(index), "()\n([%*:]+) *([^\n]+)()") do
if start_index ~= previous_index then
break
end
-- Preprocess, but replace recursive calls to avoid template loop errors
item = string.gsub(item, "{{desctree|", "{{#invoke:etymology/templates/descendant|descendants_tree|")
item = frame:preprocess(item)
local difference = #list_markers - #previous_list_markers
if difference > 0 then
for i = #previous_list_markers + 1, #list_markers do
items:insert(list_markers:sub(i, i) == "*" and "<ul>" or "<dl>")
end
else
if difference < 0 then
for i = #previous_list_markers, #list_markers + 1, -1 do
items:insert(previous_list_markers:sub(i, i) == "*" and "</li></ul>" or "</dd></dl>")
end
else
items:insert(previous_list_markers:sub(-1, -1) == "*" and "</li>" or "</dd>")
end
if previous_list_markers:sub(#list_markers, #list_markers) ~= list_markers:sub(-1, -1) then
items:insert(list_markers:sub(-1, -1) == "*" and "</dl><ul>" or "</ul><dl>")
end
end
items:insert(list_markers:sub(-1, -1) == "*" and "<li>" or "<dd>")
items:insert(item)
previous_list_markers = list_markers
previous_index = index
end
for i = #previous_list_markers, 1, -1 do
items:insert(previous_list_markers:sub(i, i) == "*" and "</li></ul>" or "</dd></dl>")
end
return items:concat()
end
return export
pqx7k3asjvcuripstqlhxn72h8o44nv
Modul:families/code to canonical name
828
33772
373563
373521
2026-09-11T13:20:56Z
Hakimi97
2668
[[MediaWiki:UpdateLanguageNameAndCode.js|dikemas kini menggunakan gajet bahasa]]
373563
Scribunto
text/plain
return {
["aav"] = "Austroasia",
["aav-khs"] = "Khasi",
["aav-nic"] = "Nicobar",
["aav-pkl"] = "Pnar-Khasi-Lyngngam",
["afa"] = "Afroasia",
["alg"] = "Algonquin",
["alg-abp"] = "Abenaki-Penobscot",
["alg-ara"] = "Arapaho",
["alg-eas"] = "Algonquin Timur",
["alg-sfk"] = "Sac-Fox-Kickapoo",
["alv"] = "Atlantik-Congo",
["alv-aah"] = "Ayere-Ahan",
["alv-ada"] = "Adamawa",
["alv-bag"] = "Baga",
["alv-bak"] = "Bak",
["alv-bam"] = "Bambuka",
["alv-bny"] = "Banyum",
["alv-bua"] = "Bua",
["alv-bwj"] = "Bikwin-Jen",
["alv-cng"] = "Cangin",
["alv-ctn"] = "Tano Tengah",
["alv-dlt"] = "Edoid Delta",
["alv-dur"] = "Duru",
["alv-ede"] = "Ede",
["alv-edk"] = "Edekiri",
["alv-edo"] = "Edoid",
["alv-eeo"] = "Edo-Esan-Ora",
["alv-fli"] = "Fali",
["alv-fwo"] = "Fula-Wolof",
["alv-gbe"] = "Gbe",
["alv-gda"] = "Ga-Dangme",
["alv-gng"] = "Guang",
["alv-gtm"] = "Pergunungan Ghana-Togo",
["alv-hei"] = "Heiban",
["alv-ido"] = "Idomoid",
["alv-igb"] = "Igboid",
["alv-jfe"] = "Jola-Felupe",
["alv-jol"] = "Jola",
["alv-kim"] = "Kim",
["alv-kis"] = "Kissi",
["alv-krb"] = "Karaboro",
["alv-ktg"] = "Ka-Togo",
["alv-kul"] = "Kulango",
["alv-kwa"] = "Kwa",
["alv-lag"] = "Lagoon",
["alv-lek"] = "Leko",
["alv-lim"] = "Limba",
["alv-lni"] = "Leko-Nimbari",
["alv-mbd"] = "Mbum-Day",
["alv-mbm"] = "Mbum",
["alv-mel"] = "Mel",
["alv-mum"] = "Mumuye",
["alv-mye"] = "Mumuye-Yendang",
["alv-nal"] = "Nalu",
["alv-nce"] = "Edoid Utara-Tengah",
["alv-ngb"] = "Nupe-Gbagyi",
["alv-ntg"] = "Na-Togo",
["alv-nup"] = "Nupoid",
["alv-nwd"] = "Edoid Barat Laut",
["alv-nyn"] = "Nyun",
["alv-pap"] = "Papel",
["alv-pph"] = "Phla-Pherá",
["alv-ptn"] = "Potou-Tano",
["alv-sav"] = "Savanna",
["alv-sma"] = "Supyire-Mamara",
["alv-snf"] = "Senufo",
["alv-sng"] = "Senegambia",
["alv-snr"] = "Senari",
["alv-swd"] = "Edoid Barat Daya",
["alv-tal"] = "Talodi",
["alv-tdj"] = "Tagwana-Djimini",
["alv-ten"] = "Tenda",
["alv-the"] = "Talodi-Heiban",
["alv-von"] = "Volta-Niger",
["alv-wan"] = "Wara-Natyoro",
["alv-wjk"] = "Waja-Kam",
["alv-yek"] = "Yekhee",
["alv-yor"] = "Yoruba",
["alv-yrd"] = "Yoruboid",
["alv-yun"] = "Yungur",
["apa"] = "Apache",
["aqa"] = "Alacalufan",
["aql"] = "Algik",
["art"] = "buatan",
["ath"] = "Athabaska",
["ath-nor"] = "Athabaska Utara",
["ath-pco"] = "Athabaska Pesisir Pasifik",
["auf"] = "Arawa",
["aus-arn"] = "Arnhem",
["aus-bub"] = "Bunuba",
["aus-cww"] = "New South Wales Tengah",
["aus-dal"] = "Daly",
["aus-dyb"] = "Dyirbal",
["aus-gar"] = "Garawan",
["aus-gun"] = "Gunwinyguan",
["aus-jar"] = "Jarrakan",
["aus-kar"] = "Karnic",
["aus-mir"] = "Mirndi",
["aus-nga"] = "Ngayarda",
["aus-nyu"] = "Nyulnyulan",
["aus-pam"] = "Pama-Nyunga",
["aus-pmn"] = "Pama",
["aus-psw"] = "Pama-Nyunga Barat Daya",
["aus-rnd"] = "Arandic",
["aus-tnk"] = "Tangkic",
["aus-wdj"] = "Iwaidjan",
["aus-wor"] = "Worrorran",
["aus-yid"] = "Yidinyic",
["aus-yng"] = "Yangmanic",
["aus-yol"] = "Yolngu",
["aus-yuk"] = "Yuin-Kuri",
["awd"] = "Arawak",
["awd-nwk"] = "Nawiki",
["awd-taa"] = "Ta-Arawak",
["azc"] = "Uto-Aztek",
["azc-cup"] = "Cupan",
["azc-dur"] = "Nahuatl Durango",
["azc-hua"] = "Nahuatl Huasteca",
["azc-nah"] = "Nahua",
["azc-num"] = "Numi",
["azc-pim"] = "Piman",
["azc-tak"] = "Takic",
["azc-trc"] = "Taracahitic",
["bad"] = "Banda",
["bad-cnt"] = "Banda Tengah",
["bai"] = "Bamileke",
["bat"] = "Baltik",
["bat-eas"] = "Baltik Timur",
["bat-wes"] = "Baltik Barat",
["ber"] = "Barbar",
["bnt"] = "Bantu",
["bnt-baf"] = "Bafia",
["bnt-bbo"] = "Bafo-Bonkeng",
["bnt-bdz"] = "Boma-Dzing",
["bnt-bek"] = "Bekwilic",
["bnt-bki"] = "Bena-Kinga",
["bnt-bmo"] = "Bangi-Moi",
["bnt-bne"] = "Bantu Timur Laut",
["bnt-bnm"] = "Bangi-Ntomba",
["bnt-boa"] = "Boan",
["bnt-bot"] = "Botatwe",
["bnt-bsa"] = "Basaa",
["bnt-bsh"] = "Bushoong",
["bnt-bso"] = "Bantu Selatan",
["bnt-bta"] = "Bati-Angba",
["bnt-btb"] = "Beti",
["bnt-bte"] = "Bangi-Tetela",
["bnt-bun"] = "Buja-Ngombe",
["bnt-chg"] = "Chaga",
["bnt-cht"] = "Chaga-Taita",
["bnt-clu"] = "Chokwe-Luchazi",
["bnt-com"] = "Comoros",
["bnt-glb"] = "Bantu Tasik-Tasik Besar",
["bnt-haj"] = "Haya-Jita",
["bnt-kak"] = "Kako",
["bnt-kav"] = "Kavango",
["bnt-kbi"] = "Komo-Bira",
["bnt-kel"] = "Kele",
["bnt-kil"] = "Kilombero",
["bnt-kka"] = "Kikuyu-Kamba",
["bnt-kmb"] = "Kimbundu",
["bnt-kng"] = "Kongo",
["bnt-kpw"] = "Kpwe",
["bnt-ksb"] = "Kavango-Bantu Barat Daya",
["bnt-kts"] = "Kele-Tsogo",
["bnt-lbn"] = "Luban",
["bnt-leb"] = "Lebonya",
["bnt-lgb"] = "Lega-Binja",
["bnt-lok"] = "Logooli-Kuria",
["bnt-lub"] = "Luba",
["bnt-lun"] = "Lunda",
["bnt-mak"] = "Makua",
["bnt-mbb"] = "Mboshi-Buja",
["bnt-mbe"] = "Mbole-Enya",
["bnt-mbi"] = "Mbinga",
["bnt-mbo"] = "Mboshi",
["bnt-mbt"] = "Mbete",
["bnt-mby"] = "Mbeya",
["bnt-mij"] = "Mijikenda",
["bnt-mka"] = "Makaa",
["bnt-mne"] = "Manenguba",
["bnt-mnj"] = "Makaa-Njem",
["bnt-mon"] = "Mongo",
["bnt-mra"] = "Mbugwe-Rangi",
["bnt-msl"] = "Masaba-Luhya",
["bnt-mwi"] = "Mwika",
["bnt-ncb"] = "Bantu Pesisir Timur Laut",
["bnt-ndb"] = "Ndzem-Bomwali",
["bnt-ngn"] = "Ngondi-Ngiri",
["bnt-ngu"] = "Nguni",
["bnt-nya"] = "Nyali",
["bnt-nyb"] = "Nyanga-Buyi",
["bnt-nyg"] = "Nyoro-Ganda",
["bnt-nys"] = "Nyasa",
["bnt-nze"] = "Nzebi",
["bnt-ova"] = "Ovambo",
["bnt-par"] = "Pare",
["bnt-pen"] = "Pende",
["bnt-pob"] = "Pomo-Bomwali",
["bnt-ruk"] = "Rukwa",
["bnt-run"] = "Rungwe",
["bnt-rur"] = "Rufiji-Ruvuma",
["bnt-ruv"] = "Ruvu",
["bnt-rvm"] = "Ruvuma",
["bnt-sab"] = "Sabaki",
["bnt-saw"] = "Sawabantu",
["bnt-sbi"] = "Sabi",
["bnt-seu"] = "Seuta",
["bnt-shh"] = "Shi-Havu",
["bnt-sho"] = "Shona",
["bnt-sir"] = "Sira",
["bnt-ske"] = "Soko-Kele",
["bnt-sna"] = "Sena",
["bnt-sts"] = "Sotho-Tswana",
["bnt-swb"] = "Bantu Barat Daya",
["bnt-swh"] = "Swahili",
["bnt-tek"] = "Teke",
["bnt-tet"] = "Tetela",
["bnt-tkc"] = "Teke Tengah",
["bnt-tkm"] = "Takama",
["bnt-tmb"] = "Teke-Mbede",
["bnt-tso"] = "Tsogo",
["bnt-tsr"] = "Tswa-Ronga",
["bnt-yak"] = "Yaka",
["bnt-yko"] = "Yasa-Kombe",
["bnt-zbi"] = "Zamba-Binza",
["btk"] = "Batak",
["cau-abz"] = "Abkhaz-Abaza",
["cau-and"] = "Andi",
["cau-ava"] = "Avar-Andi",
["cau-cir"] = "Circassia",
["cau-drg"] = "Dargwa",
["cau-esm"] = "Samur Timur",
["cau-ets"] = "Tsez Timur",
["cau-lzg"] = "Lezghi",
["cau-nec"] = "Kaukasus Timur Laut",
["cau-nkh"] = "Nakh",
["cau-nwc"] = "Kaukasus Barat Laut",
["cau-sam"] = "Samur",
["cau-ssm"] = "Samur Selatan",
["cau-tsz"] = "Tsez",
["cau-vay"] = "Vainakh",
["cau-wsm"] = "Samur Barat",
["cau-wts"] = "Tsez Barat",
["cba"] = "Chibcha",
["ccs"] = "Kartvelia",
["ccs-gzn"] = "Georgia-Zan",
["ccs-zan"] = "Zan",
["cdc"] = "Chadik",
["cdc-cbm"] = "Chadik Tengah",
["cdc-est"] = "Chad Timur",
["cdc-mas"] = "Masa",
["cdc-wst"] = "Chadik Barat",
["cdd"] = "Caddo",
["cel"] = "Keltik",
["cel-brs"] = "Brythonik Barat Daya",
["cel-brw"] = "Brythonik Barat",
["cel-bry"] = "Brythonik",
["cel-gae"] = "Goidelik",
["cel-his"] = "Hispano-Keltik",
["cel-ins"] = "Keltik Kepulauan",
["chi"] = "Chimakuan",
["chm"] = "Mari",
["cmc"] = "Chamik",
["crp"] = "kreol atau pijin",
["csu"] = "Sudanik Tengah",
["csu-bba"] = "Bongo-Bagirmi",
["csu-bbk"] = "Bongo-Baka",
["csu-bgr"] = "Bagirmi",
["csu-bkr"] = "Birri-Kresh",
["csu-ecs"] = "Sudanik Tengah Timur",
["csu-kab"] = "Kaba",
["csu-lnd"] = "Lendu",
["csu-maa"] = "Mangbetu",
["csu-mle"] = "Mangbutu-Lese",
["csu-mma"] = "Moru-Madi",
["csu-sar"] = "Sara",
["csu-val"] = "Vale",
["cus"] = "Kushitik",
["cus-cen"] = "Kushitik Tengah",
["cus-eas"] = "Kushitik Timur",
["cus-hec"] = "Kushitik Timur Tanah Tinggi",
["cus-som"] = "Somaloid",
["cus-sou"] = "Kushitik Selatan",
["day"] = "Dayak Darat",
["del"] = "Lenape",
["den"] = "Slavey",
["dmn"] = "Mande",
["dmn-bbu"] = "Bisa-Busa",
["dmn-emn"] = "Manding Timur",
["dmn-jje"] = "Jogo-Jeri",
["dmn-man"] = "Manding",
["dmn-mda"] = "Mano-Dan",
["dmn-mdc"] = "Mande Tengah",
["dmn-mde"] = "Mande Timur",
["dmn-mdw"] = "Mande Barat",
["dmn-mjo"] = "Manding-Jogo",
["dmn-mmo"] = "Manding-Mokole",
["dmn-mnk"] = "Maninka",
["dmn-mnw"] = "Mande Barat Laut",
["dmn-mok"] = "Mokole",
["dmn-mse"] = "Mande Tenggara",
["dmn-msw"] = "Mande Barat Daya",
["dmn-mva"] = "Manding-Vai",
["dmn-nbe"] = "Nwa-Beng",
["dmn-sam"] = "Samo",
["dmn-smg"] = "Samogo",
["dmn-snb"] = "Soninke-Bobo",
["dmn-sya"] = "Susu-Yalunka",
["dmn-vak"] = "Vai-Kono",
["dmn-wmn"] = "Manding Barat",
["dra"] = "Dravidia",
["dra-cen"] = "Dravidia Tengah",
["dra-gki"] = "Gondi-Kui",
["dra-gon"] = "Gondi",
["dra-imd"] = "Irula-Muduga",
["dra-kan"] = "Kannadoid",
["dra-kki"] = "Konda-Kui",
["dra-kml"] = "Kurux-Malto",
["dra-knk"] = "Kolami-Naiki",
["dra-kod"] = "Kodagu",
["dra-kor"] = "Koraga",
["dra-mal"] = "Malayalamoid",
["dra-mdy"] = "Madiya",
["dra-mlo"] = "Malto",
["dra-mur"] = "Muria",
["dra-nor"] = "Dravidia Utara",
["dra-pgd"] = "Parji-Gadaba",
["dra-sdo"] = "Dravidia Selatan I",
["dra-sdt"] = "Dravidia Selatan II",
["dra-sou"] = "Dravidia Selatan",
["dra-tam"] = "Tamiloid",
["dra-tel"] = "Teluguik",
["dra-tkd"] = "Tamil-Kodagu",
["dra-tkn"] = "Tamil-Kannada",
["dra-tkt"] = "Toda-Kota",
["dra-tlk"] = "Tulu-Koraga",
["dra-tml"] = "Tamil-Malayalam",
["egx"] = "Mesir",
["ero"] = "Horpa",
["esx"] = "Eskimo-Aleut",
["esx-esk"] = "Eskimo",
["esx-inu"] = "Inuit",
["euq"] = "Vaskonik",
["gba"] = "Gbaya",
["gba-eas"] = "Gbaya Timur",
["gba-sou"] = "Gbaya Selatan",
["gba-wes"] = "Gbaya Barat",
["gem"] = "Jermanik",
["gio"] = "Gelao",
["gme"] = "Jermanik Timur",
["gmq"] = "Jermanik Utara",
["gmq-eas"] = "Skandinavia Timur",
["gmq-ins"] = "Skandinavia Kepulauan",
["gmq-wes"] = "Skandinavia Barat",
["gmw"] = "Jermanik Barat",
["gmw-afr"] = "Anglo-Frisia",
["gmw-ang"] = "Anglia",
["gmw-fri"] = "Frisia",
["gmw-frk"] = "Franconia Tanah Rendah",
["gmw-hgm"] = "Jerman Tanah Tinggi",
["gmw-ian"] = "Anglo-Norman Ireland",
["gmw-lgm"] = "Jerman Tanah Rendah",
["gmw-nsg"] = "Jermanik Laut Utara",
["gn"] = "Guarani",
["grb"] = "Grebo tepat",
["grk"] = "Hellenik",
["him"] = "Pahari Barat",
["hmn"] = "Hmongik",
["hmx"] = "Hmong-Mien",
["hmx-mie"] = "Mienik",
["hok"] = "Hokan",
["hyx"] = "Armenia",
["iir"] = "Indo-Iran",
["iir-nur"] = "Nuristani",
["ijo"] = "Ijoid",
["inc"] = "Indo-Arya",
["inc-bas"] = "Benggali–Assam",
["inc-bhi"] = "Bhil",
["inc-bih"] = "Bihar",
["inc-cen"] = "Indo-Arya Tengah",
["inc-chi"] = "Chitral",
["inc-dar"] = "Dardik",
["inc-dng"] = "Dangari",
["inc-dre"] = "Dardik Timur",
["inc-eas"] = "Indo-Arya Timur",
["inc-hal"] = "Halbik",
["inc-hie"] = "Hindi Timur",
["inc-hiw"] = "Hindi Barat",
["inc-hnd"] = "Hindustan",
["inc-ins"] = "Indo-Arya Kepulauan",
["inc-kas"] = "Kashmirik",
["inc-koh"] = "Kohistani",
["inc-krd"] = "Bahasa-bahasa KRDS",
["inc-kun"] = "Kunar",
["inc-mid"] = "Indo-Arya Tengah",
["inc-nor"] = "Indo-Arya Utara",
["inc-nwe"] = "Indo-Arya Barat Laut",
["inc-old"] = "Indo-Arya Kuno",
["inc-pac"] = "Pahari Tengah",
["inc-pae"] = "Pahari Timur",
["inc-pah"] = "Pahari",
["inc-pan"] = "Punjabik",
["inc-pas"] = "Pashayi",
["inc-rom"] = "Romani",
["inc-sad"] = "Sadanik",
["inc-shn"] = "Shinaic",
["inc-snd"] = "Sindhik",
["inc-sou"] = "Indo-Arya Selatan",
["inc-tha"] = "Tharu",
["inc-wes"] = "Indo-Arya Barat",
["ine"] = "Indo-Eropah",
["ine-ana"] = "Anatolia",
["ine-bsl"] = "Balto-Slavik",
["ine-luw"] = "Luwik",
["ine-toc"] = "Tokharia",
["ira"] = "Iran",
["ira-cen"] = "Iran Pusat",
["ira-csp"] = "Caspia",
["ira-kms"] = "Komisenia",
["ira-lur"] = "Lurik",
["ira-mid"] = "Iran Tengah",
["ira-mny"] = "Munji-Yidgha",
["ira-mpr"] = "Medo-Parthia",
["ira-msh"] = "Mazanderani-Shahmirzadi",
["ira-nei"] = "Iran Timur Laut",
["ira-nwi"] = "Iran Barat Laut",
["ira-old"] = "Iran Kuno",
["ira-orp"] = "Ormuri-Parachi",
["ira-pat"] = "Pathan",
["ira-sbc"] = "Sogdo-Bactria",
["ira-sei"] = "Iran Tenggara",
["ira-sgc"] = "Sogdik",
["ira-sgi"] = "Sanglechi-Ishkashimi",
["ira-shr"] = "Shughni-Roshani",
["ira-shy"] = "Shughni-Yazghulami",
["ira-swi"] = "Iran Barat Daya",
["ira-sym"] = "Shughni-Yazghulami-Munji",
["ira-wes"] = "Iran Barat",
["ira-zgr"] = "Zaza-Gorani",
["iro"] = "Iroquois",
["iro-nor"] = "Iroquois Utara",
["itc"] = "Italik",
["itc-laf"] = "Latino-Falisci",
["itc-sbl"] = "Osco-Umbria",
["jpx"] = "Jepunik",
["jpx-nry"] = "Ryukyu Utara",
["jpx-ryu"] = "Ryukyu",
["jpx-sry"] = "Ryukyu Selatan",
["kar"] = "Karen",
["kca"] = "Khanty",
["khi-kal"] = "Khoe Kalahari",
["khi-khk"] = "Khoekhoe",
["khi-kho"] = "Khoe",
["khi-kkw"] = "Khoe-Kwadi",
["khi-kxa"] = "Kx'a",
["khi-tuu"] = "Tuu",
["kro"] = "Kru",
["kro-aiz"] = "Aizi",
["kro-bet"] = "Bété",
["kro-did"] = "Dida",
["kro-ekr"] = "Kru Timur",
["kro-grb"] = "Grebo",
["kro-wee"] = "Wee",
["kro-wkr"] = "Kru Barat",
["ku"] = "Kurdi",
["kv"] = "Komi",
["map"] = "Austronesia",
["map-ata"] = "Atayalik",
["mjg"] = "Monguor",
["mkh"] = "Mon-Khmer",
["mkh-asl"] = "Asli",
["mkh-ban"] = "Bahnarik",
["mkh-kat"] = "Katuik",
["mkh-khm"] = "Khmuik",
["mkh-kmr"] = "Khmerik",
["mkh-mnc"] = "Monik",
["mkh-mng"] = "Mangik",
["mkh-nbn"] = "Bahnarik Utara",
["mkh-pal"] = "Palaungik",
["mkh-pea"] = "Pearik",
["mkh-pkn"] = "Pakanik",
["mkh-vie"] = "Vietik",
["mno"] = "Manobo",
["mns"] = "Mansi",
["mun"] = "Munda",
["myn"] = "Maya",
["nai-cat"] = "Catawba",
["nai-chu"] = "Chumashan",
["nai-ckn"] = "Chinook",
["nai-coo"] = "Coosan",
["nai-jcq"] = "Jicaquean",
["nai-ker"] = "Keresan",
["nai-klp"] = "Kalapuyan",
["nai-kta"] = "Kiowa-Tanoan",
["nai-len"] = "Lenca",
["nai-mdu"] = "Maiduan",
["nai-min"] = "Misumalpa",
["nai-miz"] = "Mixe-Zoque",
["nai-mus"] = "Muscogee",
["nai-pak"] = "Pakawan",
["nai-pal"] = "Palaihnihan",
["nai-plp"] = "Pen-Uti Penara",
["nai-pom"] = "Pomo",
["nai-sca"] = "Sioux-Catawba",
["nai-shp"] = "Sahaptian",
["nai-shs"] = "Shastan",
["nai-tot"] = "Totozoquean",
["nai-tqn"] = "Tequistlatecan",
["nai-tsi"] = "Tsimshian",
["nai-ttn"] = "Totonacan",
["nai-utn"] = "Uti",
["nai-wtq"] = "Wintuan",
["nai-xin"] = "Xinca",
["nai-ykn"] = "Yuki",
["nai-you"] = "Yok-Uti",
["nai-yuc"] = "Yuman-Cochimí",
["ngf"] = "Trans-New Guinea",
["ngf-ais"] = "Aisian",
["ngf-ang"] = "Angan",
["ngf-ank"] = "Angal-Kewa",
["ngf-ask"] = "Asmat-Kamoro",
["ngf-asm"] = "Asmat",
["ngf-ata"] = "Ankave-Tainae-Akoye",
["ngf-awd"] = "Awyu-Dumut",
["ngf-awy"] = "Awyu",
["ngf-bda"] = "Becking-Dawi",
["ngf-bin"] = "Binanderean",
["ngf-boa"] = "Boane",
["ngf-bos"] = "Bosavi",
["ngf-bsi"] = "Baruya-Simbari",
["ngf-cda"] = "Dani Tengah",
["ngf-chw"] = "Chimbu-Wahgi",
["ngf-dag"] = "Dagan",
["ngf-dal"] = "Dallman",
["ngf-dan"] = "Dani",
["ngf-dum"] = "Dumut",
["ngf-ehu"] = "Huon Timur",
["ngf-eku"] = "Kutubuan Timur",
["ngf-enc"] = "Engik",
["ngf-eng"] = "Engan",
["ngf-era"] = "Erap",
["ngf-eso"] = "Sogeram Timur",
["ngf-est"] = "Strickland Timur",
["ngf-eva"] = "Evapia",
["ngf-fgi"] = "Fore-Gimi",
["ngf-fhu"] = "Finisterre-Huon",
["ngf-fin"] = "Finisterre",
["ngf-gah"] = "Gahuku",
["ngf-gau"] = "Gauwa",
["ngf-gaw"] = "Awyu Raya",
["ngf-gbi"] = "Binanderean Raya",
["ngf-gko"] = "Gaena-Korafe",
["ngf-gmo"] = "Gusap-Mot",
["ngf-gor"] = "Goroka",
["ngf-gsu"] = "Gogodala-Suki",
["ngf-gum"] = "Gum",
["ngf-gvd"] = "Dani Lembah Besar",
["ngf-hag"] = "Hagen",
["ngf-han"] = "Hanseman",
["ngf-huo"] = "Huon",
["ngf-jim"] = "Jimi",
["ngf-kab"] = "Kabwum",
["ngf-kai"] = "Kainantu",
["ngf-kak"] = "Kalam-Kobon",
["ngf-kau"] = "Kaukombar",
["ngf-kbm"] = "Kosorong-Burum-Mindik",
["ngf-kgo"] = "Kainantu-Goroka",
["ngf-khu"] = "Kewa-Huli",
["ngf-kma"] = "Kâte-Mape",
["ngf-kme"] = "Kapau-Menya",
["ngf-koi"] = "Koiarian",
["ngf-kok"] = "Kokon",
["ngf-kow"] = "Kowan",
["ngf-ksa"] = "Kalam-Adelbert Selatan",
["ngf-kto"] = "Kube-Tobo",
["ngf-kts"] = "Komyandaret-Tsaukambo",
["ngf-kum"] = "Kumil",
["ngf-kya"] = "Kamano-Yagaria",
["ngf-lok"] = "Ok Tanah Rendah",
["ngf-mab"] = "Mabuso",
["ngf-mad"] = "Madang",
["ngf-mek"] = "Mek",
["ngf-min"] = "Mindjim",
["ngf-mok"] = "Ok Pergunungan",
["ngf-mom"] = "Mombum",
["ngf-msu"] = "Mian-Suganga",
["ngf-nad"] = "Adelbert Utara",
["ngf-nbi"] = "Binanderean Utara",
["ngf-nde"] = "Ndeiram",
["ngf-ngn"] = "Ngalik-Nduga",
["ngf-nso"] = "Sogeram Utara",
["ngf-num"] = "Numugen",
["ngf-nur"] = "Nuru",
["ngf-nwh"] = "Hanseman Barat Laut",
["ngf-oen"] = "Engan Luar",
["ngf-okk"] = "Ok",
["ngf-omo"] = "Omosan",
["ngf-oro"] = "Orokaivik",
["ngf-pan"] = "Tasik Paniai",
["ngf-pek"] = "Peka",
["ngf-pom"] = "Pomoikan",
["ngf-rai"] = "Pesisir Rai",
["ngf-sab"] = "Sabakor",
["ngf-sad"] = "Adelbert Selatan",
["ngf-sak"] = "Sau-Angal-Kewa",
["ngf-san"] = "Sankwep",
["ngf-sbh"] = "South Bird's Head",
["ngf-sim"] = "Simbu",
["ngf-sog"] = "Sogeram",
["ngf-sop"] = "Sopac",
["ngf-taa"] = "Tainae-Akoye",
["ngf-tai"] = "Tairora",
["ngf-tib"] = "Tiboran",
["ngf-tna"] = "Tangko-Nakai",
["ngf-uru"] = "Uruwa",
["ngf-usi"] = "Utu-Silopi",
["ngf-waa"] = "Wantoat-Awara",
["ngf-wah"] = "Wahgi",
["ngf-wan"] = "Wantoatik",
["ngf-war"] = "Warup",
["ngf-woj"] = "Wojokesik",
["ngf-wok"] = "Ok Barat",
["ngf-wso"] = "Sogeram Barat",
["ngf-yag"] = "Yaganon",
["ngf-yal"] = "Yali",
["ngf-yar"] = "Yareban",
["ngf-ynu"] = "Yau-Nungon",
["ngf-yup"] = "Yupna",
["nic"] = "Niger-Congo",
["nic-alu"] = "Alumik",
["nic-bas"] = "Basa",
["nic-bbe"] = "Beboid Timur",
["nic-bco"] = "Benue-Congo",
["nic-bcr"] = "Bantoid-Cross",
["nic-bdn"] = "Bantoid Utara",
["nic-bds"] = "Bantoid Selatan",
["nic-beb"] = "Beboid",
["nic-ben"] = "Bendi",
["nic-beo"] = "Beromik",
["nic-bod"] = "Bantoid",
["nic-buk"] = "Buli-Koma",
["nic-bwa"] = "Bwa",
["nic-cde"] = "Delta Tengah",
["nic-cri"] = "Cross River",
["nic-dag"] = "Dagbani",
["nic-dak"] = "Dakoid",
["nic-dge"] = "Escarpment Dogon",
["nic-dgw"] = "Dogon Barat",
["nic-eko"] = "Ekoid",
["nic-eov"] = "Oti-Volta Timur",
["nic-fru"] = "Furu",
["nic-gne"] = "Gurunsi Timur",
["nic-gnn"] = "Gurunsi Utara",
["nic-gns"] = "Gurunsi",
["nic-gnw"] = "Gurunsi Barat",
["nic-gre"] = "Grassfields Timur",
["nic-grf"] = "Grassfields",
["nic-grm"] = "Gurma",
["nic-grs"] = "Grassfields Barat Daya",
["nic-gur"] = "Gur",
["nic-ief"] = "Ibibio-Efik",
["nic-jer"] = "Jera",
["nic-jkn"] = "Jukunoid",
["nic-jrn"] = "Jarawan",
["nic-jrw"] = "Jarawa",
["nic-kam"] = "Kambari",
["nic-kau"] = "Kauru",
["nic-kmk"] = "Kamuku",
["nic-kne"] = "Kainji Timur",
["nic-knj"] = "Kainji",
["nic-knn"] = "Kainji Barat Laut",
["nic-ktl"] = "Katloid",
["nic-lcr"] = "Cross River Hilir",
["nic-mam"] = "Mamfe",
["nic-mba"] = "Mbam",
["nic-mbc"] = "Mba",
["nic-mbw"] = "Mbam Barat",
["nic-mmb"] = "Mambiloid",
["nic-mom"] = "Momo",
["nic-mre"] = "Moré",
["nic-ngd"] = "Ngbandi",
["nic-nge"] = "Ngemba",
["nic-ngk"] = "Ngbaka",
["nic-nin"] = "Ninzik",
["nic-nka"] = "Nkambe",
["nic-nkb"] = "Baka",
["nic-nke"] = "Ngbaka Timur",
["nic-nkg"] = "Gbanziri",
["nic-nkk"] = "Kpala",
["nic-nkm"] = "Mbaka",
["nic-nkw"] = "Ngbaka Barat",
["nic-npd"] = "Dogon Penara Utara",
["nic-nun"] = "Nun",
["nic-nwa"] = "Nanga-Walo",
["nic-ogo"] = "Ogoni",
["nic-ovo"] = "Oti-Volta",
["nic-pla"] = "Platoid",
["nic-plc"] = "Plateau Tengah",
["nic-pld"] = "Dogon Dataran",
["nic-ple"] = "Plateau Timur",
["nic-pls"] = "Plateau Selatan",
["nic-plt"] = "Plateau",
["nic-ras"] = "Rashad",
["nic-rnc"] = "Ring Tengah",
["nic-rng"] = "Ring",
["nic-rnn"] = "Ring Utara",
["nic-rnw"] = "Ring Barat",
["nic-ser"] = "Sere",
["nic-shi"] = "Shiroro",
["nic-sis"] = "Sisaala",
["nic-tar"] = "Tarokoid",
["nic-tiv"] = "Tivoid",
["nic-tvc"] = "Tivoid Tengah",
["nic-tvn"] = "Tivoid Utara",
["nic-ubg"] = "Ubangi",
["nic-uce"] = "Cross River Hulu Timur-Barat",
["nic-ucn"] = "Cross River Hulu Utara-Selatan",
["nic-ucr"] = "Cross River Hulu",
["nic-vco"] = "Volta-Congo",
["nic-wov"] = "Oti-Volta Barat",
["nic-ykb"] = "Yukubenik",
["nic-ymb"] = "Yambasa",
["nic-yon"] = "Yom-Nawdm",
["njo"] = "Ao",
["nub"] = "Nubian",
["nub-hil"] = "Hill Nubian",
["nur-nor"] = "Nuristan Utara",
["nur-sou"] = "Nuristan Selatan",
["omq"] = "Oto-Mangue",
["omq-cha"] = "Chatino",
["omq-chi"] = "Chinantecan",
["omq-cui"] = "Cuicatec",
["omq-maz"] = "Mazatecan",
["omq-mix"] = "Mixtecan",
["omq-mxt"] = "Mixtec",
["omq-otp"] = "Oto-Pamean",
["omq-pop"] = "Popolocan",
["omq-tri"] = "Triqui",
["omq-zap"] = "Zapotecan",
["omq-zpc"] = "Zapotec",
["omv"] = "Omotik",
["omv-aro"] = "Aroid",
["omv-diz"] = "Dizoid",
["omv-eom"] = "Ometo Timur",
["omv-gon"] = "Gonga",
["omv-mao"] = "Mao",
["omv-nom"] = "Ometo Utara",
["omv-ome"] = "Ometo",
["oto"] = "Otomian",
["oto-otm"] = "Otomi",
["paa"] = "Papua",
["paa-aia"] = "Aian",
["paa-alp"] = "Alor-Pantar",
["paa-amu"] = "Amto-Musan",
["paa-ani"] = "Anim",
["paa-ara"] = "Arapesh",
["paa-arf"] = "Arafundi",
["paa-ata"] = "Ataitan",
["paa-baa"] = "Bayono-Awbono",
["paa-bai"] = "Baining",
["paa-baw"] = "Bosngun-Awar",
["paa-bew"] = "Bewani",
["paa-boa"] = "Boazi",
["paa-bor"] = "Border",
["paa-bul"] = "Sungai Bulaka",
["paa-bvi"] = "Betaf-Vitou",
["paa-clp"] = "Dataran Tasik Tengah",
["paa-dtu"] = "Doso-Turumsa",
["paa-ebh"] = "Kepala Burung Timur",
["paa-eel"] = "Eleman Timur",
["paa-egb"] = "Teluk Geelvink Timur",
["paa-eke"] = "Keram Timur",
["paa-ele"] = "Eleman",
["paa-elp"] = "Dataran Tasik Timur",
["paa-epw"] = "Pauwasi Timur",
["paa-etf"] = "Trans-Fly Timur",
["paa-eti"] = "Timor Timur",
["paa-fas"] = "Fas",
["paa-flp"] = "Dataran Tasik Barat Jauh",
["paa-gkw"] = "Kwerba Raya",
["paa-gto"] = "Galela-Tobelo",
["paa-hya"] = "Heyo-Yahang",
["paa-ing"] = "Teluk Pedalaman",
["paa-isk"] = "Sko Pedalaman",
["paa-iwa"] = "Iwam",
["paa-kae"] = "Kamula-Elevala",
["paa-kan"] = "Kanum",
["paa-kay"] = "Kayagarik",
["paa-ker"] = "Keram",
["paa-kiw"] = "Kiwaian",
["paa-kko"] = "Kaure-Kosare",
["paa-koa"] = "Kombio-Arapesh",
["paa-kol"] = "Kolopom",
["paa-kom"] = "Kombio",
["paa-kun"] = "Kunimaipan",
["paa-kwa"] = "Kwalean",
["paa-kwe"] = "Kwerba tepat",
["paa-kwo"] = "Kwomtari",
["paa-lla"] = "Loloda-Laba",
["paa-lma"] = "May Kiri",
["paa-lmu"] = "Lepki-Murkim",
["paa-lpl"] = "Dataran Tasik",
["paa-lra"] = "Ramu Bawah",
["paa-lse"] = "Sepik Bawah",
["paa-mai"] = "Mairasi",
["paa-mal"] = "Mailuan",
["paa-mam"] = "Maimai",
["paa-man"] = "Manubaran",
["paa-mar"] = "Marienberg",
["paa-may"] = "Maybratik",
["paa-mbi"] = "Mbaham-Iha",
["paa-mby"] = "Marind-Boazi-Yaqay",
["paa-mmu"] = "Mandi-Muniwara",
["paa-mon"] = "Monumbo",
["paa-mri"] = "Marindik",
["paa-nam"] = "Nambu",
["paa-nbo"] = "Bougainville Utara",
["paa-ndu"] = "Ndu",
["paa-ngk"] = "Ngkolmpu",
["paa-nha"] = "Halmahera Utara",
["paa-nim"] = "Nimboran",
["paa-nnd"] = "Ndu Nuklear",
["paa-nnh"] = "Halmahera Utara Bahagian Utara",
["paa-nto"] = "Namla-Tofanma",
["paa-ott"] = "Ottilien",
["paa-pah"] = "Sungai Pahoturi",
["paa-pal"] = "Palei",
["paa-pia"] = "Piawi",
["paa-pio"] = "Sungai Piore",
["paa-por"] = "Porapora",
["paa-ram"] = "Ramu",
["paa-rsa"] = "Rasawa-Saponi",
["paa-rub"] = "Ruboni",
["paa-saa"] = "Samarokena-Airoran",
["paa-sah"] = "Sahu",
["paa-sbo"] = "Bougainville Selatan",
["paa-sen"] = "Sentani",
["paa-sep"] = "Sepik",
["paa-shi"] = "Bukit Serra",
["paa-sko"] = "Sko",
["paa-sng"] = "Senagi",
["paa-taa"] = "Taikat-Awyi",
["paa-tam"] = "Tamolan",
["paa-tap"] = "Timor-Alor-Pantar",
["paa-teb"] = "Teberan",
["paa-tir"] = "Tirio",
["paa-tki"] = "Turama-Kikori",
["paa-ton"] = "Tonda",
["paa-too"] = "Tor-Orya",
["paa-tor"] = "Tor",
["paa-trr"] = "Torricelli",
["paa-tti"] = "Ternate-Tidore",
["paa-wal"] = "Walio",
["paa-wap"] = "Wapei",
["paa-war"] = "Waris",
["paa-wbh"] = "Kepala Burung Barat",
["paa-wel"] = "Eleman Barat",
["paa-wig"] = "Teluk Pedalaman Barat",
["paa-wke"] = "Keram Barat",
["paa-wko"] = "Wára-Kómnzo",
["paa-wlp"] = "Dataran Tasik Barat",
["paa-wpa"] = "Wapei-Palei",
["paa-wpw"] = "Pauwasi Barat",
["paa-yam"] = "Yam",
["paa-yaq"] = "Yaqayik",
["paa-ysa"] = "Yawa-Saweru",
["paa-yua"] = "Yuat",
["phi"] = "Filipina",
["phi-kal"] = "Kalamian",
["poz"] = "Melayu-Polinesia",
["poz-aay"] = "Kepulauan Admiralty",
["poz-bnn"] = "Borneo Utara",
["poz-bre"] = "Barito Timur",
["poz-brw"] = "Barito Barat",
["poz-bss"] = "Bali-Sasak-Sumbawa",
["poz-btk"] = "Bungku-Tolaki",
["poz-cet"] = "Melayu-Polinesia Tengah-Timur",
["poz-clb"] = "Sulawesi",
["poz-cln"] = "New Caledonia",
["poz-cma"] = "Maluku Tengah",
["poz-hce"] = "Halmahera-Cenderawasih",
["poz-kal"] = "Kaili-Pamona",
["poz-lgx"] = "Lampungik",
["poz-mcm"] = "Melayu-Chamik",
["poz-mic"] = "Mikronesia",
["poz-mly"] = "Melayik",
["poz-msa"] = "Melayu-Sumbawa",
["poz-mun"] = "Muna-Buton",
["poz-nws"] = "Sumatera Barat Laut",
["poz-occ"] = "Oceania Tengah-Timur",
["poz-oce"] = "Oceania",
["poz-ocs"] = "Oceania Selatan",
["poz-ocw"] = "Oceania Barat",
["poz-pcc"] = "Pasifik Tengah",
["poz-pep"] = "Polinesia Timur",
["poz-pnp"] = "Polinesia Nuklear",
["poz-pol"] = "Polinesia",
["poz-san"] = "Sabah",
["poz-sbj"] = "Sama-Bajau",
["poz-slb"] = "Saluan-Banggai",
["poz-sls"] = "Solomon Tenggara",
["poz-ssw"] = "Sulawesi Selatan",
["poz-stm"] = "St. Matthias",
["poz-swa"] = "Sarawak Utara",
["poz-tem"] = "Temotu",
["poz-tim"] = "Timorik",
["poz-ton"] = "Tongik",
["poz-tot"] = "Tomini-Tolitoli",
["poz-vnc"] = "Vanuatu Tengah",
["poz-vnn"] = "Vanuatu Utara",
["poz-vns"] = "Vanuatu Selatan",
["poz-wot"] = "Wotu-Wolio",
["pqe"] = "Melayu-Polinesia Timur",
["qfa-adc"] = "Andaman Raya Tengah",
["qfa-adm"] = "Andaman Raya",
["qfa-adn"] = "Andaman Raya Utara",
["qfa-ads"] = "Andaman Raya Selatan",
["qfa-ain"] = "Ainuik",
["qfa-bej"] = "Be-Jizhao",
["qfa-bet"] = "Be-Tai",
["qfa-buy"] = "Buyang",
["qfa-cka"] = "Chukotka-Kamchatka",
["qfa-ckn"] = "Chukotka",
["qfa-cnt"] = "sentuhan",
["qfa-cre"] = "kreol",
["qfa-dgn"] = "Dogon",
["qfa-dis"] = "pertalian yang dipertikaikan",
["qfa-dny"] = "Dene-Yenisei",
["qfa-hur"] = "Hurro-Urartian",
["qfa-iso"] = "pencilan",
["qfa-kad"] = "Kadu",
["qfa-kms"] = "Kam-Sui",
["qfa-kor"] = "Koreanik",
["qfa-kra"] = "Kra",
["qfa-lic"] = "Hlai",
["qfa-mch"] = "Makro-Chibcha",
["qfa-mix"] = "campuran",
["qfa-not"] = "bukan sekeluarga",
["qfa-onb"] = "Be",
["qfa-ong"] = "Ongan",
["qfa-pid"] = "pijin",
["qfa-sub"] = "substratum",
["qfa-tak"] = "Kra-Dai",
["qfa-tyn"] = "Tyrsenia",
["qfa-unc"] = "tidak dapat dikelaskan",
["qfa-xgs"] = "Serbi-Mongolik",
["qfa-xgx"] = "Para-Mongolik",
["qfa-yen"] = "Yenisei",
["qfa-yke"] = "Ketik",
["qfa-yko"] = "Kottik",
["qfa-ypm"] = "Pumpokolik",
["qfa-yrn"] = "Arinik",
["qfa-yuk"] = "Yukaghir",
["qwe"] = "Quechua",
["raj"] = "Rajasthan",
["roa"] = "Romawi",
["roa-asl"] = "Asturleon",
["roa-cas"] = "Castilia",
["roa-dal"] = "Romawi Dalmatia",
["roa-eas"] = "Romawi Timur",
["roa-emr"] = "Emilia-Romagnol",
["roa-gap"] = "Galicia-Portugis",
["roa-gar"] = "Gallo-Romawi",
["roa-git"] = "Gallo-Italik",
["roa-grh"] = "Gallo-Raetia",
["roa-ibe"] = "Ibero-Romawi",
["roa-itd"] = "Italo-Dalmatia",
["roa-itr"] = "Italo-Romawi",
["roa-iwr"] = "Italo-Romawi Barat",
["roa-nar"] = "Navarro-Aragon",
["roa-ocr"] = "Occitano-Romawi",
["roa-oil"] = "Oïl",
["roa-rhe"] = "Rhaeto-Romawi",
["roa-sou"] = "Romawi Selatan",
["roa-wes"] = "Romawi Barat",
["sai-ara"] = "Arauca",
["sai-aym"] = "Aymara",
["sai-bar"] = "Barbacoa",
["sai-bor"] = "Boran",
["sai-cah"] = "Cahuapanan",
["sai-car"] = "Karib",
["sai-cer"] = "Cerrado",
["sai-chc"] = "Choco",
["sai-cho"] = "Chonan",
["sai-cje"] = "Jê Tengah",
["sai-cpc"] = "Chapacuran",
["sai-crn"] = "Charruan",
["sai-ctc"] = "Catacao",
["sai-guc"] = "Guaicuruan",
["sai-guh"] = "Guajibo",
["sai-gui"] = "Guiana",
["sai-har"] = "Harákmbut",
["sai-hkt"] = "Harákmbut-Katukinan",
["sai-hrp"] = "Huarpean",
["sai-jee"] = "Jê",
["sai-jir"] = "Jirajaran",
["sai-jiv"] = "Jivaro",
["sai-ktk"] = "Katukinan",
["sai-kui"] = "Kuikuroan",
["sai-map"] = "Mapoyan",
["sai-mas"] = "Mascoian",
["sai-mgc"] = "Mataco-Guaicuru",
["sai-mje"] = "Makro-Jê",
["sai-mtc"] = "Matacoan",
["sai-mur"] = "Mura",
["sai-nad"] = "Nadahup",
["sai-nje"] = "Jê Utara",
["sai-nmk"] = "Nambikwaran",
["sai-otm"] = "Otomacoan",
["sai-pan"] = "Pano",
["sai-pat"] = "Pano-Tacana",
["sai-pek"] = "Pekodian",
["sai-pem"] = "Pemong",
["sai-pey"] = "Peba-Yaguan",
["sai-prk"] = "Parukotoan",
["sai-sje"] = "Jê Selatan",
["sai-tac"] = "Tacanan",
["sai-tar"] = "Tarano",
["sai-tin"] = "Tiniguan",
["sai-tuc"] = "Tucanoan",
["sai-tyu"] = "Ticuna-Yuri",
["sai-ucp"] = "Uru-Chipaya",
["sai-ven"] = "Karib Venezuela",
["sai-wic"] = "Wichí",
["sai-wit"] = "Witotoan",
["sai-ynm"] = "Yanomami",
["sai-yuk"] = "Yukpan",
["sai-zam"] = "Zamucoan",
["sai-zap"] = "Zaparo",
["sal"] = "Salish",
["sdv"] = "SudanikTimur",
["sdv-bri"] = "Bari",
["sdv-daj"] = "Daju",
["sdv-dnu"] = "Dinka-Nuer",
["sdv-eje"] = "Jebel Timur",
["sdv-kln"] = "Kalenjin",
["sdv-lma"] = "Lotuko-Maa",
["sdv-lon"] = "Luo Utara",
["sdv-los"] = "Luo Selatan",
["sdv-luo"] = "Luo",
["sdv-nes"] = "SudanikTimur Utara",
["sdv-nie"] = "Nilotik Timur",
["sdv-nil"] = "Nilotik",
["sdv-nis"] = "Nilotik Selatan",
["sdv-niw"] = "Nilotik Barat",
["sdv-nma"] = "Nandi-Markweta",
["sdv-nyi"] = "Nyima",
["sdv-tmn"] = "Taman",
["sdv-ttu"] = "Teso-Turkana",
["sel"] = "Selkup",
["sem"] = "Samiah",
["sem-ara"] = "Aram",
["sem-arb"] = "Arab",
["sem-are"] = "Aram Timur",
["sem-arw"] = "Aram Barat",
["sem-ase"] = "Aram Tenggara",
["sem-can"] = "Kanaan",
["sem-cen"] = "Samiah Tengah",
["sem-cna"] = "Neo-Aram Tengah",
["sem-eas"] = "Samiah Timur",
["sem-eth"] = "Samiah Habsyah",
["sem-nna"] = "Neo-Aram Timur Laut",
["sem-nwe"] = "Samiah Barat Laut",
["sem-osa"] = "Arab Selatan Kuno",
["sem-sar"] = "Arab Selatan Moden",
["sem-wes"] = "Samiah Barat",
["sgn"] = "isyarat",
["sgn-asl"] = "Bahasa Isyarat Amerika",
["sgn-fsl"] = "Bahasa-bahasa Isyarat Perancis",
["sgn-gsl"] = "Bahasa-bahasa Isyarat Jerman",
["sgn-jsl"] = "Bahasa-bahasa Isyarat Jepun",
["sio"] = "Sioux",
["sio-dhe"] = "Dhegiha",
["sio-dkt"] = "Dakota",
["sio-mor"] = "Sioux Sungai Missouri",
["sio-msv"] = "Sioux Lembah Mississippi",
["sio-ohv"] = "Sioux Lembah Ohio",
["sit"] = "Sino-Tibet",
["sit-aao"] = "Naga Tengah",
["sit-alm"] = "Almora",
["sit-bai"] = "Bai",
["sit-bdi"] = "Bod",
["sit-cln"] = "Cai-Long",
["sit-dhi"] = "Dhimalish",
["sit-ebo"] = "Bod Timur",
["sit-egy"] = "rGyalrongik Timur",
["sit-ers"] = "Ersuik",
["sit-gma"] = "Magarik Raya",
["sit-gsi"] = "Siangik Raya",
["sit-hrs"] = "Hrusish",
["sit-jnp"] = "Jingphoik",
["sit-jpl"] = "Kachin-Luik",
["sit-kch"] = "Konyak-Chang",
["sit-kha"] = "Kham",
["sit-khb"] = "Kho-Bwa",
["sit-khc"] = "Chug-Lish",
["sit-khm"] = "Mey-Sartang",
["sit-khw"] = "Kho-Bwa Barat",
["sit-kic"] = "Kiranti Tengah",
["sit-kie"] = "Kiranti Timur",
["sit-kin"] = "Kinnaurik",
["sit-kir"] = "Kiranti",
["sit-kiw"] = "Kiranti Barat",
["sit-kon"] = "Naga Utara",
["sit-kyk"] = "Kyirong-Kagate",
["sit-lab"] = "Ladakhi-Balti",
["sit-las"] = "Lahuli-Spiti",
["sit-luu"] = "Lui",
["sit-mar"] = "Maringik",
["sit-mba"] = "Makro-Bai",
["sit-mdz"] = "Midzu",
["sit-mnz"] = "Mondzi",
["sit-mru"] = "Mruik",
["sit-nas"] = "Naish",
["sit-nax"] = "Naik",
["sit-nba"] = "Bai Utara",
["sit-new"] = "Newarik",
["sit-nng"] = "Nung",
["sit-qia"] = "Qiangik",
["sit-rgy"] = "Rgyalrongik",
["sit-sba"] = "Sino-Bai",
["sit-tam"] = "Tamangik",
["sit-tan"] = "Tani",
["sit-tib"] = "Tibetik",
["sit-tja"] = "Tujia",
["sit-tma"] = "Tangkhul-Maring",
["sit-tng"] = "Tangkhulik",
["sit-tno"] = "Tangsa-Nocte",
["sit-tsk"] = "Tshangla",
["sit-wgy"] = "rGyalrongik Barat",
["sit-whm"] = "Himalaya Barat",
["sit-zem"] = "Zeme",
["sla"] = "Slavik",
["smi"] = "Sami",
["son"] = "Songhay",
["sqj"] = "Albania",
["ssa"] = "Nilo-Sahara",
["ssa-fur"] = "Fur",
["ssa-klk"] = "Kuliak",
["ssa-kom"] = "Koman",
["ssa-sah"] = "Sahara",
["syd"] = "Samoyed",
["syd-ene"] = "Enets",
["tai"] = "Tai",
["tai-cen"] = "Tai Tengah",
["tai-cho"] = "Tai Chongzuo",
["tai-nor"] = "Tai Utara",
["tai-sap"] = "Sapa-Tai Barat Daya",
["tai-swe"] = "Tai Barat Daya",
["tai-tay"] = "Tày",
["tai-wen"] = "Wenma-Tai Barat Daya",
["tbq"] = "Tibet-Burma",
["tbq-anp"] = "Angami-Pochuri",
["tbq-axi"] = "Axioid",
["tbq-bdg"] = "Bodo-Garo",
["tbq-bis"] = "Bisoid",
["tbq-bka"] = "Bi-Ka",
["tbq-bkj"] = "Sal",
["tbq-brm"] = "Burmik",
["tbq-buq"] = "Burmo-Qiangik",
["tbq-drp"] = "Phula Hilir",
["tbq-han"] = "Hanoid",
["tbq-hph"] = "Phula Tanah Tinggi",
["tbq-jin"] = "Jino",
["tbq-kuk"] = "Kuki-Chin",
["tbq-kzh"] = "Kazhuoish",
["tbq-lal"] = "Lalo",
["tbq-lho"] = "Lahoish",
["tbq-llo"] = "Lipo-Lolopo",
["tbq-lob"] = "Lolo-Burma",
["tbq-lol"] = "Loloik",
["tbq-lso"] = "Lisu",
["tbq-lwo"] = "Lawu",
["tbq-muj"] = "Muji",
["tbq-nas"] = "Nasu",
["tbq-nis"] = "Nisu",
["tbq-nlo"] = "Loloik Utara",
["tbq-nso"] = "Niso",
["tbq-nus"] = "Nusu",
["tbq-phw"] = "Phowa",
["tbq-rph"] = "Phula Sungai",
["tbq-sel"] = "Loloik Tenggara",
["tbq-sil"] = "Siloid",
["tbq-slo"] = "Loloik Selatan",
["tbq-tal"] = "Talu",
["tbq-urp"] = "Phula Hulu",
["trk"] = "Turkik",
["trk-cmn"] = "Turkik Am",
["trk-kar"] = "Karluk",
["trk-kbu"] = "Kipchak-Bulgar",
["trk-kcu"] = "Kipchak-Cuman",
["trk-kip"] = "Kipchak",
["trk-kkp"] = "Kyrgyz-Kipchak",
["trk-kno"] = "Kipchak-Nogai",
["trk-nsb"] = "Turkik Siberia Utara",
["trk-ogr"] = "Oghur",
["trk-ogz"] = "Oghuz",
["trk-sib"] = "Turkik Siberia",
["trk-ssb"] = "Turkik Siberia Selatan",
["tup"] = "Tupi",
["tup-gua"] = "Tupi-Guarani",
["tuw"] = "Tungusik",
["tuw-ewe"] = "Ewenik",
["tuw-jrc"] = "Jurchenik",
["tuw-nan"] = "Nanaik",
["tuw-udg"] = "Udegheik",
["urj"] = "Uralik",
["urj-fin"] = "Finnik",
["urj-mdv"] = "Mordvinik",
["urj-prm"] = "Permik",
["urj-ugr"] = "Ugriik",
["wak"] = "Wakash",
["wen"] = "Sorbia",
["xgn"] = "Mongolik",
["xgn-cen"] = "Mongolik Tengah",
["xgn-shr"] = "Shirongolik",
["xgn-sou"] = "Mongolik Selatan",
["xme"] = "Medes",
["xme-ttc"] = "Tatik",
["xnd"] = "Na-Dene",
["xsc"] = "Scythia",
["xsc-sak"] = "Saka",
["xsc-sar"] = "Sarmata",
["xsc-skw"] = "Saka-Wakhi",
["yok"] = "Yokuts",
["ypk"] = "Yupik",
["yrk"] = "Nenets",
["zhx"] = "Sinitik",
["zhx-com"] = "Min Pesisir",
["zhx-inm"] = "Min Pedalaman",
["zhx-man"] = "Mandarinik",
["zhx-min"] = "Min",
["zhx-nan"] = "Min Selatan",
["zhx-pin"] = "Pinghua",
["zhx-yue"] = "Yue",
["zle"] = "Slavik Timur",
["zls"] = "Slavik Selatan",
["zlw"] = "Slavik Barat",
["zlw-lch"] = "Lechitik",
["zlw-pom"] = "Pomerania",
["znd"] = "Zande",
}
31jb7ny54t025v84kevmr0v0bac643b
Modul:families/canonical names
828
34583
373562
373518
2026-09-11T13:20:56Z
Hakimi97
2668
[[MediaWiki:UpdateLanguageNameAndCode.js|dikemas kini menggunakan gajet bahasa]]
373562
Scribunto
text/plain
return {
["Abenaki-Penobscot"] = "alg-abp",
["Abkhaz-Abaza"] = "cau-abz",
["Adamawa"] = "alv-ada",
["Adelbert Selatan"] = "ngf-sad",
["Adelbert Utara"] = "ngf-nad",
["Afroasia"] = "afa",
["Aian"] = "paa-aia",
["Ainuik"] = "qfa-ain",
["Aisian"] = "ngf-ais",
["Aizi"] = "kro-aiz",
["Alacalufan"] = "aqa",
["Albania"] = "sqj",
["Algik"] = "aql",
["Algonquin"] = "alg",
["Algonquin Timur"] = "alg-eas",
["Almora"] = "sit-alm",
["Alor-Pantar"] = "paa-alp",
["Alumik"] = "nic-alu",
["Amto-Musan"] = "paa-amu",
["Anatolia"] = "ine-ana",
["Andaman Raya"] = "qfa-adm",
["Andaman Raya Selatan"] = "qfa-ads",
["Andaman Raya Tengah"] = "qfa-adc",
["Andaman Raya Utara"] = "qfa-adn",
["Andi"] = "cau-and",
["Angal-Kewa"] = "ngf-ank",
["Angami-Pochuri"] = "tbq-anp",
["Angan"] = "ngf-ang",
["Anglia"] = "gmw-ang",
["Anglo-Frisia"] = "gmw-afr",
["Anglo-Norman Ireland"] = "gmw-ian",
["Anim"] = "paa-ani",
["Ankave-Tainae-Akoye"] = "ngf-ata",
["Ao"] = "njo",
["Apache"] = "apa",
["Arab"] = "sem-arb",
["Arab Selatan Kuno"] = "sem-osa",
["Arab Selatan Moden"] = "sem-sar",
["Arafundi"] = "paa-arf",
["Aram"] = "sem-ara",
["Aram Barat"] = "sem-arw",
["Aram Tenggara"] = "sem-ase",
["Aram Timur"] = "sem-are",
["Arandic"] = "aus-rnd",
["Arapaho"] = "alg-ara",
["Arapesh"] = "paa-ara",
["Arauca"] = "sai-ara",
["Arawa"] = "auf",
["Arawak"] = "awd",
["Arinik"] = "qfa-yrn",
["Armenia"] = "hyx",
["Arnhem"] = "aus-arn",
["Aroid"] = "omv-aro",
["Asli"] = "mkh-asl",
["Asmat"] = "ngf-asm",
["Asmat-Kamoro"] = "ngf-ask",
["Asturleon"] = "roa-asl",
["Ataitan"] = "paa-ata",
["Atayalik"] = "map-ata",
["Athabaska"] = "ath",
["Athabaska Pesisir Pasifik"] = "ath-pco",
["Athabaska Utara"] = "ath-nor",
["Atlantik-Congo"] = "alv",
["Austroasia"] = "aav",
["Austronesia"] = "map",
["Avar-Andi"] = "cau-ava",
["Awyu"] = "ngf-awy",
["Awyu Raya"] = "ngf-gaw",
["Awyu-Dumut"] = "ngf-awd",
["Axioid"] = "tbq-axi",
["Ayere-Ahan"] = "alv-aah",
["Aymara"] = "sai-aym",
["Bafia"] = "bnt-baf",
["Bafo-Bonkeng"] = "bnt-bbo",
["Baga"] = "alv-bag",
["Bagirmi"] = "csu-bgr",
["Bahasa Isyarat Amerika"] = "sgn-asl",
["Bahasa-bahasa Isyarat Jepun"] = "sgn-jsl",
["Bahasa-bahasa Isyarat Jerman"] = "sgn-gsl",
["Bahasa-bahasa Isyarat Perancis"] = "sgn-fsl",
["Bahasa-bahasa KRDS"] = "inc-krd",
["Bahnarik"] = "mkh-ban",
["Bahnarik Utara"] = "mkh-nbn",
["Bai"] = "sit-bai",
["Bai Utara"] = "sit-nba",
["Baining"] = "paa-bai",
["Bak"] = "alv-bak",
["Baka"] = "nic-nkb",
["Bali-Sasak-Sumbawa"] = "poz-bss",
["Baltik"] = "bat",
["Baltik Barat"] = "bat-wes",
["Baltik Timur"] = "bat-eas",
["Balto-Slavik"] = "ine-bsl",
["Bambuka"] = "alv-bam",
["Bamileke"] = "bai",
["Banda"] = "bad",
["Banda Tengah"] = "bad-cnt",
["Bangi-Moi"] = "bnt-bmo",
["Bangi-Ntomba"] = "bnt-bnm",
["Bangi-Tetela"] = "bnt-bte",
["Bantoid"] = "nic-bod",
["Bantoid Selatan"] = "nic-bds",
["Bantoid Utara"] = "nic-bdn",
["Bantoid-Cross"] = "nic-bcr",
["Bantu"] = "bnt",
["Bantu Barat Daya"] = "bnt-swb",
["Bantu Pesisir Timur Laut"] = "bnt-ncb",
["Bantu Selatan"] = "bnt-bso",
["Bantu Tasik-Tasik Besar"] = "bnt-glb",
["Bantu Timur Laut"] = "bnt-bne",
["Banyum"] = "alv-bny",
["Barbacoa"] = "sai-bar",
["Barbar"] = "ber",
["Bari"] = "sdv-bri",
["Barito Barat"] = "poz-brw",
["Barito Timur"] = "poz-bre",
["Baruya-Simbari"] = "ngf-bsi",
["Basa"] = "nic-bas",
["Basaa"] = "bnt-bsa",
["Batak"] = "btk",
["Bati-Angba"] = "bnt-bta",
["Bayono-Awbono"] = "paa-baa",
["Be"] = "qfa-onb",
["Be-Jizhao"] = "qfa-bej",
["Be-Tai"] = "qfa-bet",
["Beboid"] = "nic-beb",
["Beboid Timur"] = "nic-bbe",
["Becking-Dawi"] = "ngf-bda",
["Bekwilic"] = "bnt-bek",
["Bena-Kinga"] = "bnt-bki",
["Bendi"] = "nic-ben",
["Benggali–Assam"] = "inc-bas",
["Benue-Congo"] = "nic-bco",
["Beromik"] = "nic-beo",
["Betaf-Vitou"] = "paa-bvi",
["Beti"] = "bnt-btb",
["Bewani"] = "paa-bew",
["Bhil"] = "inc-bhi",
["Bi-Ka"] = "tbq-bka",
["Bihar"] = "inc-bih",
["Bikwin-Jen"] = "alv-bwj",
["Binanderean"] = "ngf-bin",
["Binanderean Raya"] = "ngf-gbi",
["Binanderean Utara"] = "ngf-nbi",
["Birri-Kresh"] = "csu-bkr",
["Bisa-Busa"] = "dmn-bbu",
["Bisoid"] = "tbq-bis",
["Boan"] = "bnt-boa",
["Boane"] = "ngf-boa",
["Boazi"] = "paa-boa",
["Bod"] = "sit-bdi",
["Bod Timur"] = "sit-ebo",
["Bodo-Garo"] = "tbq-bdg",
["Boma-Dzing"] = "bnt-bdz",
["Bongo-Bagirmi"] = "csu-bba",
["Bongo-Baka"] = "csu-bbk",
["Boran"] = "sai-bor",
["Border"] = "paa-bor",
["Borneo Utara"] = "poz-bnn",
["Bosavi"] = "ngf-bos",
["Bosngun-Awar"] = "paa-baw",
["Botatwe"] = "bnt-bot",
["Bougainville Selatan"] = "paa-sbo",
["Bougainville Utara"] = "paa-nbo",
["Brythonik"] = "cel-bry",
["Brythonik Barat"] = "cel-brw",
["Brythonik Barat Daya"] = "cel-brs",
["Bua"] = "alv-bua",
["Buja-Ngombe"] = "bnt-bun",
["Bukit Serra"] = "paa-shi",
["Buli-Koma"] = "nic-buk",
["Bungku-Tolaki"] = "poz-btk",
["Bunuba"] = "aus-bub",
["Burmik"] = "tbq-brm",
["Burmo-Qiangik"] = "tbq-buq",
["Bushoong"] = "bnt-bsh",
["Buyang"] = "qfa-buy",
["Bwa"] = "nic-bwa",
["Bété"] = "kro-bet",
["Caddo"] = "cdd",
["Cahuapanan"] = "sai-cah",
["Cai-Long"] = "sit-cln",
["Cangin"] = "alv-cng",
["Caspia"] = "ira-csp",
["Castilia"] = "roa-cas",
["Catacao"] = "sai-ctc",
["Catawba"] = "nai-cat",
["Cerrado"] = "sai-cer",
["Chad Timur"] = "cdc-est",
["Chadik"] = "cdc",
["Chadik Barat"] = "cdc-wst",
["Chadik Tengah"] = "cdc-cbm",
["Chaga"] = "bnt-chg",
["Chaga-Taita"] = "bnt-cht",
["Chamik"] = "cmc",
["Chapacuran"] = "sai-cpc",
["Charruan"] = "sai-crn",
["Chatino"] = "omq-cha",
["Chibcha"] = "cba",
["Chimakuan"] = "chi",
["Chimbu-Wahgi"] = "ngf-chw",
["Chinantecan"] = "omq-chi",
["Chinook"] = "nai-ckn",
["Chitral"] = "inc-chi",
["Choco"] = "sai-chc",
["Chokwe-Luchazi"] = "bnt-clu",
["Chonan"] = "sai-cho",
["Chug-Lish"] = "sit-khc",
["Chukotka"] = "qfa-ckn",
["Chukotka-Kamchatka"] = "qfa-cka",
["Chumashan"] = "nai-chu",
["Circassia"] = "cau-cir",
["Comoros"] = "bnt-com",
["Coosan"] = "nai-coo",
["Cross River"] = "nic-cri",
["Cross River Hilir"] = "nic-lcr",
["Cross River Hulu"] = "nic-ucr",
["Cross River Hulu Timur-Barat"] = "nic-uce",
["Cross River Hulu Utara-Selatan"] = "nic-ucn",
["Cuicatec"] = "omq-cui",
["Cupan"] = "azc-cup",
["Dagan"] = "ngf-dag",
["Dagbani"] = "nic-dag",
["Daju"] = "sdv-daj",
["Dakoid"] = "nic-dak",
["Dakota"] = "sio-dkt",
["Dallman"] = "ngf-dal",
["Daly"] = "aus-dal",
["Dangari"] = "inc-dng",
["Dani"] = "ngf-dan",
["Dani Lembah Besar"] = "ngf-gvd",
["Dani Tengah"] = "ngf-cda",
["Dardik"] = "inc-dar",
["Dardik Timur"] = "inc-dre",
["Dargwa"] = "cau-drg",
["Dataran Tasik"] = "paa-lpl",
["Dataran Tasik Barat"] = "paa-wlp",
["Dataran Tasik Barat Jauh"] = "paa-flp",
["Dataran Tasik Tengah"] = "paa-clp",
["Dataran Tasik Timur"] = "paa-elp",
["Dayak Darat"] = "day",
["Delta Tengah"] = "nic-cde",
["Dene-Yenisei"] = "qfa-dny",
["Dhegiha"] = "sio-dhe",
["Dhimalish"] = "sit-dhi",
["Dida"] = "kro-did",
["Dinka-Nuer"] = "sdv-dnu",
["Dizoid"] = "omv-diz",
["Dogon"] = "qfa-dgn",
["Dogon Barat"] = "nic-dgw",
["Dogon Dataran"] = "nic-pld",
["Dogon Penara Utara"] = "nic-npd",
["Doso-Turumsa"] = "paa-dtu",
["Dravidia"] = "dra",
["Dravidia Selatan"] = "dra-sou",
["Dravidia Selatan I"] = "dra-sdo",
["Dravidia Selatan II"] = "dra-sdt",
["Dravidia Tengah"] = "dra-cen",
["Dravidia Utara"] = "dra-nor",
["Dumut"] = "ngf-dum",
["Duru"] = "alv-dur",
["Dyirbal"] = "aus-dyb",
["Ede"] = "alv-ede",
["Edekiri"] = "alv-edk",
["Edo-Esan-Ora"] = "alv-eeo",
["Edoid"] = "alv-edo",
["Edoid Barat Daya"] = "alv-swd",
["Edoid Barat Laut"] = "alv-nwd",
["Edoid Delta"] = "alv-dlt",
["Edoid Utara-Tengah"] = "alv-nce",
["Ekoid"] = "nic-eko",
["Eleman"] = "paa-ele",
["Eleman Barat"] = "paa-wel",
["Eleman Timur"] = "paa-eel",
["Emilia-Romagnol"] = "roa-emr",
["Enets"] = "syd-ene",
["Engan"] = "ngf-eng",
["Engan Luar"] = "ngf-oen",
["Engik"] = "ngf-enc",
["Erap"] = "ngf-era",
["Ersuik"] = "sit-ers",
["Escarpment Dogon"] = "nic-dge",
["Eskimo"] = "esx-esk",
["Eskimo-Aleut"] = "esx",
["Evapia"] = "ngf-eva",
["Ewenik"] = "tuw-ewe",
["Fali"] = "alv-fli",
["Fas"] = "paa-fas",
["Filipina"] = "phi",
["Finisterre"] = "ngf-fin",
["Finisterre-Huon"] = "ngf-fhu",
["Finnik"] = "urj-fin",
["Fore-Gimi"] = "ngf-fgi",
["Franconia Tanah Rendah"] = "gmw-frk",
["Frisia"] = "gmw-fri",
["Fula-Wolof"] = "alv-fwo",
["Fur"] = "ssa-fur",
["Furu"] = "nic-fru",
["Ga-Dangme"] = "alv-gda",
["Gaena-Korafe"] = "ngf-gko",
["Gahuku"] = "ngf-gah",
["Galela-Tobelo"] = "paa-gto",
["Galicia-Portugis"] = "roa-gap",
["Gallo-Italik"] = "roa-git",
["Gallo-Raetia"] = "roa-grh",
["Gallo-Romawi"] = "roa-gar",
["Garawan"] = "aus-gar",
["Gauwa"] = "ngf-gau",
["Gbanziri"] = "nic-nkg",
["Gbaya"] = "gba",
["Gbaya Barat"] = "gba-wes",
["Gbaya Selatan"] = "gba-sou",
["Gbaya Timur"] = "gba-eas",
["Gbe"] = "alv-gbe",
["Gelao"] = "gio",
["Georgia-Zan"] = "ccs-gzn",
["Gogodala-Suki"] = "ngf-gsu",
["Goidelik"] = "cel-gae",
["Gondi"] = "dra-gon",
["Gondi-Kui"] = "dra-gki",
["Gonga"] = "omv-gon",
["Goroka"] = "ngf-gor",
["Grassfields"] = "nic-grf",
["Grassfields Barat Daya"] = "nic-grs",
["Grassfields Timur"] = "nic-gre",
["Grebo"] = "kro-grb",
["Grebo tepat"] = "grb",
["Guaicuruan"] = "sai-guc",
["Guajibo"] = "sai-guh",
["Guang"] = "alv-gng",
["Guarani"] = "gn",
["Guiana"] = "sai-gui",
["Gum"] = "ngf-gum",
["Gunwinyguan"] = "aus-gun",
["Gur"] = "nic-gur",
["Gurma"] = "nic-grm",
["Gurunsi"] = "nic-gns",
["Gurunsi Barat"] = "nic-gnw",
["Gurunsi Timur"] = "nic-gne",
["Gurunsi Utara"] = "nic-gnn",
["Gusap-Mot"] = "ngf-gmo",
["Hagen"] = "ngf-hag",
["Halbik"] = "inc-hal",
["Halmahera Utara"] = "paa-nha",
["Halmahera Utara Bahagian Utara"] = "paa-nnh",
["Halmahera-Cenderawasih"] = "poz-hce",
["Hanoid"] = "tbq-han",
["Hanseman"] = "ngf-han",
["Hanseman Barat Laut"] = "ngf-nwh",
["Harákmbut"] = "sai-har",
["Harákmbut-Katukinan"] = "sai-hkt",
["Haya-Jita"] = "bnt-haj",
["Heiban"] = "alv-hei",
["Hellenik"] = "grk",
["Heyo-Yahang"] = "paa-hya",
["Hill Nubian"] = "nub-hil",
["Himalaya Barat"] = "sit-whm",
["Hindi Barat"] = "inc-hiw",
["Hindi Timur"] = "inc-hie",
["Hindustan"] = "inc-hnd",
["Hispano-Keltik"] = "cel-his",
["Hlai"] = "qfa-lic",
["Hmong-Mien"] = "hmx",
["Hmongik"] = "hmn",
["Hokan"] = "hok",
["Horpa"] = "ero",
["Hrusish"] = "sit-hrs",
["Huarpean"] = "sai-hrp",
["Huon"] = "ngf-huo",
["Huon Timur"] = "ngf-ehu",
["Hurro-Urartian"] = "qfa-hur",
["Ibero-Romawi"] = "roa-ibe",
["Ibibio-Efik"] = "nic-ief",
["Idomoid"] = "alv-ido",
["Igboid"] = "alv-igb",
["Ijoid"] = "ijo",
["Indo-Arya"] = "inc",
["Indo-Arya Barat"] = "inc-wes",
["Indo-Arya Barat Laut"] = "inc-nwe",
["Indo-Arya Kepulauan"] = "inc-ins",
["Indo-Arya Kuno"] = "inc-old",
["Indo-Arya Selatan"] = "inc-sou",
["Indo-Arya Tengah"] = "inc-mid",
["Indo-Arya Timur"] = "inc-eas",
["Indo-Arya Utara"] = "inc-nor",
["Indo-Eropah"] = "ine",
["Indo-Iran"] = "iir",
["Inuit"] = "esx-inu",
["Iran"] = "ira",
["Iran Barat"] = "ira-wes",
["Iran Barat Daya"] = "ira-swi",
["Iran Barat Laut"] = "ira-nwi",
["Iran Kuno"] = "ira-old",
["Iran Pusat"] = "ira-cen",
["Iran Tengah"] = "ira-mid",
["Iran Tenggara"] = "ira-sei",
["Iran Timur Laut"] = "ira-nei",
["Iroquois"] = "iro",
["Iroquois Utara"] = "iro-nor",
["Irula-Muduga"] = "dra-imd",
["Italik"] = "itc",
["Italo-Dalmatia"] = "roa-itd",
["Italo-Romawi"] = "roa-itr",
["Italo-Romawi Barat"] = "roa-iwr",
["Iwaidjan"] = "aus-wdj",
["Iwam"] = "paa-iwa",
["Jarawa"] = "nic-jrw",
["Jarawan"] = "nic-jrn",
["Jarrakan"] = "aus-jar",
["Jebel Timur"] = "sdv-eje",
["Jepunik"] = "jpx",
["Jera"] = "nic-jer",
["Jerman Tanah Rendah"] = "gmw-lgm",
["Jerman Tanah Tinggi"] = "gmw-hgm",
["Jermanik"] = "gem",
["Jermanik Barat"] = "gmw",
["Jermanik Laut Utara"] = "gmw-nsg",
["Jermanik Timur"] = "gme",
["Jermanik Utara"] = "gmq",
["Jicaquean"] = "nai-jcq",
["Jimi"] = "ngf-jim",
["Jingphoik"] = "sit-jnp",
["Jino"] = "tbq-jin",
["Jirajaran"] = "sai-jir",
["Jivaro"] = "sai-jiv",
["Jogo-Jeri"] = "dmn-jje",
["Jola"] = "alv-jol",
["Jola-Felupe"] = "alv-jfe",
["Jukunoid"] = "nic-jkn",
["Jurchenik"] = "tuw-jrc",
["Jê"] = "sai-jee",
["Jê Selatan"] = "sai-sje",
["Jê Tengah"] = "sai-cje",
["Jê Utara"] = "sai-nje",
["Ka-Togo"] = "alv-ktg",
["Kaba"] = "csu-kab",
["Kabwum"] = "ngf-kab",
["Kachin-Luik"] = "sit-jpl",
["Kadu"] = "qfa-kad",
["Kaili-Pamona"] = "poz-kal",
["Kainantu"] = "ngf-kai",
["Kainantu-Goroka"] = "ngf-kgo",
["Kainji"] = "nic-knj",
["Kainji Barat Laut"] = "nic-knn",
["Kainji Timur"] = "nic-kne",
["Kako"] = "bnt-kak",
["Kalam-Adelbert Selatan"] = "ngf-ksa",
["Kalam-Kobon"] = "ngf-kak",
["Kalamian"] = "phi-kal",
["Kalapuyan"] = "nai-klp",
["Kalenjin"] = "sdv-kln",
["Kam-Sui"] = "qfa-kms",
["Kamano-Yagaria"] = "ngf-kya",
["Kambari"] = "nic-kam",
["Kamuku"] = "nic-kmk",
["Kamula-Elevala"] = "paa-kae",
["Kanaan"] = "sem-can",
["Kannadoid"] = "dra-kan",
["Kanum"] = "paa-kan",
["Kapau-Menya"] = "ngf-kme",
["Karaboro"] = "alv-krb",
["Karen"] = "kar",
["Karib"] = "sai-car",
["Karib Venezuela"] = "sai-ven",
["Karluk"] = "trk-kar",
["Karnic"] = "aus-kar",
["Kartvelia"] = "ccs",
["Kashmirik"] = "inc-kas",
["Katloid"] = "nic-ktl",
["Katuik"] = "mkh-kat",
["Katukinan"] = "sai-ktk",
["Kaukasus Barat Laut"] = "cau-nwc",
["Kaukasus Timur Laut"] = "cau-nec",
["Kaukombar"] = "ngf-kau",
["Kaure-Kosare"] = "paa-kko",
["Kauru"] = "nic-kau",
["Kavango"] = "bnt-kav",
["Kavango-Bantu Barat Daya"] = "bnt-ksb",
["Kayagarik"] = "paa-kay",
["Kazhuoish"] = "tbq-kzh",
["Kele"] = "bnt-kel",
["Kele-Tsogo"] = "bnt-kts",
["Keltik"] = "cel",
["Keltik Kepulauan"] = "cel-ins",
["Kepala Burung Barat"] = "paa-wbh",
["Kepala Burung Timur"] = "paa-ebh",
["Kepulauan Admiralty"] = "poz-aay",
["Keram"] = "paa-ker",
["Keram Barat"] = "paa-wke",
["Keram Timur"] = "paa-eke",
["Keresan"] = "nai-ker",
["Ketik"] = "qfa-yke",
["Kewa-Huli"] = "ngf-khu",
["Kham"] = "sit-kha",
["Khanty"] = "kca",
["Khasi"] = "aav-khs",
["Khmerik"] = "mkh-kmr",
["Khmuik"] = "mkh-khm",
["Kho-Bwa"] = "sit-khb",
["Kho-Bwa Barat"] = "sit-khw",
["Khoe"] = "khi-kho",
["Khoe Kalahari"] = "khi-kal",
["Khoe-Kwadi"] = "khi-kkw",
["Khoekhoe"] = "khi-khk",
["Kikuyu-Kamba"] = "bnt-kka",
["Kilombero"] = "bnt-kil",
["Kim"] = "alv-kim",
["Kimbundu"] = "bnt-kmb",
["Kinnaurik"] = "sit-kin",
["Kiowa-Tanoan"] = "nai-kta",
["Kipchak"] = "trk-kip",
["Kipchak-Bulgar"] = "trk-kbu",
["Kipchak-Cuman"] = "trk-kcu",
["Kipchak-Nogai"] = "trk-kno",
["Kiranti"] = "sit-kir",
["Kiranti Barat"] = "sit-kiw",
["Kiranti Tengah"] = "sit-kic",
["Kiranti Timur"] = "sit-kie",
["Kissi"] = "alv-kis",
["Kiwaian"] = "paa-kiw",
["Kodagu"] = "dra-kod",
["Kohistani"] = "inc-koh",
["Koiarian"] = "ngf-koi",
["Kokon"] = "ngf-kok",
["Kolami-Naiki"] = "dra-knk",
["Kolopom"] = "paa-kol",
["Koman"] = "ssa-kom",
["Kombio"] = "paa-kom",
["Kombio-Arapesh"] = "paa-koa",
["Komi"] = "kv",
["Komisenia"] = "ira-kms",
["Komo-Bira"] = "bnt-kbi",
["Komyandaret-Tsaukambo"] = "ngf-kts",
["Konda-Kui"] = "dra-kki",
["Kongo"] = "bnt-kng",
["Konyak-Chang"] = "sit-kch",
["Koraga"] = "dra-kor",
["Koreanik"] = "qfa-kor",
["Kosorong-Burum-Mindik"] = "ngf-kbm",
["Kottik"] = "qfa-yko",
["Kowan"] = "ngf-kow",
["Kpala"] = "nic-nkk",
["Kpwe"] = "bnt-kpw",
["Kra"] = "qfa-kra",
["Kra-Dai"] = "qfa-tak",
["Kru"] = "kro",
["Kru Barat"] = "kro-wkr",
["Kru Timur"] = "kro-ekr",
["Kube-Tobo"] = "ngf-kto",
["Kuikuroan"] = "sai-kui",
["Kuki-Chin"] = "tbq-kuk",
["Kulango"] = "alv-kul",
["Kuliak"] = "ssa-klk",
["Kumil"] = "ngf-kum",
["Kunar"] = "inc-kun",
["Kunimaipan"] = "paa-kun",
["Kurdi"] = "ku",
["Kurux-Malto"] = "dra-kml",
["Kushitik"] = "cus",
["Kushitik Selatan"] = "cus-sou",
["Kushitik Tengah"] = "cus-cen",
["Kushitik Timur"] = "cus-eas",
["Kushitik Timur Tanah Tinggi"] = "cus-hec",
["Kutubuan Timur"] = "ngf-eku",
["Kwa"] = "alv-kwa",
["Kwalean"] = "paa-kwa",
["Kwerba Raya"] = "paa-gkw",
["Kwerba tepat"] = "paa-kwe",
["Kwomtari"] = "paa-kwo",
["Kx'a"] = "khi-kxa",
["Kyirong-Kagate"] = "sit-kyk",
["Kyrgyz-Kipchak"] = "trk-kkp",
["Kâte-Mape"] = "ngf-kma",
["Ladakhi-Balti"] = "sit-lab",
["Lagoon"] = "alv-lag",
["Lahoish"] = "tbq-lho",
["Lahuli-Spiti"] = "sit-las",
["Lalo"] = "tbq-lal",
["Lampungik"] = "poz-lgx",
["Latino-Falisci"] = "itc-laf",
["Lawu"] = "tbq-lwo",
["Lebonya"] = "bnt-leb",
["Lechitik"] = "zlw-lch",
["Lega-Binja"] = "bnt-lgb",
["Leko"] = "alv-lek",
["Leko-Nimbari"] = "alv-lni",
["Lenape"] = "del",
["Lenca"] = "nai-len",
["Lendu"] = "csu-lnd",
["Lepki-Murkim"] = "paa-lmu",
["Lezghi"] = "cau-lzg",
["Limba"] = "alv-lim",
["Lipo-Lolopo"] = "tbq-llo",
["Lisu"] = "tbq-lso",
["Logooli-Kuria"] = "bnt-lok",
["Lolo-Burma"] = "tbq-lob",
["Loloda-Laba"] = "paa-lla",
["Loloik"] = "tbq-lol",
["Loloik Selatan"] = "tbq-slo",
["Loloik Tenggara"] = "tbq-sel",
["Loloik Utara"] = "tbq-nlo",
["Lotuko-Maa"] = "sdv-lma",
["Luba"] = "bnt-lub",
["Luban"] = "bnt-lbn",
["Lui"] = "sit-luu",
["Lunda"] = "bnt-lun",
["Luo"] = "sdv-luo",
["Luo Selatan"] = "sdv-los",
["Luo Utara"] = "sdv-lon",
["Lurik"] = "ira-lur",
["Luwik"] = "ine-luw",
["Mabuso"] = "ngf-mab",
["Madang"] = "ngf-mad",
["Madiya"] = "dra-mdy",
["Magarik Raya"] = "sit-gma",
["Maiduan"] = "nai-mdu",
["Mailuan"] = "paa-mal",
["Maimai"] = "paa-mam",
["Mairasi"] = "paa-mai",
["Makaa"] = "bnt-mka",
["Makaa-Njem"] = "bnt-mnj",
["Makro-Bai"] = "sit-mba",
["Makro-Chibcha"] = "qfa-mch",
["Makro-Jê"] = "sai-mje",
["Makua"] = "bnt-mak",
["Malayalamoid"] = "dra-mal",
["Malto"] = "dra-mlo",
["Maluku Tengah"] = "poz-cma",
["Mambiloid"] = "nic-mmb",
["Mamfe"] = "nic-mam",
["Mandarinik"] = "zhx-man",
["Mande"] = "dmn",
["Mande Barat"] = "dmn-mdw",
["Mande Barat Daya"] = "dmn-msw",
["Mande Barat Laut"] = "dmn-mnw",
["Mande Tengah"] = "dmn-mdc",
["Mande Tenggara"] = "dmn-mse",
["Mande Timur"] = "dmn-mde",
["Mandi-Muniwara"] = "paa-mmu",
["Manding"] = "dmn-man",
["Manding Barat"] = "dmn-wmn",
["Manding Timur"] = "dmn-emn",
["Manding-Jogo"] = "dmn-mjo",
["Manding-Mokole"] = "dmn-mmo",
["Manding-Vai"] = "dmn-mva",
["Manenguba"] = "bnt-mne",
["Mangbetu"] = "csu-maa",
["Mangbutu-Lese"] = "csu-mle",
["Mangik"] = "mkh-mng",
["Maninka"] = "dmn-mnk",
["Mano-Dan"] = "dmn-mda",
["Manobo"] = "mno",
["Mansi"] = "mns",
["Manubaran"] = "paa-man",
["Mao"] = "omv-mao",
["Mapoyan"] = "sai-map",
["Mari"] = "chm",
["Marienberg"] = "paa-mar",
["Marind-Boazi-Yaqay"] = "paa-mby",
["Marindik"] = "paa-mri",
["Maringik"] = "sit-mar",
["Masa"] = "cdc-mas",
["Masaba-Luhya"] = "bnt-msl",
["Mascoian"] = "sai-mas",
["Mataco-Guaicuru"] = "sai-mgc",
["Matacoan"] = "sai-mtc",
["May Kiri"] = "paa-lma",
["Maya"] = "myn",
["Maybratik"] = "paa-may",
["Mazanderani-Shahmirzadi"] = "ira-msh",
["Mazatecan"] = "omq-maz",
["Mba"] = "nic-mbc",
["Mbaham-Iha"] = "paa-mbi",
["Mbaka"] = "nic-nkm",
["Mbam"] = "nic-mba",
["Mbam Barat"] = "nic-mbw",
["Mbete"] = "bnt-mbt",
["Mbeya"] = "bnt-mby",
["Mbinga"] = "bnt-mbi",
["Mbole-Enya"] = "bnt-mbe",
["Mboshi"] = "bnt-mbo",
["Mboshi-Buja"] = "bnt-mbb",
["Mbugwe-Rangi"] = "bnt-mra",
["Mbum"] = "alv-mbm",
["Mbum-Day"] = "alv-mbd",
["Medes"] = "xme",
["Medo-Parthia"] = "ira-mpr",
["Mek"] = "ngf-mek",
["Mel"] = "alv-mel",
["Melayik"] = "poz-mly",
["Melayu-Chamik"] = "poz-mcm",
["Melayu-Polinesia"] = "poz",
["Melayu-Polinesia Tengah-Timur"] = "poz-cet",
["Melayu-Polinesia Timur"] = "pqe",
["Melayu-Sumbawa"] = "poz-msa",
["Mesir"] = "egx",
["Mey-Sartang"] = "sit-khm",
["Mian-Suganga"] = "ngf-msu",
["Midzu"] = "sit-mdz",
["Mienik"] = "hmx-mie",
["Mijikenda"] = "bnt-mij",
["Mikronesia"] = "poz-mic",
["Min"] = "zhx-min",
["Min Pedalaman"] = "zhx-inm",
["Min Pesisir"] = "zhx-com",
["Min Selatan"] = "zhx-nan",
["Mindjim"] = "ngf-min",
["Mirndi"] = "aus-mir",
["Misumalpa"] = "nai-min",
["Mixe-Zoque"] = "nai-miz",
["Mixtec"] = "omq-mxt",
["Mixtecan"] = "omq-mix",
["Mokole"] = "dmn-mok",
["Mombum"] = "ngf-mom",
["Momo"] = "nic-mom",
["Mon-Khmer"] = "mkh",
["Mondzi"] = "sit-mnz",
["Mongo"] = "bnt-mon",
["Mongolik"] = "xgn",
["Mongolik Selatan"] = "xgn-sou",
["Mongolik Tengah"] = "xgn-cen",
["Monguor"] = "mjg",
["Monik"] = "mkh-mnc",
["Monumbo"] = "paa-mon",
["Mordvinik"] = "urj-mdv",
["Moru-Madi"] = "csu-mma",
["Moré"] = "nic-mre",
["Mruik"] = "sit-mru",
["Muji"] = "tbq-muj",
["Mumuye"] = "alv-mum",
["Mumuye-Yendang"] = "alv-mye",
["Muna-Buton"] = "poz-mun",
["Munda"] = "mun",
["Munji-Yidgha"] = "ira-mny",
["Mura"] = "sai-mur",
["Muria"] = "dra-mur",
["Muscogee"] = "nai-mus",
["Mwika"] = "bnt-mwi",
["Na-Dene"] = "xnd",
["Na-Togo"] = "alv-ntg",
["Nadahup"] = "sai-nad",
["Naga Tengah"] = "sit-aao",
["Naga Utara"] = "sit-kon",
["Nahua"] = "azc-nah",
["Nahuatl Durango"] = "azc-dur",
["Nahuatl Huasteca"] = "azc-hua",
["Naik"] = "sit-nax",
["Naish"] = "sit-nas",
["Nakh"] = "cau-nkh",
["Nalu"] = "alv-nal",
["Nambikwaran"] = "sai-nmk",
["Nambu"] = "paa-nam",
["Namla-Tofanma"] = "paa-nto",
["Nanaik"] = "tuw-nan",
["Nandi-Markweta"] = "sdv-nma",
["Nanga-Walo"] = "nic-nwa",
["Nasu"] = "tbq-nas",
["Navarro-Aragon"] = "roa-nar",
["Nawiki"] = "awd-nwk",
["Ndeiram"] = "ngf-nde",
["Ndu"] = "paa-ndu",
["Ndu Nuklear"] = "paa-nnd",
["Ndzem-Bomwali"] = "bnt-ndb",
["Nenets"] = "yrk",
["Neo-Aram Tengah"] = "sem-cna",
["Neo-Aram Timur Laut"] = "sem-nna",
["New Caledonia"] = "poz-cln",
["New South Wales Tengah"] = "aus-cww",
["Newarik"] = "sit-new",
["Ngalik-Nduga"] = "ngf-ngn",
["Ngayarda"] = "aus-nga",
["Ngbaka"] = "nic-ngk",
["Ngbaka Barat"] = "nic-nkw",
["Ngbaka Timur"] = "nic-nke",
["Ngbandi"] = "nic-ngd",
["Ngemba"] = "nic-nge",
["Ngkolmpu"] = "paa-ngk",
["Ngondi-Ngiri"] = "bnt-ngn",
["Nguni"] = "bnt-ngu",
["Nicobar"] = "aav-nic",
["Niger-Congo"] = "nic",
["Nilo-Sahara"] = "ssa",
["Nilotik"] = "sdv-nil",
["Nilotik Barat"] = "sdv-niw",
["Nilotik Selatan"] = "sdv-nis",
["Nilotik Timur"] = "sdv-nie",
["Nimboran"] = "paa-nim",
["Ninzik"] = "nic-nin",
["Niso"] = "tbq-nso",
["Nisu"] = "tbq-nis",
["Nkambe"] = "nic-nka",
["Nubian"] = "nub",
["Numi"] = "azc-num",
["Numugen"] = "ngf-num",
["Nun"] = "nic-nun",
["Nung"] = "sit-nng",
["Nupe-Gbagyi"] = "alv-ngb",
["Nupoid"] = "alv-nup",
["Nuristan Selatan"] = "nur-sou",
["Nuristan Utara"] = "nur-nor",
["Nuristani"] = "iir-nur",
["Nuru"] = "ngf-nur",
["Nusu"] = "tbq-nus",
["Nwa-Beng"] = "dmn-nbe",
["Nyali"] = "bnt-nya",
["Nyanga-Buyi"] = "bnt-nyb",
["Nyasa"] = "bnt-nys",
["Nyima"] = "sdv-nyi",
["Nyoro-Ganda"] = "bnt-nyg",
["Nyulnyulan"] = "aus-nyu",
["Nyun"] = "alv-nyn",
["Nzebi"] = "bnt-nze",
["Occitano-Romawi"] = "roa-ocr",
["Oceania"] = "poz-oce",
["Oceania Barat"] = "poz-ocw",
["Oceania Selatan"] = "poz-ocs",
["Oceania Tengah-Timur"] = "poz-occ",
["Oghur"] = "trk-ogr",
["Oghuz"] = "trk-ogz",
["Ogoni"] = "nic-ogo",
["Ok"] = "ngf-okk",
["Ok Barat"] = "ngf-wok",
["Ok Pergunungan"] = "ngf-mok",
["Ok Tanah Rendah"] = "ngf-lok",
["Ometo"] = "omv-ome",
["Ometo Timur"] = "omv-eom",
["Ometo Utara"] = "omv-nom",
["Omosan"] = "ngf-omo",
["Omotik"] = "omv",
["Ongan"] = "qfa-ong",
["Ormuri-Parachi"] = "ira-orp",
["Orokaivik"] = "ngf-oro",
["Osco-Umbria"] = "itc-sbl",
["Oti-Volta"] = "nic-ovo",
["Oti-Volta Barat"] = "nic-wov",
["Oti-Volta Timur"] = "nic-eov",
["Oto-Mangue"] = "omq",
["Oto-Pamean"] = "omq-otp",
["Otomacoan"] = "sai-otm",
["Otomi"] = "oto-otm",
["Otomian"] = "oto",
["Ottilien"] = "paa-ott",
["Ovambo"] = "bnt-ova",
["Oïl"] = "roa-oil",
["Pahari"] = "inc-pah",
["Pahari Barat"] = "him",
["Pahari Tengah"] = "inc-pac",
["Pahari Timur"] = "inc-pae",
["Pakanik"] = "mkh-pkn",
["Pakawan"] = "nai-pak",
["Palaihnihan"] = "nai-pal",
["Palaungik"] = "mkh-pal",
["Palei"] = "paa-pal",
["Pama"] = "aus-pmn",
["Pama-Nyunga"] = "aus-pam",
["Pama-Nyunga Barat Daya"] = "aus-psw",
["Pano"] = "sai-pan",
["Pano-Tacana"] = "sai-pat",
["Papel"] = "alv-pap",
["Papua"] = "paa",
["Para-Mongolik"] = "qfa-xgx",
["Pare"] = "bnt-par",
["Parji-Gadaba"] = "dra-pgd",
["Parukotoan"] = "sai-prk",
["Pashayi"] = "inc-pas",
["Pasifik Tengah"] = "poz-pcc",
["Pathan"] = "ira-pat",
["Pauwasi Barat"] = "paa-wpw",
["Pauwasi Timur"] = "paa-epw",
["Pearik"] = "mkh-pea",
["Peba-Yaguan"] = "sai-pey",
["Peka"] = "ngf-pek",
["Pekodian"] = "sai-pek",
["Pemong"] = "sai-pem",
["Pen-Uti Penara"] = "nai-plp",
["Pende"] = "bnt-pen",
["Pergunungan Ghana-Togo"] = "alv-gtm",
["Permik"] = "urj-prm",
["Pesisir Rai"] = "ngf-rai",
["Phla-Pherá"] = "alv-pph",
["Phowa"] = "tbq-phw",
["Phula Hilir"] = "tbq-drp",
["Phula Hulu"] = "tbq-urp",
["Phula Sungai"] = "tbq-rph",
["Phula Tanah Tinggi"] = "tbq-hph",
["Piawi"] = "paa-pia",
["Piman"] = "azc-pim",
["Pinghua"] = "zhx-pin",
["Plateau"] = "nic-plt",
["Plateau Selatan"] = "nic-pls",
["Plateau Tengah"] = "nic-plc",
["Plateau Timur"] = "nic-ple",
["Platoid"] = "nic-pla",
["Pnar-Khasi-Lyngngam"] = "aav-pkl",
["Polinesia"] = "poz-pol",
["Polinesia Nuklear"] = "poz-pnp",
["Polinesia Timur"] = "poz-pep",
["Pomerania"] = "zlw-pom",
["Pomo"] = "nai-pom",
["Pomo-Bomwali"] = "bnt-pob",
["Pomoikan"] = "ngf-pom",
["Popolocan"] = "omq-pop",
["Porapora"] = "paa-por",
["Potou-Tano"] = "alv-ptn",
["Pumpokolik"] = "qfa-ypm",
["Punjabik"] = "inc-pan",
["Qiangik"] = "sit-qia",
["Quechua"] = "qwe",
["Rajasthan"] = "raj",
["Ramu"] = "paa-ram",
["Ramu Bawah"] = "paa-lra",
["Rasawa-Saponi"] = "paa-rsa",
["Rashad"] = "nic-ras",
["Rgyalrongik"] = "sit-rgy",
["Rhaeto-Romawi"] = "roa-rhe",
["Ring"] = "nic-rng",
["Ring Barat"] = "nic-rnw",
["Ring Tengah"] = "nic-rnc",
["Ring Utara"] = "nic-rnn",
["Romani"] = "inc-rom",
["Romawi"] = "roa",
["Romawi Barat"] = "roa-wes",
["Romawi Dalmatia"] = "roa-dal",
["Romawi Selatan"] = "roa-sou",
["Romawi Timur"] = "roa-eas",
["Ruboni"] = "paa-rub",
["Rufiji-Ruvuma"] = "bnt-rur",
["Rukwa"] = "bnt-ruk",
["Rungwe"] = "bnt-run",
["Ruvu"] = "bnt-ruv",
["Ruvuma"] = "bnt-rvm",
["Ryukyu"] = "jpx-ryu",
["Ryukyu Selatan"] = "jpx-sry",
["Ryukyu Utara"] = "jpx-nry",
["Sabah"] = "poz-san",
["Sabaki"] = "bnt-sab",
["Sabakor"] = "ngf-sab",
["Sabi"] = "bnt-sbi",
["Sac-Fox-Kickapoo"] = "alg-sfk",
["Sadanik"] = "inc-sad",
["Sahaptian"] = "nai-shp",
["Sahara"] = "ssa-sah",
["Sahu"] = "paa-sah",
["Saka"] = "xsc-sak",
["Saka-Wakhi"] = "xsc-skw",
["Sal"] = "tbq-bkj",
["Salish"] = "sal",
["Saluan-Banggai"] = "poz-slb",
["Sama-Bajau"] = "poz-sbj",
["Samarokena-Airoran"] = "paa-saa",
["Sami"] = "smi",
["Samiah"] = "sem",
["Samiah Barat"] = "sem-wes",
["Samiah Barat Laut"] = "sem-nwe",
["Samiah Habsyah"] = "sem-eth",
["Samiah Tengah"] = "sem-cen",
["Samiah Timur"] = "sem-eas",
["Samo"] = "dmn-sam",
["Samogo"] = "dmn-smg",
["Samoyed"] = "syd",
["Samur"] = "cau-sam",
["Samur Barat"] = "cau-wsm",
["Samur Selatan"] = "cau-ssm",
["Samur Timur"] = "cau-esm",
["Sanglechi-Ishkashimi"] = "ira-sgi",
["Sankwep"] = "ngf-san",
["Sapa-Tai Barat Daya"] = "tai-sap",
["Sara"] = "csu-sar",
["Sarawak Utara"] = "poz-swa",
["Sarmata"] = "xsc-sar",
["Sau-Angal-Kewa"] = "ngf-sak",
["Savanna"] = "alv-sav",
["Sawabantu"] = "bnt-saw",
["Scythia"] = "xsc",
["Selkup"] = "sel",
["Sena"] = "bnt-sna",
["Senagi"] = "paa-sng",
["Senari"] = "alv-snr",
["Senegambia"] = "alv-sng",
["Sentani"] = "paa-sen",
["Senufo"] = "alv-snf",
["Sepik"] = "paa-sep",
["Sepik Bawah"] = "paa-lse",
["Serbi-Mongolik"] = "qfa-xgs",
["Sere"] = "nic-ser",
["Seuta"] = "bnt-seu",
["Shastan"] = "nai-shs",
["Shi-Havu"] = "bnt-shh",
["Shinaic"] = "inc-shn",
["Shirongolik"] = "xgn-shr",
["Shiroro"] = "nic-shi",
["Shona"] = "bnt-sho",
["Shughni-Roshani"] = "ira-shr",
["Shughni-Yazghulami"] = "ira-shy",
["Shughni-Yazghulami-Munji"] = "ira-sym",
["Siangik Raya"] = "sit-gsi",
["Siloid"] = "tbq-sil",
["Simbu"] = "ngf-sim",
["Sindhik"] = "inc-snd",
["Sinitik"] = "zhx",
["Sino-Bai"] = "sit-sba",
["Sino-Tibet"] = "sit",
["Sioux"] = "sio",
["Sioux Lembah Mississippi"] = "sio-msv",
["Sioux Lembah Ohio"] = "sio-ohv",
["Sioux Sungai Missouri"] = "sio-mor",
["Sioux-Catawba"] = "nai-sca",
["Sira"] = "bnt-sir",
["Sisaala"] = "nic-sis",
["Skandinavia Barat"] = "gmq-wes",
["Skandinavia Kepulauan"] = "gmq-ins",
["Skandinavia Timur"] = "gmq-eas",
["Sko"] = "paa-sko",
["Sko Pedalaman"] = "paa-isk",
["Slavey"] = "den",
["Slavik"] = "sla",
["Slavik Barat"] = "zlw",
["Slavik Selatan"] = "zls",
["Slavik Timur"] = "zle",
["Sogdik"] = "ira-sgc",
["Sogdo-Bactria"] = "ira-sbc",
["Sogeram"] = "ngf-sog",
["Sogeram Barat"] = "ngf-wso",
["Sogeram Timur"] = "ngf-eso",
["Sogeram Utara"] = "ngf-nso",
["Soko-Kele"] = "bnt-ske",
["Solomon Tenggara"] = "poz-sls",
["Somaloid"] = "cus-som",
["Songhay"] = "son",
["Soninke-Bobo"] = "dmn-snb",
["Sopac"] = "ngf-sop",
["Sorbia"] = "wen",
["Sotho-Tswana"] = "bnt-sts",
["South Bird's Head"] = "ngf-sbh",
["St. Matthias"] = "poz-stm",
["Strickland Timur"] = "ngf-est",
["Sudanik Tengah"] = "csu",
["Sudanik Tengah Timur"] = "csu-ecs",
["SudanikTimur"] = "sdv",
["SudanikTimur Utara"] = "sdv-nes",
["Sulawesi"] = "poz-clb",
["Sulawesi Selatan"] = "poz-ssw",
["Sumatera Barat Laut"] = "poz-nws",
["Sungai Bulaka"] = "paa-bul",
["Sungai Pahoturi"] = "paa-pah",
["Sungai Piore"] = "paa-pio",
["Supyire-Mamara"] = "alv-sma",
["Susu-Yalunka"] = "dmn-sya",
["Swahili"] = "bnt-swh",
["Ta-Arawak"] = "awd-taa",
["Tacanan"] = "sai-tac",
["Tagwana-Djimini"] = "alv-tdj",
["Tai"] = "tai",
["Tai Barat Daya"] = "tai-swe",
["Tai Chongzuo"] = "tai-cho",
["Tai Tengah"] = "tai-cen",
["Tai Utara"] = "tai-nor",
["Taikat-Awyi"] = "paa-taa",
["Tainae-Akoye"] = "ngf-taa",
["Tairora"] = "ngf-tai",
["Takama"] = "bnt-tkm",
["Takic"] = "azc-tak",
["Talodi"] = "alv-tal",
["Talodi-Heiban"] = "alv-the",
["Talu"] = "tbq-tal",
["Taman"] = "sdv-tmn",
["Tamangik"] = "sit-tam",
["Tamil-Kannada"] = "dra-tkn",
["Tamil-Kodagu"] = "dra-tkd",
["Tamil-Malayalam"] = "dra-tml",
["Tamiloid"] = "dra-tam",
["Tamolan"] = "paa-tam",
["Tangkhul-Maring"] = "sit-tma",
["Tangkhulik"] = "sit-tng",
["Tangkic"] = "aus-tnk",
["Tangko-Nakai"] = "ngf-tna",
["Tangsa-Nocte"] = "sit-tno",
["Tani"] = "sit-tan",
["Tano Tengah"] = "alv-ctn",
["Taracahitic"] = "azc-trc",
["Tarano"] = "sai-tar",
["Tarokoid"] = "nic-tar",
["Tasik Paniai"] = "ngf-pan",
["Tatik"] = "xme-ttc",
["Teberan"] = "paa-teb",
["Teke"] = "bnt-tek",
["Teke Tengah"] = "bnt-tkc",
["Teke-Mbede"] = "bnt-tmb",
["Teluguik"] = "dra-tel",
["Teluk Geelvink Timur"] = "paa-egb",
["Teluk Pedalaman"] = "paa-ing",
["Teluk Pedalaman Barat"] = "paa-wig",
["Temotu"] = "poz-tem",
["Tenda"] = "alv-ten",
["Tequistlatecan"] = "nai-tqn",
["Ternate-Tidore"] = "paa-tti",
["Teso-Turkana"] = "sdv-ttu",
["Tetela"] = "bnt-tet",
["Tharu"] = "inc-tha",
["Tibet-Burma"] = "tbq",
["Tibetik"] = "sit-tib",
["Tiboran"] = "ngf-tib",
["Ticuna-Yuri"] = "sai-tyu",
["Timor Timur"] = "paa-eti",
["Timor-Alor-Pantar"] = "paa-tap",
["Timorik"] = "poz-tim",
["Tiniguan"] = "sai-tin",
["Tirio"] = "paa-tir",
["Tivoid"] = "nic-tiv",
["Tivoid Tengah"] = "nic-tvc",
["Tivoid Utara"] = "nic-tvn",
["Toda-Kota"] = "dra-tkt",
["Tokharia"] = "ine-toc",
["Tomini-Tolitoli"] = "poz-tot",
["Tonda"] = "paa-ton",
["Tongik"] = "poz-ton",
["Tor"] = "paa-tor",
["Tor-Orya"] = "paa-too",
["Torricelli"] = "paa-trr",
["Totonacan"] = "nai-ttn",
["Totozoquean"] = "nai-tot",
["Trans-Fly Timur"] = "paa-etf",
["Trans-New Guinea"] = "ngf",
["Triqui"] = "omq-tri",
["Tsez"] = "cau-tsz",
["Tsez Barat"] = "cau-wts",
["Tsez Timur"] = "cau-ets",
["Tshangla"] = "sit-tsk",
["Tsimshian"] = "nai-tsi",
["Tsogo"] = "bnt-tso",
["Tswa-Ronga"] = "bnt-tsr",
["Tucanoan"] = "sai-tuc",
["Tujia"] = "sit-tja",
["Tulu-Koraga"] = "dra-tlk",
["Tungusik"] = "tuw",
["Tupi"] = "tup",
["Tupi-Guarani"] = "tup-gua",
["Turama-Kikori"] = "paa-tki",
["Turkik"] = "trk",
["Turkik Am"] = "trk-cmn",
["Turkik Siberia"] = "trk-sib",
["Turkik Siberia Selatan"] = "trk-ssb",
["Turkik Siberia Utara"] = "trk-nsb",
["Tuu"] = "khi-tuu",
["Tyrsenia"] = "qfa-tyn",
["Tày"] = "tai-tay",
["Ubangi"] = "nic-ubg",
["Udegheik"] = "tuw-udg",
["Ugriik"] = "urj-ugr",
["Uralik"] = "urj",
["Uru-Chipaya"] = "sai-ucp",
["Uruwa"] = "ngf-uru",
["Uti"] = "nai-utn",
["Uto-Aztek"] = "azc",
["Utu-Silopi"] = "ngf-usi",
["Vai-Kono"] = "dmn-vak",
["Vainakh"] = "cau-vay",
["Vale"] = "csu-val",
["Vanuatu Selatan"] = "poz-vns",
["Vanuatu Tengah"] = "poz-vnc",
["Vanuatu Utara"] = "poz-vnn",
["Vaskonik"] = "euq",
["Vietik"] = "mkh-vie",
["Volta-Congo"] = "nic-vco",
["Volta-Niger"] = "alv-von",
["Wahgi"] = "ngf-wah",
["Waja-Kam"] = "alv-wjk",
["Wakash"] = "wak",
["Walio"] = "paa-wal",
["Wantoat-Awara"] = "ngf-waa",
["Wantoatik"] = "ngf-wan",
["Wapei"] = "paa-wap",
["Wapei-Palei"] = "paa-wpa",
["Wara-Natyoro"] = "alv-wan",
["Waris"] = "paa-war",
["Warup"] = "ngf-war",
["Wee"] = "kro-wee",
["Wenma-Tai Barat Daya"] = "tai-wen",
["Wichí"] = "sai-wic",
["Wintuan"] = "nai-wtq",
["Witotoan"] = "sai-wit",
["Wojokesik"] = "ngf-woj",
["Worrorran"] = "aus-wor",
["Wotu-Wolio"] = "poz-wot",
["Wára-Kómnzo"] = "paa-wko",
["Xinca"] = "nai-xin",
["Yaganon"] = "ngf-yag",
["Yaka"] = "bnt-yak",
["Yali"] = "ngf-yal",
["Yam"] = "paa-yam",
["Yambasa"] = "nic-ymb",
["Yangmanic"] = "aus-yng",
["Yanomami"] = "sai-ynm",
["Yaqayik"] = "paa-yaq",
["Yareban"] = "ngf-yar",
["Yasa-Kombe"] = "bnt-yko",
["Yau-Nungon"] = "ngf-ynu",
["Yawa-Saweru"] = "paa-ysa",
["Yekhee"] = "alv-yek",
["Yenisei"] = "qfa-yen",
["Yidinyic"] = "aus-yid",
["Yok-Uti"] = "nai-you",
["Yokuts"] = "yok",
["Yolngu"] = "aus-yol",
["Yom-Nawdm"] = "nic-yon",
["Yoruba"] = "alv-yor",
["Yoruboid"] = "alv-yrd",
["Yuat"] = "paa-yua",
["Yue"] = "zhx-yue",
["Yuin-Kuri"] = "aus-yuk",
["Yukaghir"] = "qfa-yuk",
["Yuki"] = "nai-ykn",
["Yukpan"] = "sai-yuk",
["Yukubenik"] = "nic-ykb",
["Yuman-Cochimí"] = "nai-yuc",
["Yungur"] = "alv-yun",
["Yupik"] = "ypk",
["Yupna"] = "ngf-yup",
["Zamba-Binza"] = "bnt-zbi",
["Zamucoan"] = "sai-zam",
["Zan"] = "ccs-zan",
["Zande"] = "znd",
["Zaparo"] = "sai-zap",
["Zapotec"] = "omq-zpc",
["Zapotecan"] = "omq-zap",
["Zaza-Gorani"] = "ira-zgr",
["Zeme"] = "sit-zem",
["buatan"] = "art",
["bukan sekeluarga"] = "qfa-not",
["campuran"] = "qfa-mix",
["isyarat"] = "sgn",
["kreol"] = "qfa-cre",
["kreol atau pijin"] = "crp",
["pencilan"] = "qfa-iso",
["pertalian yang dipertikaikan"] = "qfa-dis",
["pijin"] = "qfa-pid",
["rGyalrongik Barat"] = "sit-wgy",
["rGyalrongik Timur"] = "sit-egy",
["sentuhan"] = "qfa-cnt",
["substratum"] = "qfa-sub",
["tidak dapat dikelaskan"] = "qfa-unc",
}
6azonzmsd8ls9tw7pmy7k8fv2oorqz0
Modul:scripts/code to canonical name
828
34641
373594
249394
2026-09-12T11:07:03Z
Hakimi97
2668
[[MediaWiki:UpdateLanguageNameAndCode.js|dikemas kini menggunakan gajet bahasa]]
373594
Scribunto
text/plain
return {
["Adlm"] = "Adlam",
["Afak"] = "Afaka",
["Aghb"] = "Albania Kaukasus",
["Ahom"] = "Ahom",
["Arab"] = "Arab",
["Aran"] = "Arab",
["Aran:hnd"] = "Shahmukhi",
["Aran:hno"] = "Shahmukhi",
["Aran:inc-opa"] = "Shahmukhi",
["Aran:lah"] = "Shahmukhi",
["Aran:pa"] = "Shahmukhi",
["Aran:phr"] = "Shahmukhi",
["Aran:skr"] = "Shahmukhi",
["Armi"] = "Aram Imperial",
["Armn"] = "Armenia",
["Avst"] = "Avesta",
["Bali"] = "Bali",
["Bamu"] = "Bamum",
["Bass"] = "Bassa",
["Batk"] = "Batak",
["Beng"] = "Bengali",
["Bhks"] = "Bhaiksuki",
["Blis"] = "Blissymbolic",
["Bopo"] = "Zhuyin",
["Brah"] = "Brahmi",
["Brai"] = "Braille",
["Bugi"] = "Lontara",
["Buhd"] = "Buhid",
["Cakm"] = "Chakma",
["Cans"] = "Suku Kata Kanada",
["Cari"] = "Carian",
["Cham"] = "Cham",
["Cher"] = "Cherokee",
["Chis"] = "Chisoi",
["Chrs"] = "Khwarezmian",
["Copt"] = "Qibti",
["Cpmn"] = "Cypro-Minoan",
["Cprt"] = "Cyprus",
["Cyrl"] = "Cyril",
["Cyrs"] = "Cyril Kuno",
["Deva"] = "Devanagari",
["Deva:ahr"] = "Balbodh",
["Deva:kfq"] = "Balbodh",
["Deva:kok"] = "Balbodh",
["Deva:mr"] = "Balbodh",
["Deva:omr"] = "Balbodh",
["Deva:vah"] = "Balbodh",
["Diak"] = "Dhives Akuru",
["Dogr"] = "Dogra",
["Dsrt"] = "Deseret",
["Dupl"] = "Duployan",
["Egyd"] = "Demotik",
["Egyh"] = "Hieratik",
["Egyp"] = "Hieroglif Mesir",
["Elba"] = "Elbasan",
["Elym"] = "Elymaic",
["Ethi"] = "Habsyah",
["Gara"] = "Garay",
["Geok"] = "Khutsuri",
["Geor"] = "Georgia",
["Glag"] = "Glagol",
["Gong"] = "Gunjala Gondi",
["Gonm"] = "Masaram Gondi",
["Goth"] = "Goth",
["Gran"] = "Grantha",
["Grek"] = "Yunani",
["Gujr"] = "Gujarati",
["Gukh"] = "Khema",
["Guru"] = "Gurmukhi",
["Hang"] = "Hangul",
["Hani"] = "Han",
["Hano"] = "Hanunoo",
["Hans"] = "Han Ringkas",
["Hant"] = "Han Tradisional",
["Hatr"] = "Hatran",
["Hebr"] = "Ibrani",
["Hira"] = "Hiragana",
["Hluw"] = "Hieroglif Anatolia",
["Hmng"] = "Pahawh Hmong",
["Hmnp"] = "Nyiakeng Puachue Hmong",
["Hrkt"] = "Kana",
["Hung"] = "Hungary Kuno",
["Ibrnn"] = "Iberia Timur Laut",
["Ibrns"] = "Iberia Tenggara",
["Image"] = "Kemasan Imej",
["Inds"] = "Indus",
["Ipach"] = "Abjad Fonetik Antarabangsa",
["Ital"] = "Italik Kuno",
["Java"] = "Jawa",
["Jpan"] = "Jepun",
["Jurc"] = "Jurchen",
["Kali"] = "Kayah Li",
["Kana"] = "Katakana",
["Kawi"] = "Kawi",
["Khar"] = "Kharoshthi",
["Khmr"] = "Khmer",
["Khoj"] = "Khojki",
["Khomt"] = "Thai Khom",
["Kitl"] = "Khitan Besar",
["Kits"] = "Khitan Kecil",
["Knda"] = "Kannada",
["Kore"] = "Korea",
["Kpel"] = "Kpelle",
["Krai"] = "Kirat Rai",
["Kthi"] = "Kaithi",
["Kulit"] = "Kulitan",
["Lana"] = "Tai Tham",
["Laoo"] = "Lao",
["Latf"] = "Fraktur",
["Latg"] = "Gaelia",
["Latn"] = "Latin",
["Leke"] = "Leke",
["Lepc"] = "Lepcha",
["Limb"] = "Limbu",
["Lina"] = "Linear A",
["Linb"] = "Linear B",
["Lisu"] = "Fraser",
["Loma"] = "Loma",
["Lyci"] = "Lycia",
["Lydi"] = "Lydia",
["Mahj"] = "Mahajani",
["Maka"] = "Makassar",
["Mand"] = "Mandaia",
["Mani"] = "Mani",
["Marc"] = "Marchen",
["Maya"] = "Maya",
["Medf"] = "Medefaidrin",
["Mend"] = "Mende",
["Merc"] = "Kursif Meroitik",
["Mero"] = "Hieroglif Meroitik",
["Mlym"] = "Malayalam",
["Modi"] = "Modi",
["Mong"] = "Mongol",
["Moon"] = "Moon",
["Morse"] = "Kod Morse",
["Mroo"] = "Mru",
["Mtei"] = "Meitei Mayek",
["Mult"] = "Multani",
["Music"] = "Notasi Muzik",
["Mymr"] = "Burma",
["Nagm"] = "Mundari Bani",
["Nand"] = "Nandinagari",
["Narb"] = "Arab Utara Kuno",
["Nbat"] = "Nabataea",
["Newa"] = "Newa",
["Nkdb"] = "Dongba",
["Nkgb"] = "Geba",
["Nkoo"] = "N'Ko",
["None"] = "tidak ditentukan",
["Nshu"] = "Nüshu",
["Ogam"] = "Ogham",
["Olck"] = "Ol Chiki",
["Onao"] = "Ol Onal",
["Orkh"] = "Turkik Kuno",
["Orya"] = "Odia",
["Osge"] = "Osage",
["Osma"] = "Osmanya",
["Ougr"] = "Uyghur Kuno",
["Palm"] = "Palmyra",
["Pauc"] = "Pau Cin Hau",
["Pcun"] = "Kuneiform Purba",
["Pelm"] = "Elam Purba",
["Perm"] = "Permia Kuno",
["Phag"] = "Phags-pa",
["Phli"] = "Pahlavi Inskripsi",
["Phlp"] = "Pahlavi Psalter",
["Phlv"] = "Pahlavi Buku",
["Phnx"] = "Phoenicia",
["Plrd"] = "Pollard",
["Polyt"] = "Yunani",
["Prti"] = "Parthia Inskripsi",
["Psin"] = "Sinaitik Purba",
["Ranj"] = "Ranjana",
["Rjng"] = "Rejang",
["Rohg"] = "Hanifi Rohingya",
["Roro"] = "Rongorongo",
["Rumin"] = "Penomboran Rumi",
["Runr"] = "Rune",
["Samr"] = "Samaria",
["Sarb"] = "Ancient South Arabian",
["Saur"] = "Saurashtra",
["Semap"] = "flag semaphore",
["Sgnw"] = "SignWriting",
["Shaw"] = "Shaw",
["Shrd"] = "Sharada",
["Shui"] = "Sui",
["Sidd"] = "Siddham",
["Sidt"] = "Sidetic",
["Sind"] = "Khudabadi",
["Sinh"] = "Sinhala",
["Sogd"] = "Sogdia",
["Sogo"] = "Sogdia Kuno",
["Sora"] = "Sorang Sompeng",
["Soyo"] = "Soyombo",
["Sund"] = "Sunda",
["Sunu"] = "Sunuwar",
["Sylo"] = "Sylheti Nagri",
["Syrc"] = "Suryani",
["Tagb"] = "Tagbanwa",
["Takr"] = "Takri",
["Tale"] = "Tai Nüa",
["Talu"] = "Tai Lue Baharu",
["Taml"] = "Tamil",
["Tang"] = "Tangut",
["Tavt"] = "Tai Viet",
["Tayo"] = "Lai Tay",
["Telu"] = "Telugu",
["Teng"] = "Tengwar",
["Tfng"] = "Tifinagh",
["Tglg"] = "Baybayin",
["Thaa"] = "Thaana",
["Thai"] = "Thai",
["Tibt"] = "Tibet",
["Tirh"] = "Tirhuta",
["Tnsa"] = "Tangsa",
["Todr"] = "Todhri",
["Tols"] = "Tolong Siki",
["Toto"] = "Toto",
["Tutg"] = "Tigalari",
["Ugar"] = "Ugarit",
["Vaii"] = "Vai",
["Visp"] = "Visible Speech",
["Vith"] = "Vithkuq",
["Wara"] = "Varang Kshiti",
["Wcho"] = "Wancho",
["Wole"] = "Woleai",
["Xpeo"] = "Parsi Kuno",
["Xsux"] = "Kuneiform",
["Yezi"] = "Yezidi",
["Yiii"] = "Yi",
["Zanb"] = "Zanabazar Square",
["Zmth"] = "Notasi Matematik",
["Zname"] = "Notasi Muzik Znamenny",
["Zsym"] = "Simbolik",
["Zxxx"] = "unwritten",
["Zyyy"] = "undetermined",
["Zzzz"] = "Tidak Terkod",
["as-Beng"] = "Assam",
["mnc-Mong"] = "Manchu",
["pal-Avst"] = "Pazend",
["pjt-Latn"] = "Latin",
["sit-tam-Tibt"] = "Tamyig",
["sjo-Mong"] = "Xibe",
["xwo-Mong"] = "Todo",
}
e06lpsqjm2ikrvnjxog4i1rr81ifa91
Modul:labels/data/lang/enm
828
57948
373588
185167
2026-09-11T19:40:25Z
SNN95
2113
terjemah
373588
Scribunto
text/plain
local labels = {}
-------------------------------------------------------------------------------
------------------------------- Perubahan bunyi -------------------------------
-------------------------------------------------------------------------------
labels["pemanjangan suku kata terbuka"] = {
aliases = {"OSL", "open-syllable lengthening", "open syllable lengthening"},
Wikipedia = "Open-syllable lengthening#English",
}
labels["pemendekan tiga suku kata"] = {
aliases = {"TSS", "trisyllabic shortening"},
Wikipedia = "Trisyllabic laxing",
}
-------------------------------------------------------------------------------
---------------------------------- Kronolek -----------------------------------
-------------------------------------------------------------------------------
labels["Inggeris Pertengahan Awal"] = {
aliases = {"Early Middle English", "Early ME", "Earlier ME", "early ME", "early", "EME"},
Wikipedia = "Middle English#Early Middle English",
plain_categories = true,
}
labels["Inggeris Pertengahan Akhir"] = {
aliases = {"Late Middle English", "Late ME", "Later ME", "late ME", "Late", "late", "LME"},
Wikipedia = "Middle English#Late Middle English",
plain_categories = true,
}
-------------------------------------------------------------------------------
----------------------------------- Variasi -----------------------------------
-------------------------------------------------------------------------------
labels["Midland Timur"] = {
aliases = {"East Midland", "East Midland Middle English", "East Midlands", "East Midlands ME", "East Midland ME", "EM"},
regional_categories = true,
}
labels["Kent"] = {
aliases = {"Kentish", "K"},
Wikipedia = true,
regional_categories = "Kent",
}
labels["Utara"] = {
aliases = {"Northern", "Northern Middle English", "Northern ME", "North ME", "N"},
regional_categories = true,
}
labels["Selatan"] = {
aliases = {"Southern", "Southern Middle English", "Southern ME", "South ME", "Southwest ME", "S"},
regional_categories = true,
}
labels["Midland Barat"] = {
aliases = {"West Midland", "West Midland Middle English", "West Midlands", "West Midland ME", "West Midlands ME", "WM"},
regional_categories = true,
}
-------------------------------------------------------------------------------
--------------------------------- Subvariasi ----------------------------------
-------------------------------------------------------------------------------
-------------------------------- Midland Timur --------------------------------
labels["East Anglia"] = {
aliases = {"East Anglian", "East Anglian dialect", "EA"},
Wikipedia = true,
regional_categories = "East Anglia",
parent = "Midland Timur",
}
labels["Saxon Timur"] = { --per Jordan-Crook 1973--
aliases = {"East Saxon", "ES", "East Saxon ME"},
Wikipedia = true,
regional_categories = "Saxon Timur",
parent = "Midland Timur",
}
labels["Midland Timur Laut"] = {
aliases = {"Northeast Midland", "NEM", "NW Midlands", "Northwest Midland ME"},
fulldef = "Istilah dan maksud dalam bahasa Inggeris Pertengahan Midland Timur utara",
regional_categories = true,
parent = "Midland Timur",
}
labels["Midland Tenggara"] = {
aliases = {"Southeast Midland", "SEM", "SE Midlands", "Southeast Midland ME"},
fulldef = "Istilah dan maksud dalam bahasa Inggeris Pertengahan Midland Timur barat daya",
regional_categories = true,
parent = "Midland Timur",
}
------------------------------------ Utara ------------------------------------
labels["Cumbria"] = {
aliases = {"Cumbrian", "Cumbrian ME", "Cu"},
regional_categories = true,
parent = "Utara",
}
labels["Scots Awal"] = {
aliases = {"Early Scots", "Old Scots", "Scottish Middle English", "Scottish ME", "Scottish", "Scotland", "Sc"},
Wikipedia = true,
plain_categories = "Scots Awal",
parent = "Utara",
}
labels["Manx"] = {
aliases = {"Isle of Man", "Manx ME", "Ma"},
regional_categories = true,
Wikipedia = "Isle of Man",
parent = "Utara",
}
labels["Bernicia"] = {
aliases = {"Bernician", "Bernician ME", "Be"},
regional_categories = true,
parent = "Utara",
}
labels["Yorkshire"] = {
aliases = {"Yorkshire ME", "Yorks"},
regional_categories = true,
Wikipedia = true,
parent = "Utara",
}
----------------------------------- Selatan -----------------------------------
labels["Tenggara"] = {
aliases = {"Southeastern", "Southeastern ME", "SE"},
fulldef = "Istilah dan maksud dalam bahasa Inggeris Pertengahan Selatan timur",
regional_categories = true,
parent = "Selatan",
}
labels["Barat Daya"] = {
aliases = {"Southwestern", "Southwestern ME", "SW", "West Country"},
fulldef = "Istilah dan maksud dalam bahasa Inggeris Pertengahan Selatan barat",
regional_categories = true,
parent = "Selatan",
}
-------------------------------- Midland Barat --------------------------------
labels["Ireland"] = {
aliases = {"Irish", "Irish ME", "Ir"},
regional_categories = "Ireland",
Wikipedia = true,
parent = "Midland Barat",
}
labels["Midland Barat Laut"] = {
aliases = {"Northwest Midland", "NWM", "NW Midlands", "Northwest Midland ME"},
fulldef = "Istilah dan maksud dalam bahasa Inggeris Pertengahan Midland Barat utara",
regional_categories = true,
parent = "Midland Barat",
}
labels["Midland Barat Daya"] = {
aliases = {"Southwest Midland", "SWM", "SW Midlands", "Southwest Midland ME"},
fulldef = "Istilah dan maksud dalam bahasa Inggeris Pertengahan Midland Barat selatan",
regional_categories = true,
parent = "Midland Barat",
}
labels["Wales"] = {
aliases = {"Welsh", "Welsh ME", "Wel"},
regional_categories = "Wales",
Wikipedia = true,
parent = "Midland Barat",
}
--------------------------------- [Istimewa] ----------------------------------
labels["Midland Utara"] = {
aliases = {"North Midland", "NM"},
regional_categories = {"Midland Timur Laut", "Midland Barat Laut"},
}
labels["Midland Selatan"] = {
aliases = {"South Midland", "SM"},
regional_categories = {"Saxon Timur", "Midland Tenggara", "Midland Barat Daya"},
}
-------------------------------------------------------------------------------
------------------------------ Sub-subvariasi ---------------------------------
-------------------------------------------------------------------------------
----------------------------------- Cumbria -----------------------------------
labels["Cumberland"] = {
aliases = {"Cumberland ME", "Cumb"},
regional_categories = true,
Wikipedia = true,
parent = "Cumbria",
}
labels["Westmorland"] = {
aliases = {"Westmorland ME", "Westm"},
regional_categories = true,
Wikipedia = true,
parent = "Cumbria",
}
--------------------------------- East Anglia ---------------------------------
labels["Cambridgeshire"] = { --Ada OE y(ː) > e(ː)--
aliases = {"Cambridgeshire ME", "Cambs"},
regional_categories = true,
Wikipedia = true,
parent = "East Anglia",
}
labels["Norfolk"] = {
aliases = {"Norfolk ME", "Norf"},
regional_categories = true,
Wikipedia = true,
parent = "East Anglia",
}
labels["Suffolk"] = {
aliases = {"Suffolk ME", "Suff"},
regional_categories = true,
Wikipedia = true,
parent = "East Anglia",
}
--------------------------------- Saxon Timur ---------------------------------
labels["Essex"] = {
aliases = {"Essex ME", "Ess", "Esx"},
regional_categories = true,
Wikipedia = true,
parent = "Saxon Timur",
}
labels["Hertfordshire"] = {
aliases = {"Hertfordshire ME", "Herts"},
regional_categories = true,
Wikipedia = true,
parent = "Saxon Timur",
}
labels["London"] = {
aliases = {"London ME"},
regional_categories = true,
Wikipedia = true,
parent = "Middlesex",
}
labels["Middlesex"] = { --asalnya Selatan--
aliases = {"Middlesex ME", "Mx", "Middx"},
regional_categories = true,
Wikipedia = true,
parent = "Saxon Timur",
}
---------------------------- "Midland Tengah Timur" ---------------------------
labels["Leicestershire"] = {
aliases = {"Leicestershire ME", "Leics"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Timur",
}
labels["Rutland"] = {
aliases = {"Rutland ME", "Rut"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Timur",
}
---------------------------- "Midland Tengah Barat" ---------------------------
labels["Shropshire"] = {
aliases = {"Shropshire ME", "Salop", "Shrops"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Barat",
}
labels["Staffordshire"] = {
aliases = {"Staffordshire ME", "Staffs", "Staf"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Barat",
}
----------------------------- Midland Timur Laut ------------------------------
labels["Derbyshire"] = {
aliases = {"Derbyshire ME", "Derbys", "Derbs"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Timur Laut",
}
labels["Lincolnshire"] = {
aliases = {"Lincolnshire ME", "Lincs"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Timur Laut",
}
labels["Nottinghamshire"] = {
aliases = {"Nottinghamshire ME", "Notts"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Timur Laut",
}
--------------------------------- Northumbria ---------------------------------
labels["County Durham"] = {
aliases = {"Durham ME", "Durham", "Dur", "Co Dur"},
regional_categories = true,
Wikipedia = true,
parent = "Bernicia",
}
labels["Northumberland"] = {
aliases = {"Northumberland ME", "Northumb", "Northd"},
regional_categories = true,
Wikipedia = true,
parent = "Bernicia",
}
----------------------------- Midland Barat Laut ------------------------------
labels["Cheshire"] = {
aliases = {"Cheshire ME", "Ches"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Barat Laut",
}
labels["Lancashire"] = {
aliases = {"Lancashire ME", "Lancs"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Barat Laut",
}
---------------------------------- Tenggara -----------------------------------
labels["Berkshire"] = {
aliases = {"Berkshire ME", "Berks"},
regional_categories = true,
Wikipedia = true,
parent = "Tenggara",
}
labels["Hampshire"] = {
aliases = {"Hampshire ME", "Hants"},
regional_categories = true,
Wikipedia = true,
parent = "Tenggara",
}
labels["Oxfordshire"] = {
aliases = {"Oxfordshire ME", "Oxon"},
regional_categories = true,
Wikipedia = true,
parent = "Tenggara",
}
labels["Sussex"] = {
aliases = {"Sussex ME", "Ssx"},
regional_categories = true,
Wikipedia = true,
parent = "Tenggara",
}
labels["Surrey"] = {
aliases = {"Surrey ME", "Sy"},
regional_categories = true,
Wikipedia = true,
parent = "Tenggara",
}
------------------------------ Midland Tenggara -------------------------------
labels["Bedfordshire"] = {
aliases = {"Bedfordshire ME", "Beds"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Tenggara",
}
labels["Buckinghamshire"] = {
aliases = {"Buckinghamshire ME", "Bucks"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Tenggara",
}
labels["Huntingdonshire"] = {
aliases = {"Huntingdonshire ME", "Hunts"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Tenggara",
}
labels["Northamptonshire"] = {
aliases = {"Northamptonshire ME", "Northants", "Norhnts"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Tenggara",
}
--------------------------------- Barat Daya ----------------------------------
labels["Cornwall"] = {
aliases = {"Cornish", "Cornish dialect"},
Wikipedia = true,
regional_categories = "Cornwall",
parent = "Barat Daya",
}
labels["Devon"] = {
aliases = {"Devon ME", "Dev"},
Wikipedia = true,
regional_categories = true,
parent = "Barat Daya",
}
labels["Dorset"] = {
aliases = {"Dorset ME", "Dor"},
regional_categories = true,
Wikipedia = true,
parent = "Barat Daya",
}
labels["Somerset"] = {
aliases = {"Somerset ME", "Somersetshire", "Som"},
regional_categories = true,
Wikipedia = true,
parent = "Barat Daya",
}
labels["Wiltshire"] = {
aliases = {"Wiltshire ME", "Wilts"},
regional_categories = true,
Wikipedia = true,
parent = "Barat Daya",
}
----------------------------- Midland Barat Daya ------------------------------
labels["Gloucestershire"] = {
aliases = {"Gloucestershire ME", "Glos", "Gloucs"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Barat Daya",
}
labels["Herefordshire"] = {
aliases = {"Herefordshire ME", "Here", "Heref"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Barat Daya",
}
labels["Warwickshire"] = {
aliases = {"Warwickshire ME", "Warks", "Warw", "War"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Barat Daya",
}
labels["Worcestershire"] = {
aliases = {"Worcestershire ME", "Worcs", "Wor"},
regional_categories = true,
Wikipedia = true,
parent = "Midland Barat Daya",
}
---------------------------------- Yorkshire ----------------------------------
labels["East Riding"] = {
def = "Bahasa Inggeris Pertengahan Utara seperti yang dituturkan di [[East Riding]], [[Yorkshire]]",
aliases = {"East Riding ME", "ER"},
regional_categories = true,
Wikipedia = true,
parent = "Yorkshire",
}
labels["North Riding"] = {
def = "Bahasa Inggeris Pertengahan Utara seperti yang dituturkan di [[North Riding]], [[Yorkshire]]",
aliases = {"North Riding ME", "NR"},
regional_categories = true,
Wikipedia = true,
parent = "Yorkshire",
}
labels["West Riding"] = {
def = "Bahasa Inggeris Pertengahan Midland Timur/Utara seperti yang dituturkan di [[West Riding]], [[Yorkshire]]",
aliases = {"West Riding ME", "WR"},
regional_categories = true,
Wikipedia = true,
parent = "Yorkshire",
}
-------------------------------------------------------------------------------
-------------------------------- Teks tertentu --------------------------------
-------------------------------------------------------------------------------
------------------------------------ Awal -------------------------------------
labels["bahasa AB"] = {
Wikipedia = true,
fulldef = "Bentuk-bentuk yang khas untuk bahasa AB, iaitu bentuk bahasa Inggeris Pertengahan Midland Barat awal yang agak konsisten dan seragam, mula-mula dikenal pasti oleh ahli filologi Inggeris [[w:J. R. R. Tolkien|J. R. R. Tolkien]] dan ditemui dalam Corpus MS 402 bagi ''[[w:Ancrene Wisse|Ancrene Wisse]]'' (“A”) dan MS Bodley 34 (“B”)",
aliases = {"AB language", "AB", "Ancrene Riwle", "Ancrene Wisse", "AB dialect"},
noreg = true,
parent = "Inggeris Pertengahan Awal,Shropshire",
plain_categories = true,
}
labels["Ormulum"] = {
Wikipedia = true,
fulldef = "Bentuk-bentuk dalam ortografi ''[[Ormulum]]'', sebuah karya eksegetikal yang ditulis {{circa2|1180|short=yes}} dalam bahasa Inggeris Pertengahan Lincolnshire, yang paling terkenal dengan ortografi fonemiknya yang sangat teratur dan memberikan maklumat unik mengenai sebutan kontemporari",
aliases = {"Orm", "Orrm", "Orrmulum"},
noreg = true,
parent = "Inggeris Pertengahan Awal,Lincolnshire",
plain_categories = true,
}
labels["Brut Laȝamon"] = {
display = "''Brut'' Laȝamon",
Wikipedia = "Layamon's Brut",
fulldef = "Bentuk-bentuk yang khas bagi {{w|Layamon's Brut|<i>Brut</i> Laȝamon}}, sebuah kronik puisi aliterasi mengenai sejarah Britain yang ditulis dalam bahasa Inggeris Pertengahan Midland Barat Daya awal, dan terselamat dalam dua manuskrip: MS. Cotton Caligula A.ix dan MS. Cotton Otho C.xiii; kebanyakan bentuk sepatutnya diletakkan dalam kategori untuk manuskrip individu ini",
aliases = {"Laȝamon's Brut", "La", "Laȝamon", "Layamon", "Laghamon", "Lawman", "Lazamon"},
noreg = true,
parent = "Inggeris Pertengahan Awal",
plain_categories = true,
}
labels["MS. Cotton Caligula A.ix (Laȝamon)"] = { -- penerangan tambahan diperlukan, kerana kandungan lain dalam manuskrip ditempatkan secara berbeza
display = "MS. Cotton Caligula A.ix",
Wikipedia = "Layamon's Brut",
fulldef = "Bentuk-bentuk yang khas bagi salinan {{w|Layamon's Brut|<i>Brut</i> Laȝamon}} dalam MS. Cotton Caligula A.ix, ditulis sekitar {{circa2|1275|short=yes}} dan ditempatkan di Worcestershire oleh <I>Linguistic Atlas of Early Middle English</i>",
aliases = {"La1", "LaC", "Cotton Caligula A.ix L"},
noreg = true,
parent = {"Brut Laȝamon", "Worcestershire"},
plain_categories = true,
}
labels["MS. Cotton Otho C.xiii"] = {
Wikipedia = "Layamon's Brut",
fulldef = "Bentuk-bentuk yang khas bagi salinan {{w|Layamon's Brut|<i>Brut</i> Laȝamon}} dalam MS. Cotton Otho C.xiii, ditulis sekitar {{circa2|1300|short=yes}} dan ditempatkan di Wiltshire oleh <I>Linguistic Atlas of Early Middle English</I> dan Somersetshire oleh <I>Linguistic Atlas of Late Middle English</i>",
aliases = {"La2", "LaO", "Cotton Otho C.xiii L"},
noreg = true,
parent = {"Brut Laȝamon", "Somerset", "Wiltshire"},
plain_categories = true,
}
-------------------------------- "Pertengahan" --------------------------------
labels["Ayenbite"] = {
Wikipedia = "Ayenbite of Inwyt",
fulldef = "Bentuk-bentuk yang khas bagi <i>{{w|Ayenbite of Inwyt}}</i>, ditulis pada tahun 1340 di {{w|Canterbury}}, {{w|Kent}} dan bernilai kerana ejaannya yang konsisten serta tanpa kompromi yang mewakili dialek tempatan",
aliases = {"Ay", "Agenbite", "Aȝenbite"},
noreg = true,
parent = {"Kent"},
plain_categories = true,
}
labels["Gower"] = {
Wikipedia = "John Gower",
fulldef = "Bentuk-bentuk yang khas bagi karya bahasa Inggeris Pertengahan oleh {{w|John Gower|John Gower}}, seorang penyair yang aktif pada akhir abad ke-14 dan paling diingati kerana karya ''{{w|Confessio Amantis}}'' ({{circa2|1390|short=yes}}); kebanyakan bentuk sepatutnya diletakkan dalam subkategori untuk manuskrip individu",
aliases = {"Go", "Gowerian"},
noreg = true,
parent = true,
plain_categories = true,
}
labels["MS. Fairfax 3"] = {
Wikipedia = "Confessio Amantis",
fulldef = "Bentuk-bentuk yang khas bagi salinan <I>{{w|Confessio Amantis}}</I> oleh {{w|John Gower}} dalam Bodleian MS. Fairfax 3, ditulis sekitar {{circa2|1400|short=yes}} dan mengandungi campuran dialek Kent serta Suffolk yang sering dikenal pasti sebagai dialek pengarang Gower sendiri",
aliases = {"Go1", "Fairfax 3"},
noreg = true,
parent = {"Gower", "Kent", "Suffolk"},
plain_categories = true,
}
------------------------------------ Akhir ------------------------------------
labels["Catholicon Anglicum"] = {
Wikipedia = true,
fulldef = "Bentuk-bentuk yang khas bagi <i>[[w:Catholicon Anglicum|Catholicon Anglicum]]</i> (“Kamus Semesta Inggeris”), sebuah kamus Inggeris Pertengahan ke Latin yang ditulis dalam bahasa Inggeris Pertengahan Akhir dari East Riding, Yorkshire",
aliases = {"Catholicon", "CA"},
noreg = true,
parent = "Inggeris Pertengahan Akhir,East Riding",
plain_categories = true,
}
labels["Promptorium Parvulorum"] = {
Wikipedia = true,
fulldef = "Bentuk-bentuk yang khas bagi <i>[[w:Promptorium Parvulorum|Promptorium Parvulorum]]</i> (“Bilik Simpanan Kanak-kanak”), sebuah kamus Inggeris Pertengahan ke Latin yang ditulis dalam bahasa Inggeris Pertengahan Akhir dari Norfolk",
aliases = {"Promptorium", "PP"},
noreg = true,
parent = "Inggeris Pertengahan Akhir,Norfolk",
plain_categories = true,
}
return require("Module:labels").finalize_data(labels)
abx5aot5gpqd3v34tzikjt9zj1x7pec
Modul:scripts/canonical names.json
828
76117
373597
249399
2026-09-12T11:07:05Z
Hakimi97
2668
[[MediaWiki:UpdateLanguageNameAndCode.js|dikemas kini menggunakan gajet bahasa]]
373597
json
application/json
{
"Abjad Fonetik Antarabangsa": "Ipach",
"Adlam": "Adlm",
"Afaka": "Afak",
"Ahom": "Ahom",
"Albania Kaukasus": "Aghb",
"Ancient South Arabian": "Sarb",
"Arab": "Arab",
"Arab Utara Kuno": "Narb",
"Aram Imperial": "Armi",
"Armenia": "Armn",
"Assam": "as-Beng",
"Avesta": "Avst",
"Balbodh": "Deva",
"Bali": "Bali",
"Bamum": "Bamu",
"Bassa": "Bass",
"Batak": "Batk",
"Baybayin": "Tglg",
"Bengali": "Beng",
"Bhaiksuki": "Bhks",
"Blissymbolic": "Blis",
"Brahmi": "Brah",
"Braille": "Brai",
"Buhid": "Buhd",
"Burma": "Mymr",
"Carian": "Cari",
"Chakma": "Cakm",
"Cham": "Cham",
"Cherokee": "Cher",
"Chisoi": "Chis",
"Cypro-Minoan": "Cpmn",
"Cyprus": "Cprt",
"Cyril": "Cyrl",
"Cyril Kuno": "Cyrs",
"Demotik": "Egyd",
"Deseret": "Dsrt",
"Devanagari": "Deva",
"Dhives Akuru": "Diak",
"Dogra": "Dogr",
"Dongba": "Nkdb",
"Duployan": "Dupl",
"Elam Purba": "Pelm",
"Elbasan": "Elba",
"Elymaic": "Elym",
"Fraktur": "Latf",
"Fraser": "Lisu",
"Gaelia": "Latg",
"Garay": "Gara",
"Geba": "Nkgb",
"Georgia": "Geor",
"Glagol": "Glag",
"Goth": "Goth",
"Grantha": "Gran",
"Gujarati": "Gujr",
"Gunjala Gondi": "Gong",
"Gurmukhi": "Guru",
"Habsyah": "Ethi",
"Han": "Hani",
"Han Ringkas": "Hans",
"Han Tradisional": "Hant",
"Hangul": "Hang",
"Hanifi Rohingya": "Rohg",
"Hanunoo": "Hano",
"Hatran": "Hatr",
"Hieratik": "Egyh",
"Hieroglif Anatolia": "Hluw",
"Hieroglif Meroitik": "Mero",
"Hieroglif Mesir": "Egyp",
"Hiragana": "Hira",
"Hungary Kuno": "Hung",
"Iberia Tenggara": "Ibrns",
"Iberia Timur Laut": "Ibrnn",
"Ibrani": "Hebr",
"Indus": "Inds",
"Italik Kuno": "Ital",
"Jawa": "Java",
"Jepun": "Jpan",
"Jurchen": "Jurc",
"Kaithi": "Kthi",
"Kana": "Hrkt",
"Kannada": "Knda",
"Katakana": "Kana",
"Kawi": "Kawi",
"Kayah Li": "Kali",
"Kemasan Imej": "Image",
"Kharoshthi": "Khar",
"Khema": "Gukh",
"Khitan Besar": "Kitl",
"Khitan Kecil": "Kits",
"Khmer": "Khmr",
"Khojki": "Khoj",
"Khudabadi": "Sind",
"Khutsuri": "Geok",
"Khwarezmian": "Chrs",
"Kirat Rai": "Krai",
"Kod Morse": "Morse",
"Korea": "Kore",
"Kpelle": "Kpel",
"Kulitan": "Kulit",
"Kuneiform": "Xsux",
"Kuneiform Purba": "Pcun",
"Kursif Meroitik": "Merc",
"Lai Tay": "Tayo",
"Lao": "Laoo",
"Latin": "Latn",
"Leke": "Leke",
"Lepcha": "Lepc",
"Limbu": "Limb",
"Linear A": "Lina",
"Linear B": "Linb",
"Loma": "Loma",
"Lontara": "Bugi",
"Lycia": "Lyci",
"Lydia": "Lydi",
"Mahajani": "Mahj",
"Makassar": "Maka",
"Malayalam": "Mlym",
"Manchu": "mnc-Mong",
"Mandaia": "Mand",
"Mani": "Mani",
"Marchen": "Marc",
"Masaram Gondi": "Gonm",
"Maya": "Maya",
"Medefaidrin": "Medf",
"Meitei Mayek": "Mtei",
"Mende": "Mend",
"Modi": "Modi",
"Mongol": "Mong",
"Moon": "Moon",
"Mru": "Mroo",
"Multani": "Mult",
"Mundari Bani": "Nagm",
"N'Ko": "Nkoo",
"Nabataea": "Nbat",
"Nandinagari": "Nand",
"Newa": "Newa",
"Notasi Matematik": "Zmth",
"Notasi Muzik": "Music",
"Notasi Muzik Znamenny": "Zname",
"Nyiakeng Puachue Hmong": "Hmnp",
"Nüshu": "Nshu",
"Odia": "Orya",
"Ogham": "Ogam",
"Ol Chiki": "Olck",
"Ol Onal": "Onao",
"Osage": "Osge",
"Osmanya": "Osma",
"Pahawh Hmong": "Hmng",
"Pahlavi Buku": "Phlv",
"Pahlavi Inskripsi": "Phli",
"Pahlavi Psalter": "Phlp",
"Palmyra": "Palm",
"Parsi Kuno": "Xpeo",
"Parthia Inskripsi": "Prti",
"Pau Cin Hau": "Pauc",
"Pazend": "pal-Avst",
"Penomboran Rumi": "Rumin",
"Permia Kuno": "Perm",
"Phags-pa": "Phag",
"Phoenicia": "Phnx",
"Pollard": "Plrd",
"Qibti": "Copt",
"Ranjana": "Ranj",
"Rejang": "Rjng",
"Rongorongo": "Roro",
"Rune": "Runr",
"Samaria": "Samr",
"Saurashtra": "Saur",
"Shahmukhi": "Aran",
"Sharada": "Shrd",
"Shaw": "Shaw",
"Siddham": "Sidd",
"Sidetic": "Sidt",
"SignWriting": "Sgnw",
"Simbolik": "Zsym",
"Sinaitik Purba": "Psin",
"Sinhala": "Sinh",
"Sogdia": "Sogd",
"Sogdia Kuno": "Sogo",
"Sorang Sompeng": "Sora",
"Soyombo": "Soyo",
"Sui": "Shui",
"Suku Kata Kanada": "Cans",
"Sunda": "Sund",
"Sunuwar": "Sunu",
"Suryani": "Syrc",
"Sylheti Nagri": "Sylo",
"Tagbanwa": "Tagb",
"Tai Lue Baharu": "Talu",
"Tai Nüa": "Tale",
"Tai Tham": "Lana",
"Tai Viet": "Tavt",
"Takri": "Takr",
"Tamil": "Taml",
"Tamyig": "sit-tam-Tibt",
"Tangsa": "Tnsa",
"Tangut": "Tang",
"Telugu": "Telu",
"Tengwar": "Teng",
"Thaana": "Thaa",
"Thai": "Thai",
"Thai Khom": "Khomt",
"Tibet": "Tibt",
"Tidak Terkod": "Zzzz",
"Tifinagh": "Tfng",
"Tigalari": "Tutg",
"Tirhuta": "Tirh",
"Todhri": "Todr",
"Todo": "xwo-Mong",
"Tolong Siki": "Tols",
"Toto": "Toto",
"Turkik Kuno": "Orkh",
"Ugarit": "Ugar",
"Uyghur Kuno": "Ougr",
"Vai": "Vaii",
"Varang Kshiti": "Wara",
"Visible Speech": "Visp",
"Vithkuq": "Vith",
"Wancho": "Wcho",
"Woleai": "Wole",
"Xibe": "sjo-Mong",
"Yezidi": "Yezi",
"Yi": "Yiii",
"Yunani": "Grek",
"Zanabazar Square": "Zanb",
"Zhuyin": "Bopo",
"flag semaphore": "Semap",
"tidak ditentukan": "None",
"undetermined": "Zyyy",
"unwritten": "Zxxx"
}
pw71a543qua75r58iodnqkeip4re9mm
Modul:scripts/code to canonical name.json
828
76118
373596
373550
2026-09-12T11:07:05Z
Hakimi97
2668
[[MediaWiki:UpdateLanguageNameAndCode.js|dikemas kini menggunakan gajet bahasa]]
373596
json
application/json
{
"Adlm": "Adlam",
"Afak": "Afaka",
"Aghb": "Albania Kaukasus",
"Ahom": "Ahom",
"Arab": "Arab",
"Aran": "Arab",
"Aran:hnd": "Shahmukhi",
"Aran:hno": "Shahmukhi",
"Aran:inc-opa": "Shahmukhi",
"Aran:lah": "Shahmukhi",
"Aran:pa": "Shahmukhi",
"Aran:phr": "Shahmukhi",
"Aran:skr": "Shahmukhi",
"Armi": "Aram Imperial",
"Armn": "Armenia",
"Avst": "Avesta",
"Bali": "Bali",
"Bamu": "Bamum",
"Bass": "Bassa",
"Batk": "Batak",
"Beng": "Bengali",
"Bhks": "Bhaiksuki",
"Blis": "Blissymbolic",
"Bopo": "Zhuyin",
"Brah": "Brahmi",
"Brai": "Braille",
"Bugi": "Lontara",
"Buhd": "Buhid",
"Cakm": "Chakma",
"Cans": "Suku Kata Kanada",
"Cari": "Carian",
"Cham": "Cham",
"Cher": "Cherokee",
"Chis": "Chisoi",
"Chrs": "Khwarezmian",
"Copt": "Qibti",
"Cpmn": "Cypro-Minoan",
"Cprt": "Cyprus",
"Cyrl": "Cyril",
"Cyrs": "Cyril Kuno",
"Deva": "Devanagari",
"Deva:ahr": "Balbodh",
"Deva:kfq": "Balbodh",
"Deva:kok": "Balbodh",
"Deva:mr": "Balbodh",
"Deva:omr": "Balbodh",
"Deva:vah": "Balbodh",
"Diak": "Dhives Akuru",
"Dogr": "Dogra",
"Dsrt": "Deseret",
"Dupl": "Duployan",
"Egyd": "Demotik",
"Egyh": "Hieratik",
"Egyp": "Hieroglif Mesir",
"Elba": "Elbasan",
"Elym": "Elymaic",
"Ethi": "Habsyah",
"Gara": "Garay",
"Geok": "Khutsuri",
"Geor": "Georgia",
"Glag": "Glagol",
"Gong": "Gunjala Gondi",
"Gonm": "Masaram Gondi",
"Goth": "Goth",
"Gran": "Grantha",
"Grek": "Yunani",
"Gujr": "Gujarati",
"Gukh": "Khema",
"Guru": "Gurmukhi",
"Hang": "Hangul",
"Hani": "Han",
"Hano": "Hanunoo",
"Hans": "Han Ringkas",
"Hant": "Han Tradisional",
"Hatr": "Hatran",
"Hebr": "Ibrani",
"Hira": "Hiragana",
"Hluw": "Hieroglif Anatolia",
"Hmng": "Pahawh Hmong",
"Hmnp": "Nyiakeng Puachue Hmong",
"Hrkt": "Kana",
"Hung": "Hungary Kuno",
"Ibrnn": "Iberia Timur Laut",
"Ibrns": "Iberia Tenggara",
"Image": "Kemasan Imej",
"Inds": "Indus",
"Ipach": "Abjad Fonetik Antarabangsa",
"Ital": "Italik Kuno",
"Java": "Jawa",
"Jpan": "Jepun",
"Jurc": "Jurchen",
"Kali": "Kayah Li",
"Kana": "Katakana",
"Kawi": "Kawi",
"Khar": "Kharoshthi",
"Khmr": "Khmer",
"Khoj": "Khojki",
"Khomt": "Thai Khom",
"Kitl": "Khitan Besar",
"Kits": "Khitan Kecil",
"Knda": "Kannada",
"Kore": "Korea",
"Kpel": "Kpelle",
"Krai": "Kirat Rai",
"Kthi": "Kaithi",
"Kulit": "Kulitan",
"Lana": "Tai Tham",
"Laoo": "Lao",
"Latf": "Fraktur",
"Latg": "Gaelia",
"Latn": "Latin",
"Leke": "Leke",
"Lepc": "Lepcha",
"Limb": "Limbu",
"Lina": "Linear A",
"Linb": "Linear B",
"Lisu": "Fraser",
"Loma": "Loma",
"Lyci": "Lycia",
"Lydi": "Lydia",
"Mahj": "Mahajani",
"Maka": "Makassar",
"Mand": "Mandaia",
"Mani": "Mani",
"Marc": "Marchen",
"Maya": "Maya",
"Medf": "Medefaidrin",
"Mend": "Mende",
"Merc": "Kursif Meroitik",
"Mero": "Hieroglif Meroitik",
"Mlym": "Malayalam",
"Modi": "Modi",
"Mong": "Mongol",
"Moon": "Moon",
"Morse": "Kod Morse",
"Mroo": "Mru",
"Mtei": "Meitei Mayek",
"Mult": "Multani",
"Music": "Notasi Muzik",
"Mymr": "Burma",
"Nagm": "Mundari Bani",
"Nand": "Nandinagari",
"Narb": "Arab Utara Kuno",
"Nbat": "Nabataea",
"Newa": "Newa",
"Nkdb": "Dongba",
"Nkgb": "Geba",
"Nkoo": "N'Ko",
"None": "tidak ditentukan",
"Nshu": "Nüshu",
"Ogam": "Ogham",
"Olck": "Ol Chiki",
"Onao": "Ol Onal",
"Orkh": "Turkik Kuno",
"Orya": "Odia",
"Osge": "Osage",
"Osma": "Osmanya",
"Ougr": "Uyghur Kuno",
"Palm": "Palmyra",
"Pauc": "Pau Cin Hau",
"Pcun": "Kuneiform Purba",
"Pelm": "Elam Purba",
"Perm": "Permia Kuno",
"Phag": "Phags-pa",
"Phli": "Pahlavi Inskripsi",
"Phlp": "Pahlavi Psalter",
"Phlv": "Pahlavi Buku",
"Phnx": "Phoenicia",
"Plrd": "Pollard",
"Polyt": "Yunani",
"Prti": "Parthia Inskripsi",
"Psin": "Sinaitik Purba",
"Ranj": "Ranjana",
"Rjng": "Rejang",
"Rohg": "Hanifi Rohingya",
"Roro": "Rongorongo",
"Rumin": "Penomboran Rumi",
"Runr": "Rune",
"Samr": "Samaria",
"Sarb": "Ancient South Arabian",
"Saur": "Saurashtra",
"Semap": "flag semaphore",
"Sgnw": "SignWriting",
"Shaw": "Shaw",
"Shrd": "Sharada",
"Shui": "Sui",
"Sidd": "Siddham",
"Sidt": "Sidetic",
"Sind": "Khudabadi",
"Sinh": "Sinhala",
"Sogd": "Sogdia",
"Sogo": "Sogdia Kuno",
"Sora": "Sorang Sompeng",
"Soyo": "Soyombo",
"Sund": "Sunda",
"Sunu": "Sunuwar",
"Sylo": "Sylheti Nagri",
"Syrc": "Suryani",
"Tagb": "Tagbanwa",
"Takr": "Takri",
"Tale": "Tai Nüa",
"Talu": "Tai Lue Baharu",
"Taml": "Tamil",
"Tang": "Tangut",
"Tavt": "Tai Viet",
"Tayo": "Lai Tay",
"Telu": "Telugu",
"Teng": "Tengwar",
"Tfng": "Tifinagh",
"Tglg": "Baybayin",
"Thaa": "Thaana",
"Thai": "Thai",
"Tibt": "Tibet",
"Tirh": "Tirhuta",
"Tnsa": "Tangsa",
"Todr": "Todhri",
"Tols": "Tolong Siki",
"Toto": "Toto",
"Tutg": "Tigalari",
"Ugar": "Ugarit",
"Vaii": "Vai",
"Visp": "Visible Speech",
"Vith": "Vithkuq",
"Wara": "Varang Kshiti",
"Wcho": "Wancho",
"Wole": "Woleai",
"Xpeo": "Parsi Kuno",
"Xsux": "Kuneiform",
"Yezi": "Yezidi",
"Yiii": "Yi",
"Zanb": "Zanabazar Square",
"Zmth": "Notasi Matematik",
"Zname": "Notasi Muzik Znamenny",
"Zsym": "Simbolik",
"Zxxx": "unwritten",
"Zyyy": "undetermined",
"Zzzz": "Tidak Terkod",
"as-Beng": "Assam",
"mnc-Mong": "Manchu",
"pal-Avst": "Pazend",
"pjt-Latn": "Latin",
"sit-tam-Tibt": "Tamyig",
"sjo-Mong": "Xibe",
"xwo-Mong": "Todo"
}
1137z4jqcrmycins8k17s95t1a1bn77
Modul:families/canonical names.json
828
76130
373565
373524
2026-09-11T13:20:59Z
Hakimi97
2668
[[MediaWiki:UpdateLanguageNameAndCode.js|dikemas kini menggunakan gajet bahasa]]
373565
json
application/json
{
"Abenaki-Penobscot": "alg-abp",
"Abkhaz-Abaza": "cau-abz",
"Adamawa": "alv-ada",
"Adelbert Selatan": "ngf-sad",
"Adelbert Utara": "ngf-nad",
"Afroasia": "afa",
"Aian": "paa-aia",
"Ainuik": "qfa-ain",
"Aisian": "ngf-ais",
"Aizi": "kro-aiz",
"Alacalufan": "aqa",
"Albania": "sqj",
"Algik": "aql",
"Algonquin": "alg",
"Algonquin Timur": "alg-eas",
"Almora": "sit-alm",
"Alor-Pantar": "paa-alp",
"Alumik": "nic-alu",
"Amto-Musan": "paa-amu",
"Anatolia": "ine-ana",
"Andaman Raya": "qfa-adm",
"Andaman Raya Selatan": "qfa-ads",
"Andaman Raya Tengah": "qfa-adc",
"Andaman Raya Utara": "qfa-adn",
"Andi": "cau-and",
"Angal-Kewa": "ngf-ank",
"Angami-Pochuri": "tbq-anp",
"Angan": "ngf-ang",
"Anglia": "gmw-ang",
"Anglo-Frisia": "gmw-afr",
"Anglo-Norman Ireland": "gmw-ian",
"Anim": "paa-ani",
"Ankave-Tainae-Akoye": "ngf-ata",
"Ao": "njo",
"Apache": "apa",
"Arab": "sem-arb",
"Arab Selatan Kuno": "sem-osa",
"Arab Selatan Moden": "sem-sar",
"Arafundi": "paa-arf",
"Aram": "sem-ara",
"Aram Barat": "sem-arw",
"Aram Tenggara": "sem-ase",
"Aram Timur": "sem-are",
"Arandic": "aus-rnd",
"Arapaho": "alg-ara",
"Arapesh": "paa-ara",
"Arauca": "sai-ara",
"Arawa": "auf",
"Arawak": "awd",
"Arinik": "qfa-yrn",
"Armenia": "hyx",
"Arnhem": "aus-arn",
"Aroid": "omv-aro",
"Asli": "mkh-asl",
"Asmat": "ngf-asm",
"Asmat-Kamoro": "ngf-ask",
"Asturleon": "roa-asl",
"Ataitan": "paa-ata",
"Atayalik": "map-ata",
"Athabaska": "ath",
"Athabaska Pesisir Pasifik": "ath-pco",
"Athabaska Utara": "ath-nor",
"Atlantik-Congo": "alv",
"Austroasia": "aav",
"Austronesia": "map",
"Avar-Andi": "cau-ava",
"Awyu": "ngf-awy",
"Awyu Raya": "ngf-gaw",
"Awyu-Dumut": "ngf-awd",
"Axioid": "tbq-axi",
"Ayere-Ahan": "alv-aah",
"Aymara": "sai-aym",
"Bafia": "bnt-baf",
"Bafo-Bonkeng": "bnt-bbo",
"Baga": "alv-bag",
"Bagirmi": "csu-bgr",
"Bahasa Isyarat Amerika": "sgn-asl",
"Bahasa-bahasa Isyarat Jepun": "sgn-jsl",
"Bahasa-bahasa Isyarat Jerman": "sgn-gsl",
"Bahasa-bahasa Isyarat Perancis": "sgn-fsl",
"Bahasa-bahasa KRDS": "inc-krd",
"Bahnarik": "mkh-ban",
"Bahnarik Utara": "mkh-nbn",
"Bai": "sit-bai",
"Bai Utara": "sit-nba",
"Baining": "paa-bai",
"Bak": "alv-bak",
"Baka": "nic-nkb",
"Bali-Sasak-Sumbawa": "poz-bss",
"Baltik": "bat",
"Baltik Barat": "bat-wes",
"Baltik Timur": "bat-eas",
"Balto-Slavik": "ine-bsl",
"Bambuka": "alv-bam",
"Bamileke": "bai",
"Banda": "bad",
"Banda Tengah": "bad-cnt",
"Bangi-Moi": "bnt-bmo",
"Bangi-Ntomba": "bnt-bnm",
"Bangi-Tetela": "bnt-bte",
"Bantoid": "nic-bod",
"Bantoid Selatan": "nic-bds",
"Bantoid Utara": "nic-bdn",
"Bantoid-Cross": "nic-bcr",
"Bantu": "bnt",
"Bantu Barat Daya": "bnt-swb",
"Bantu Pesisir Timur Laut": "bnt-ncb",
"Bantu Selatan": "bnt-bso",
"Bantu Tasik-Tasik Besar": "bnt-glb",
"Bantu Timur Laut": "bnt-bne",
"Banyum": "alv-bny",
"Barbacoa": "sai-bar",
"Barbar": "ber",
"Bari": "sdv-bri",
"Barito Barat": "poz-brw",
"Barito Timur": "poz-bre",
"Baruya-Simbari": "ngf-bsi",
"Basa": "nic-bas",
"Basaa": "bnt-bsa",
"Batak": "btk",
"Bati-Angba": "bnt-bta",
"Bayono-Awbono": "paa-baa",
"Be": "qfa-onb",
"Be-Jizhao": "qfa-bej",
"Be-Tai": "qfa-bet",
"Beboid": "nic-beb",
"Beboid Timur": "nic-bbe",
"Becking-Dawi": "ngf-bda",
"Bekwilic": "bnt-bek",
"Bena-Kinga": "bnt-bki",
"Bendi": "nic-ben",
"Benggali–Assam": "inc-bas",
"Benue-Congo": "nic-bco",
"Beromik": "nic-beo",
"Betaf-Vitou": "paa-bvi",
"Beti": "bnt-btb",
"Bewani": "paa-bew",
"Bhil": "inc-bhi",
"Bi-Ka": "tbq-bka",
"Bihar": "inc-bih",
"Bikwin-Jen": "alv-bwj",
"Binanderean": "ngf-bin",
"Binanderean Raya": "ngf-gbi",
"Binanderean Utara": "ngf-nbi",
"Birri-Kresh": "csu-bkr",
"Bisa-Busa": "dmn-bbu",
"Bisoid": "tbq-bis",
"Boan": "bnt-boa",
"Boane": "ngf-boa",
"Boazi": "paa-boa",
"Bod": "sit-bdi",
"Bod Timur": "sit-ebo",
"Bodo-Garo": "tbq-bdg",
"Boma-Dzing": "bnt-bdz",
"Bongo-Bagirmi": "csu-bba",
"Bongo-Baka": "csu-bbk",
"Boran": "sai-bor",
"Border": "paa-bor",
"Borneo Utara": "poz-bnn",
"Bosavi": "ngf-bos",
"Bosngun-Awar": "paa-baw",
"Botatwe": "bnt-bot",
"Bougainville Selatan": "paa-sbo",
"Bougainville Utara": "paa-nbo",
"Brythonik": "cel-bry",
"Brythonik Barat": "cel-brw",
"Brythonik Barat Daya": "cel-brs",
"Bua": "alv-bua",
"Buja-Ngombe": "bnt-bun",
"Bukit Serra": "paa-shi",
"Buli-Koma": "nic-buk",
"Bungku-Tolaki": "poz-btk",
"Bunuba": "aus-bub",
"Burmik": "tbq-brm",
"Burmo-Qiangik": "tbq-buq",
"Bushoong": "bnt-bsh",
"Buyang": "qfa-buy",
"Bwa": "nic-bwa",
"Bété": "kro-bet",
"Caddo": "cdd",
"Cahuapanan": "sai-cah",
"Cai-Long": "sit-cln",
"Cangin": "alv-cng",
"Caspia": "ira-csp",
"Castilia": "roa-cas",
"Catacao": "sai-ctc",
"Catawba": "nai-cat",
"Cerrado": "sai-cer",
"Chad Timur": "cdc-est",
"Chadik": "cdc",
"Chadik Barat": "cdc-wst",
"Chadik Tengah": "cdc-cbm",
"Chaga": "bnt-chg",
"Chaga-Taita": "bnt-cht",
"Chamik": "cmc",
"Chapacuran": "sai-cpc",
"Charruan": "sai-crn",
"Chatino": "omq-cha",
"Chibcha": "cba",
"Chimakuan": "chi",
"Chimbu-Wahgi": "ngf-chw",
"Chinantecan": "omq-chi",
"Chinook": "nai-ckn",
"Chitral": "inc-chi",
"Choco": "sai-chc",
"Chokwe-Luchazi": "bnt-clu",
"Chonan": "sai-cho",
"Chug-Lish": "sit-khc",
"Chukotka": "qfa-ckn",
"Chukotka-Kamchatka": "qfa-cka",
"Chumashan": "nai-chu",
"Circassia": "cau-cir",
"Comoros": "bnt-com",
"Coosan": "nai-coo",
"Cross River": "nic-cri",
"Cross River Hilir": "nic-lcr",
"Cross River Hulu": "nic-ucr",
"Cross River Hulu Timur-Barat": "nic-uce",
"Cross River Hulu Utara-Selatan": "nic-ucn",
"Cuicatec": "omq-cui",
"Cupan": "azc-cup",
"Dagan": "ngf-dag",
"Dagbani": "nic-dag",
"Daju": "sdv-daj",
"Dakoid": "nic-dak",
"Dakota": "sio-dkt",
"Dallman": "ngf-dal",
"Daly": "aus-dal",
"Dangari": "inc-dng",
"Dani": "ngf-dan",
"Dani Lembah Besar": "ngf-gvd",
"Dani Tengah": "ngf-cda",
"Dardik": "inc-dar",
"Dardik Timur": "inc-dre",
"Dargwa": "cau-drg",
"Dataran Tasik": "paa-lpl",
"Dataran Tasik Barat": "paa-wlp",
"Dataran Tasik Barat Jauh": "paa-flp",
"Dataran Tasik Tengah": "paa-clp",
"Dataran Tasik Timur": "paa-elp",
"Dayak Darat": "day",
"Delta Tengah": "nic-cde",
"Dene-Yenisei": "qfa-dny",
"Dhegiha": "sio-dhe",
"Dhimalish": "sit-dhi",
"Dida": "kro-did",
"Dinka-Nuer": "sdv-dnu",
"Dizoid": "omv-diz",
"Dogon": "qfa-dgn",
"Dogon Barat": "nic-dgw",
"Dogon Dataran": "nic-pld",
"Dogon Penara Utara": "nic-npd",
"Doso-Turumsa": "paa-dtu",
"Dravidia": "dra",
"Dravidia Selatan": "dra-sou",
"Dravidia Selatan I": "dra-sdo",
"Dravidia Selatan II": "dra-sdt",
"Dravidia Tengah": "dra-cen",
"Dravidia Utara": "dra-nor",
"Dumut": "ngf-dum",
"Duru": "alv-dur",
"Dyirbal": "aus-dyb",
"Ede": "alv-ede",
"Edekiri": "alv-edk",
"Edo-Esan-Ora": "alv-eeo",
"Edoid": "alv-edo",
"Edoid Barat Daya": "alv-swd",
"Edoid Barat Laut": "alv-nwd",
"Edoid Delta": "alv-dlt",
"Edoid Utara-Tengah": "alv-nce",
"Ekoid": "nic-eko",
"Eleman": "paa-ele",
"Eleman Barat": "paa-wel",
"Eleman Timur": "paa-eel",
"Emilia-Romagnol": "roa-emr",
"Enets": "syd-ene",
"Engan": "ngf-eng",
"Engan Luar": "ngf-oen",
"Engik": "ngf-enc",
"Erap": "ngf-era",
"Ersuik": "sit-ers",
"Escarpment Dogon": "nic-dge",
"Eskimo": "esx-esk",
"Eskimo-Aleut": "esx",
"Evapia": "ngf-eva",
"Ewenik": "tuw-ewe",
"Fali": "alv-fli",
"Fas": "paa-fas",
"Filipina": "phi",
"Finisterre": "ngf-fin",
"Finisterre-Huon": "ngf-fhu",
"Finnik": "urj-fin",
"Fore-Gimi": "ngf-fgi",
"Franconia Tanah Rendah": "gmw-frk",
"Frisia": "gmw-fri",
"Fula-Wolof": "alv-fwo",
"Fur": "ssa-fur",
"Furu": "nic-fru",
"Ga-Dangme": "alv-gda",
"Gaena-Korafe": "ngf-gko",
"Gahuku": "ngf-gah",
"Galela-Tobelo": "paa-gto",
"Galicia-Portugis": "roa-gap",
"Gallo-Italik": "roa-git",
"Gallo-Raetia": "roa-grh",
"Gallo-Romawi": "roa-gar",
"Garawan": "aus-gar",
"Gauwa": "ngf-gau",
"Gbanziri": "nic-nkg",
"Gbaya": "gba",
"Gbaya Barat": "gba-wes",
"Gbaya Selatan": "gba-sou",
"Gbaya Timur": "gba-eas",
"Gbe": "alv-gbe",
"Gelao": "gio",
"Georgia-Zan": "ccs-gzn",
"Gogodala-Suki": "ngf-gsu",
"Goidelik": "cel-gae",
"Gondi": "dra-gon",
"Gondi-Kui": "dra-gki",
"Gonga": "omv-gon",
"Goroka": "ngf-gor",
"Grassfields": "nic-grf",
"Grassfields Barat Daya": "nic-grs",
"Grassfields Timur": "nic-gre",
"Grebo": "kro-grb",
"Grebo tepat": "grb",
"Guaicuruan": "sai-guc",
"Guajibo": "sai-guh",
"Guang": "alv-gng",
"Guarani": "gn",
"Guiana": "sai-gui",
"Gum": "ngf-gum",
"Gunwinyguan": "aus-gun",
"Gur": "nic-gur",
"Gurma": "nic-grm",
"Gurunsi": "nic-gns",
"Gurunsi Barat": "nic-gnw",
"Gurunsi Timur": "nic-gne",
"Gurunsi Utara": "nic-gnn",
"Gusap-Mot": "ngf-gmo",
"Hagen": "ngf-hag",
"Halbik": "inc-hal",
"Halmahera Utara": "paa-nha",
"Halmahera Utara Bahagian Utara": "paa-nnh",
"Halmahera-Cenderawasih": "poz-hce",
"Hanoid": "tbq-han",
"Hanseman": "ngf-han",
"Hanseman Barat Laut": "ngf-nwh",
"Harákmbut": "sai-har",
"Harákmbut-Katukinan": "sai-hkt",
"Haya-Jita": "bnt-haj",
"Heiban": "alv-hei",
"Hellenik": "grk",
"Heyo-Yahang": "paa-hya",
"Hill Nubian": "nub-hil",
"Himalaya Barat": "sit-whm",
"Hindi Barat": "inc-hiw",
"Hindi Timur": "inc-hie",
"Hindustan": "inc-hnd",
"Hispano-Keltik": "cel-his",
"Hlai": "qfa-lic",
"Hmong-Mien": "hmx",
"Hmongik": "hmn",
"Hokan": "hok",
"Horpa": "ero",
"Hrusish": "sit-hrs",
"Huarpean": "sai-hrp",
"Huon": "ngf-huo",
"Huon Timur": "ngf-ehu",
"Hurro-Urartian": "qfa-hur",
"Ibero-Romawi": "roa-ibe",
"Ibibio-Efik": "nic-ief",
"Idomoid": "alv-ido",
"Igboid": "alv-igb",
"Ijoid": "ijo",
"Indo-Arya": "inc",
"Indo-Arya Barat": "inc-wes",
"Indo-Arya Barat Laut": "inc-nwe",
"Indo-Arya Kepulauan": "inc-ins",
"Indo-Arya Kuno": "inc-old",
"Indo-Arya Selatan": "inc-sou",
"Indo-Arya Tengah": "inc-mid",
"Indo-Arya Timur": "inc-eas",
"Indo-Arya Utara": "inc-nor",
"Indo-Eropah": "ine",
"Indo-Iran": "iir",
"Inuit": "esx-inu",
"Iran": "ira",
"Iran Barat": "ira-wes",
"Iran Barat Daya": "ira-swi",
"Iran Barat Laut": "ira-nwi",
"Iran Kuno": "ira-old",
"Iran Pusat": "ira-cen",
"Iran Tengah": "ira-mid",
"Iran Tenggara": "ira-sei",
"Iran Timur Laut": "ira-nei",
"Iroquois": "iro",
"Iroquois Utara": "iro-nor",
"Irula-Muduga": "dra-imd",
"Italik": "itc",
"Italo-Dalmatia": "roa-itd",
"Italo-Romawi": "roa-itr",
"Italo-Romawi Barat": "roa-iwr",
"Iwaidjan": "aus-wdj",
"Iwam": "paa-iwa",
"Jarawa": "nic-jrw",
"Jarawan": "nic-jrn",
"Jarrakan": "aus-jar",
"Jebel Timur": "sdv-eje",
"Jepunik": "jpx",
"Jera": "nic-jer",
"Jerman Tanah Rendah": "gmw-lgm",
"Jerman Tanah Tinggi": "gmw-hgm",
"Jermanik": "gem",
"Jermanik Barat": "gmw",
"Jermanik Laut Utara": "gmw-nsg",
"Jermanik Timur": "gme",
"Jermanik Utara": "gmq",
"Jicaquean": "nai-jcq",
"Jimi": "ngf-jim",
"Jingphoik": "sit-jnp",
"Jino": "tbq-jin",
"Jirajaran": "sai-jir",
"Jivaro": "sai-jiv",
"Jogo-Jeri": "dmn-jje",
"Jola": "alv-jol",
"Jola-Felupe": "alv-jfe",
"Jukunoid": "nic-jkn",
"Jurchenik": "tuw-jrc",
"Jê": "sai-jee",
"Jê Selatan": "sai-sje",
"Jê Tengah": "sai-cje",
"Jê Utara": "sai-nje",
"Ka-Togo": "alv-ktg",
"Kaba": "csu-kab",
"Kabwum": "ngf-kab",
"Kachin-Luik": "sit-jpl",
"Kadu": "qfa-kad",
"Kaili-Pamona": "poz-kal",
"Kainantu": "ngf-kai",
"Kainantu-Goroka": "ngf-kgo",
"Kainji": "nic-knj",
"Kainji Barat Laut": "nic-knn",
"Kainji Timur": "nic-kne",
"Kako": "bnt-kak",
"Kalam-Adelbert Selatan": "ngf-ksa",
"Kalam-Kobon": "ngf-kak",
"Kalamian": "phi-kal",
"Kalapuyan": "nai-klp",
"Kalenjin": "sdv-kln",
"Kam-Sui": "qfa-kms",
"Kamano-Yagaria": "ngf-kya",
"Kambari": "nic-kam",
"Kamuku": "nic-kmk",
"Kamula-Elevala": "paa-kae",
"Kanaan": "sem-can",
"Kannadoid": "dra-kan",
"Kanum": "paa-kan",
"Kapau-Menya": "ngf-kme",
"Karaboro": "alv-krb",
"Karen": "kar",
"Karib": "sai-car",
"Karib Venezuela": "sai-ven",
"Karluk": "trk-kar",
"Karnic": "aus-kar",
"Kartvelia": "ccs",
"Kashmirik": "inc-kas",
"Katloid": "nic-ktl",
"Katuik": "mkh-kat",
"Katukinan": "sai-ktk",
"Kaukasus Barat Laut": "cau-nwc",
"Kaukasus Timur Laut": "cau-nec",
"Kaukombar": "ngf-kau",
"Kaure-Kosare": "paa-kko",
"Kauru": "nic-kau",
"Kavango": "bnt-kav",
"Kavango-Bantu Barat Daya": "bnt-ksb",
"Kayagarik": "paa-kay",
"Kazhuoish": "tbq-kzh",
"Kele": "bnt-kel",
"Kele-Tsogo": "bnt-kts",
"Keltik": "cel",
"Keltik Kepulauan": "cel-ins",
"Kepala Burung Barat": "paa-wbh",
"Kepala Burung Timur": "paa-ebh",
"Kepulauan Admiralty": "poz-aay",
"Keram": "paa-ker",
"Keram Barat": "paa-wke",
"Keram Timur": "paa-eke",
"Keresan": "nai-ker",
"Ketik": "qfa-yke",
"Kewa-Huli": "ngf-khu",
"Kham": "sit-kha",
"Khanty": "kca",
"Khasi": "aav-khs",
"Khmerik": "mkh-kmr",
"Khmuik": "mkh-khm",
"Kho-Bwa": "sit-khb",
"Kho-Bwa Barat": "sit-khw",
"Khoe": "khi-kho",
"Khoe Kalahari": "khi-kal",
"Khoe-Kwadi": "khi-kkw",
"Khoekhoe": "khi-khk",
"Kikuyu-Kamba": "bnt-kka",
"Kilombero": "bnt-kil",
"Kim": "alv-kim",
"Kimbundu": "bnt-kmb",
"Kinnaurik": "sit-kin",
"Kiowa-Tanoan": "nai-kta",
"Kipchak": "trk-kip",
"Kipchak-Bulgar": "trk-kbu",
"Kipchak-Cuman": "trk-kcu",
"Kipchak-Nogai": "trk-kno",
"Kiranti": "sit-kir",
"Kiranti Barat": "sit-kiw",
"Kiranti Tengah": "sit-kic",
"Kiranti Timur": "sit-kie",
"Kissi": "alv-kis",
"Kiwaian": "paa-kiw",
"Kodagu": "dra-kod",
"Kohistani": "inc-koh",
"Koiarian": "ngf-koi",
"Kokon": "ngf-kok",
"Kolami-Naiki": "dra-knk",
"Kolopom": "paa-kol",
"Koman": "ssa-kom",
"Kombio": "paa-kom",
"Kombio-Arapesh": "paa-koa",
"Komi": "kv",
"Komisenia": "ira-kms",
"Komo-Bira": "bnt-kbi",
"Komyandaret-Tsaukambo": "ngf-kts",
"Konda-Kui": "dra-kki",
"Kongo": "bnt-kng",
"Konyak-Chang": "sit-kch",
"Koraga": "dra-kor",
"Koreanik": "qfa-kor",
"Kosorong-Burum-Mindik": "ngf-kbm",
"Kottik": "qfa-yko",
"Kowan": "ngf-kow",
"Kpala": "nic-nkk",
"Kpwe": "bnt-kpw",
"Kra": "qfa-kra",
"Kra-Dai": "qfa-tak",
"Kru": "kro",
"Kru Barat": "kro-wkr",
"Kru Timur": "kro-ekr",
"Kube-Tobo": "ngf-kto",
"Kuikuroan": "sai-kui",
"Kuki-Chin": "tbq-kuk",
"Kulango": "alv-kul",
"Kuliak": "ssa-klk",
"Kumil": "ngf-kum",
"Kunar": "inc-kun",
"Kunimaipan": "paa-kun",
"Kurdi": "ku",
"Kurux-Malto": "dra-kml",
"Kushitik": "cus",
"Kushitik Selatan": "cus-sou",
"Kushitik Tengah": "cus-cen",
"Kushitik Timur": "cus-eas",
"Kushitik Timur Tanah Tinggi": "cus-hec",
"Kutubuan Timur": "ngf-eku",
"Kwa": "alv-kwa",
"Kwalean": "paa-kwa",
"Kwerba Raya": "paa-gkw",
"Kwerba tepat": "paa-kwe",
"Kwomtari": "paa-kwo",
"Kx'a": "khi-kxa",
"Kyirong-Kagate": "sit-kyk",
"Kyrgyz-Kipchak": "trk-kkp",
"Kâte-Mape": "ngf-kma",
"Ladakhi-Balti": "sit-lab",
"Lagoon": "alv-lag",
"Lahoish": "tbq-lho",
"Lahuli-Spiti": "sit-las",
"Lalo": "tbq-lal",
"Lampungik": "poz-lgx",
"Latino-Falisci": "itc-laf",
"Lawu": "tbq-lwo",
"Lebonya": "bnt-leb",
"Lechitik": "zlw-lch",
"Lega-Binja": "bnt-lgb",
"Leko": "alv-lek",
"Leko-Nimbari": "alv-lni",
"Lenape": "del",
"Lenca": "nai-len",
"Lendu": "csu-lnd",
"Lepki-Murkim": "paa-lmu",
"Lezghi": "cau-lzg",
"Limba": "alv-lim",
"Lipo-Lolopo": "tbq-llo",
"Lisu": "tbq-lso",
"Logooli-Kuria": "bnt-lok",
"Lolo-Burma": "tbq-lob",
"Loloda-Laba": "paa-lla",
"Loloik": "tbq-lol",
"Loloik Selatan": "tbq-slo",
"Loloik Tenggara": "tbq-sel",
"Loloik Utara": "tbq-nlo",
"Lotuko-Maa": "sdv-lma",
"Luba": "bnt-lub",
"Luban": "bnt-lbn",
"Lui": "sit-luu",
"Lunda": "bnt-lun",
"Luo": "sdv-luo",
"Luo Selatan": "sdv-los",
"Luo Utara": "sdv-lon",
"Lurik": "ira-lur",
"Luwik": "ine-luw",
"Mabuso": "ngf-mab",
"Madang": "ngf-mad",
"Madiya": "dra-mdy",
"Magarik Raya": "sit-gma",
"Maiduan": "nai-mdu",
"Mailuan": "paa-mal",
"Maimai": "paa-mam",
"Mairasi": "paa-mai",
"Makaa": "bnt-mka",
"Makaa-Njem": "bnt-mnj",
"Makro-Bai": "sit-mba",
"Makro-Chibcha": "qfa-mch",
"Makro-Jê": "sai-mje",
"Makua": "bnt-mak",
"Malayalamoid": "dra-mal",
"Malto": "dra-mlo",
"Maluku Tengah": "poz-cma",
"Mambiloid": "nic-mmb",
"Mamfe": "nic-mam",
"Mandarinik": "zhx-man",
"Mande": "dmn",
"Mande Barat": "dmn-mdw",
"Mande Barat Daya": "dmn-msw",
"Mande Barat Laut": "dmn-mnw",
"Mande Tengah": "dmn-mdc",
"Mande Tenggara": "dmn-mse",
"Mande Timur": "dmn-mde",
"Mandi-Muniwara": "paa-mmu",
"Manding": "dmn-man",
"Manding Barat": "dmn-wmn",
"Manding Timur": "dmn-emn",
"Manding-Jogo": "dmn-mjo",
"Manding-Mokole": "dmn-mmo",
"Manding-Vai": "dmn-mva",
"Manenguba": "bnt-mne",
"Mangbetu": "csu-maa",
"Mangbutu-Lese": "csu-mle",
"Mangik": "mkh-mng",
"Maninka": "dmn-mnk",
"Mano-Dan": "dmn-mda",
"Manobo": "mno",
"Mansi": "mns",
"Manubaran": "paa-man",
"Mao": "omv-mao",
"Mapoyan": "sai-map",
"Mari": "chm",
"Marienberg": "paa-mar",
"Marind-Boazi-Yaqay": "paa-mby",
"Marindik": "paa-mri",
"Maringik": "sit-mar",
"Masa": "cdc-mas",
"Masaba-Luhya": "bnt-msl",
"Mascoian": "sai-mas",
"Mataco-Guaicuru": "sai-mgc",
"Matacoan": "sai-mtc",
"May Kiri": "paa-lma",
"Maya": "myn",
"Maybratik": "paa-may",
"Mazanderani-Shahmirzadi": "ira-msh",
"Mazatecan": "omq-maz",
"Mba": "nic-mbc",
"Mbaham-Iha": "paa-mbi",
"Mbaka": "nic-nkm",
"Mbam": "nic-mba",
"Mbam Barat": "nic-mbw",
"Mbete": "bnt-mbt",
"Mbeya": "bnt-mby",
"Mbinga": "bnt-mbi",
"Mbole-Enya": "bnt-mbe",
"Mboshi": "bnt-mbo",
"Mboshi-Buja": "bnt-mbb",
"Mbugwe-Rangi": "bnt-mra",
"Mbum": "alv-mbm",
"Mbum-Day": "alv-mbd",
"Medes": "xme",
"Medo-Parthia": "ira-mpr",
"Mek": "ngf-mek",
"Mel": "alv-mel",
"Melayik": "poz-mly",
"Melayu-Chamik": "poz-mcm",
"Melayu-Polinesia": "poz",
"Melayu-Polinesia Tengah-Timur": "poz-cet",
"Melayu-Polinesia Timur": "pqe",
"Melayu-Sumbawa": "poz-msa",
"Mesir": "egx",
"Mey-Sartang": "sit-khm",
"Mian-Suganga": "ngf-msu",
"Midzu": "sit-mdz",
"Mienik": "hmx-mie",
"Mijikenda": "bnt-mij",
"Mikronesia": "poz-mic",
"Min": "zhx-min",
"Min Pedalaman": "zhx-inm",
"Min Pesisir": "zhx-com",
"Min Selatan": "zhx-nan",
"Mindjim": "ngf-min",
"Mirndi": "aus-mir",
"Misumalpa": "nai-min",
"Mixe-Zoque": "nai-miz",
"Mixtec": "omq-mxt",
"Mixtecan": "omq-mix",
"Mokole": "dmn-mok",
"Mombum": "ngf-mom",
"Momo": "nic-mom",
"Mon-Khmer": "mkh",
"Mondzi": "sit-mnz",
"Mongo": "bnt-mon",
"Mongolik": "xgn",
"Mongolik Selatan": "xgn-sou",
"Mongolik Tengah": "xgn-cen",
"Monguor": "mjg",
"Monik": "mkh-mnc",
"Monumbo": "paa-mon",
"Mordvinik": "urj-mdv",
"Moru-Madi": "csu-mma",
"Moré": "nic-mre",
"Mruik": "sit-mru",
"Muji": "tbq-muj",
"Mumuye": "alv-mum",
"Mumuye-Yendang": "alv-mye",
"Muna-Buton": "poz-mun",
"Munda": "mun",
"Munji-Yidgha": "ira-mny",
"Mura": "sai-mur",
"Muria": "dra-mur",
"Muscogee": "nai-mus",
"Mwika": "bnt-mwi",
"Na-Dene": "xnd",
"Na-Togo": "alv-ntg",
"Nadahup": "sai-nad",
"Naga Tengah": "sit-aao",
"Naga Utara": "sit-kon",
"Nahua": "azc-nah",
"Nahuatl Durango": "azc-dur",
"Nahuatl Huasteca": "azc-hua",
"Naik": "sit-nax",
"Naish": "sit-nas",
"Nakh": "cau-nkh",
"Nalu": "alv-nal",
"Nambikwaran": "sai-nmk",
"Nambu": "paa-nam",
"Namla-Tofanma": "paa-nto",
"Nanaik": "tuw-nan",
"Nandi-Markweta": "sdv-nma",
"Nanga-Walo": "nic-nwa",
"Nasu": "tbq-nas",
"Navarro-Aragon": "roa-nar",
"Nawiki": "awd-nwk",
"Ndeiram": "ngf-nde",
"Ndu": "paa-ndu",
"Ndu Nuklear": "paa-nnd",
"Ndzem-Bomwali": "bnt-ndb",
"Nenets": "yrk",
"Neo-Aram Tengah": "sem-cna",
"Neo-Aram Timur Laut": "sem-nna",
"New Caledonia": "poz-cln",
"New South Wales Tengah": "aus-cww",
"Newarik": "sit-new",
"Ngalik-Nduga": "ngf-ngn",
"Ngayarda": "aus-nga",
"Ngbaka": "nic-ngk",
"Ngbaka Barat": "nic-nkw",
"Ngbaka Timur": "nic-nke",
"Ngbandi": "nic-ngd",
"Ngemba": "nic-nge",
"Ngkolmpu": "paa-ngk",
"Ngondi-Ngiri": "bnt-ngn",
"Nguni": "bnt-ngu",
"Nicobar": "aav-nic",
"Niger-Congo": "nic",
"Nilo-Sahara": "ssa",
"Nilotik": "sdv-nil",
"Nilotik Barat": "sdv-niw",
"Nilotik Selatan": "sdv-nis",
"Nilotik Timur": "sdv-nie",
"Nimboran": "paa-nim",
"Ninzik": "nic-nin",
"Niso": "tbq-nso",
"Nisu": "tbq-nis",
"Nkambe": "nic-nka",
"Nubian": "nub",
"Numi": "azc-num",
"Numugen": "ngf-num",
"Nun": "nic-nun",
"Nung": "sit-nng",
"Nupe-Gbagyi": "alv-ngb",
"Nupoid": "alv-nup",
"Nuristan Selatan": "nur-sou",
"Nuristan Utara": "nur-nor",
"Nuristani": "iir-nur",
"Nuru": "ngf-nur",
"Nusu": "tbq-nus",
"Nwa-Beng": "dmn-nbe",
"Nyali": "bnt-nya",
"Nyanga-Buyi": "bnt-nyb",
"Nyasa": "bnt-nys",
"Nyima": "sdv-nyi",
"Nyoro-Ganda": "bnt-nyg",
"Nyulnyulan": "aus-nyu",
"Nyun": "alv-nyn",
"Nzebi": "bnt-nze",
"Occitano-Romawi": "roa-ocr",
"Oceania": "poz-oce",
"Oceania Barat": "poz-ocw",
"Oceania Selatan": "poz-ocs",
"Oceania Tengah-Timur": "poz-occ",
"Oghur": "trk-ogr",
"Oghuz": "trk-ogz",
"Ogoni": "nic-ogo",
"Ok": "ngf-okk",
"Ok Barat": "ngf-wok",
"Ok Pergunungan": "ngf-mok",
"Ok Tanah Rendah": "ngf-lok",
"Ometo": "omv-ome",
"Ometo Timur": "omv-eom",
"Ometo Utara": "omv-nom",
"Omosan": "ngf-omo",
"Omotik": "omv",
"Ongan": "qfa-ong",
"Ormuri-Parachi": "ira-orp",
"Orokaivik": "ngf-oro",
"Osco-Umbria": "itc-sbl",
"Oti-Volta": "nic-ovo",
"Oti-Volta Barat": "nic-wov",
"Oti-Volta Timur": "nic-eov",
"Oto-Mangue": "omq",
"Oto-Pamean": "omq-otp",
"Otomacoan": "sai-otm",
"Otomi": "oto-otm",
"Otomian": "oto",
"Ottilien": "paa-ott",
"Ovambo": "bnt-ova",
"Oïl": "roa-oil",
"Pahari": "inc-pah",
"Pahari Barat": "him",
"Pahari Tengah": "inc-pac",
"Pahari Timur": "inc-pae",
"Pakanik": "mkh-pkn",
"Pakawan": "nai-pak",
"Palaihnihan": "nai-pal",
"Palaungik": "mkh-pal",
"Palei": "paa-pal",
"Pama": "aus-pmn",
"Pama-Nyunga": "aus-pam",
"Pama-Nyunga Barat Daya": "aus-psw",
"Pano": "sai-pan",
"Pano-Tacana": "sai-pat",
"Papel": "alv-pap",
"Papua": "paa",
"Para-Mongolik": "qfa-xgx",
"Pare": "bnt-par",
"Parji-Gadaba": "dra-pgd",
"Parukotoan": "sai-prk",
"Pashayi": "inc-pas",
"Pasifik Tengah": "poz-pcc",
"Pathan": "ira-pat",
"Pauwasi Barat": "paa-wpw",
"Pauwasi Timur": "paa-epw",
"Pearik": "mkh-pea",
"Peba-Yaguan": "sai-pey",
"Peka": "ngf-pek",
"Pekodian": "sai-pek",
"Pemong": "sai-pem",
"Pen-Uti Penara": "nai-plp",
"Pende": "bnt-pen",
"Pergunungan Ghana-Togo": "alv-gtm",
"Permik": "urj-prm",
"Pesisir Rai": "ngf-rai",
"Phla-Pherá": "alv-pph",
"Phowa": "tbq-phw",
"Phula Hilir": "tbq-drp",
"Phula Hulu": "tbq-urp",
"Phula Sungai": "tbq-rph",
"Phula Tanah Tinggi": "tbq-hph",
"Piawi": "paa-pia",
"Piman": "azc-pim",
"Pinghua": "zhx-pin",
"Plateau": "nic-plt",
"Plateau Selatan": "nic-pls",
"Plateau Tengah": "nic-plc",
"Plateau Timur": "nic-ple",
"Platoid": "nic-pla",
"Pnar-Khasi-Lyngngam": "aav-pkl",
"Polinesia": "poz-pol",
"Polinesia Nuklear": "poz-pnp",
"Polinesia Timur": "poz-pep",
"Pomerania": "zlw-pom",
"Pomo": "nai-pom",
"Pomo-Bomwali": "bnt-pob",
"Pomoikan": "ngf-pom",
"Popolocan": "omq-pop",
"Porapora": "paa-por",
"Potou-Tano": "alv-ptn",
"Pumpokolik": "qfa-ypm",
"Punjabik": "inc-pan",
"Qiangik": "sit-qia",
"Quechua": "qwe",
"Rajasthan": "raj",
"Ramu": "paa-ram",
"Ramu Bawah": "paa-lra",
"Rasawa-Saponi": "paa-rsa",
"Rashad": "nic-ras",
"Rgyalrongik": "sit-rgy",
"Rhaeto-Romawi": "roa-rhe",
"Ring": "nic-rng",
"Ring Barat": "nic-rnw",
"Ring Tengah": "nic-rnc",
"Ring Utara": "nic-rnn",
"Romani": "inc-rom",
"Romawi": "roa",
"Romawi Barat": "roa-wes",
"Romawi Dalmatia": "roa-dal",
"Romawi Selatan": "roa-sou",
"Romawi Timur": "roa-eas",
"Ruboni": "paa-rub",
"Rufiji-Ruvuma": "bnt-rur",
"Rukwa": "bnt-ruk",
"Rungwe": "bnt-run",
"Ruvu": "bnt-ruv",
"Ruvuma": "bnt-rvm",
"Ryukyu": "jpx-ryu",
"Ryukyu Selatan": "jpx-sry",
"Ryukyu Utara": "jpx-nry",
"Sabah": "poz-san",
"Sabaki": "bnt-sab",
"Sabakor": "ngf-sab",
"Sabi": "bnt-sbi",
"Sac-Fox-Kickapoo": "alg-sfk",
"Sadanik": "inc-sad",
"Sahaptian": "nai-shp",
"Sahara": "ssa-sah",
"Sahu": "paa-sah",
"Saka": "xsc-sak",
"Saka-Wakhi": "xsc-skw",
"Sal": "tbq-bkj",
"Salish": "sal",
"Saluan-Banggai": "poz-slb",
"Sama-Bajau": "poz-sbj",
"Samarokena-Airoran": "paa-saa",
"Sami": "smi",
"Samiah": "sem",
"Samiah Barat": "sem-wes",
"Samiah Barat Laut": "sem-nwe",
"Samiah Habsyah": "sem-eth",
"Samiah Tengah": "sem-cen",
"Samiah Timur": "sem-eas",
"Samo": "dmn-sam",
"Samogo": "dmn-smg",
"Samoyed": "syd",
"Samur": "cau-sam",
"Samur Barat": "cau-wsm",
"Samur Selatan": "cau-ssm",
"Samur Timur": "cau-esm",
"Sanglechi-Ishkashimi": "ira-sgi",
"Sankwep": "ngf-san",
"Sapa-Tai Barat Daya": "tai-sap",
"Sara": "csu-sar",
"Sarawak Utara": "poz-swa",
"Sarmata": "xsc-sar",
"Sau-Angal-Kewa": "ngf-sak",
"Savanna": "alv-sav",
"Sawabantu": "bnt-saw",
"Scythia": "xsc",
"Selkup": "sel",
"Sena": "bnt-sna",
"Senagi": "paa-sng",
"Senari": "alv-snr",
"Senegambia": "alv-sng",
"Sentani": "paa-sen",
"Senufo": "alv-snf",
"Sepik": "paa-sep",
"Sepik Bawah": "paa-lse",
"Serbi-Mongolik": "qfa-xgs",
"Sere": "nic-ser",
"Seuta": "bnt-seu",
"Shastan": "nai-shs",
"Shi-Havu": "bnt-shh",
"Shinaic": "inc-shn",
"Shirongolik": "xgn-shr",
"Shiroro": "nic-shi",
"Shona": "bnt-sho",
"Shughni-Roshani": "ira-shr",
"Shughni-Yazghulami": "ira-shy",
"Shughni-Yazghulami-Munji": "ira-sym",
"Siangik Raya": "sit-gsi",
"Siloid": "tbq-sil",
"Simbu": "ngf-sim",
"Sindhik": "inc-snd",
"Sinitik": "zhx",
"Sino-Bai": "sit-sba",
"Sino-Tibet": "sit",
"Sioux": "sio",
"Sioux Lembah Mississippi": "sio-msv",
"Sioux Lembah Ohio": "sio-ohv",
"Sioux Sungai Missouri": "sio-mor",
"Sioux-Catawba": "nai-sca",
"Sira": "bnt-sir",
"Sisaala": "nic-sis",
"Skandinavia Barat": "gmq-wes",
"Skandinavia Kepulauan": "gmq-ins",
"Skandinavia Timur": "gmq-eas",
"Sko": "paa-sko",
"Sko Pedalaman": "paa-isk",
"Slavey": "den",
"Slavik": "sla",
"Slavik Barat": "zlw",
"Slavik Selatan": "zls",
"Slavik Timur": "zle",
"Sogdik": "ira-sgc",
"Sogdo-Bactria": "ira-sbc",
"Sogeram": "ngf-sog",
"Sogeram Barat": "ngf-wso",
"Sogeram Timur": "ngf-eso",
"Sogeram Utara": "ngf-nso",
"Soko-Kele": "bnt-ske",
"Solomon Tenggara": "poz-sls",
"Somaloid": "cus-som",
"Songhay": "son",
"Soninke-Bobo": "dmn-snb",
"Sopac": "ngf-sop",
"Sorbia": "wen",
"Sotho-Tswana": "bnt-sts",
"South Bird's Head": "ngf-sbh",
"St. Matthias": "poz-stm",
"Strickland Timur": "ngf-est",
"Sudanik Tengah": "csu",
"Sudanik Tengah Timur": "csu-ecs",
"SudanikTimur": "sdv",
"SudanikTimur Utara": "sdv-nes",
"Sulawesi": "poz-clb",
"Sulawesi Selatan": "poz-ssw",
"Sumatera Barat Laut": "poz-nws",
"Sungai Bulaka": "paa-bul",
"Sungai Pahoturi": "paa-pah",
"Sungai Piore": "paa-pio",
"Supyire-Mamara": "alv-sma",
"Susu-Yalunka": "dmn-sya",
"Swahili": "bnt-swh",
"Ta-Arawak": "awd-taa",
"Tacanan": "sai-tac",
"Tagwana-Djimini": "alv-tdj",
"Tai": "tai",
"Tai Barat Daya": "tai-swe",
"Tai Chongzuo": "tai-cho",
"Tai Tengah": "tai-cen",
"Tai Utara": "tai-nor",
"Taikat-Awyi": "paa-taa",
"Tainae-Akoye": "ngf-taa",
"Tairora": "ngf-tai",
"Takama": "bnt-tkm",
"Takic": "azc-tak",
"Talodi": "alv-tal",
"Talodi-Heiban": "alv-the",
"Talu": "tbq-tal",
"Taman": "sdv-tmn",
"Tamangik": "sit-tam",
"Tamil-Kannada": "dra-tkn",
"Tamil-Kodagu": "dra-tkd",
"Tamil-Malayalam": "dra-tml",
"Tamiloid": "dra-tam",
"Tamolan": "paa-tam",
"Tangkhul-Maring": "sit-tma",
"Tangkhulik": "sit-tng",
"Tangkic": "aus-tnk",
"Tangko-Nakai": "ngf-tna",
"Tangsa-Nocte": "sit-tno",
"Tani": "sit-tan",
"Tano Tengah": "alv-ctn",
"Taracahitic": "azc-trc",
"Tarano": "sai-tar",
"Tarokoid": "nic-tar",
"Tasik Paniai": "ngf-pan",
"Tatik": "xme-ttc",
"Teberan": "paa-teb",
"Teke": "bnt-tek",
"Teke Tengah": "bnt-tkc",
"Teke-Mbede": "bnt-tmb",
"Teluguik": "dra-tel",
"Teluk Geelvink Timur": "paa-egb",
"Teluk Pedalaman": "paa-ing",
"Teluk Pedalaman Barat": "paa-wig",
"Temotu": "poz-tem",
"Tenda": "alv-ten",
"Tequistlatecan": "nai-tqn",
"Ternate-Tidore": "paa-tti",
"Teso-Turkana": "sdv-ttu",
"Tetela": "bnt-tet",
"Tharu": "inc-tha",
"Tibet-Burma": "tbq",
"Tibetik": "sit-tib",
"Tiboran": "ngf-tib",
"Ticuna-Yuri": "sai-tyu",
"Timor Timur": "paa-eti",
"Timor-Alor-Pantar": "paa-tap",
"Timorik": "poz-tim",
"Tiniguan": "sai-tin",
"Tirio": "paa-tir",
"Tivoid": "nic-tiv",
"Tivoid Tengah": "nic-tvc",
"Tivoid Utara": "nic-tvn",
"Toda-Kota": "dra-tkt",
"Tokharia": "ine-toc",
"Tomini-Tolitoli": "poz-tot",
"Tonda": "paa-ton",
"Tongik": "poz-ton",
"Tor": "paa-tor",
"Tor-Orya": "paa-too",
"Torricelli": "paa-trr",
"Totonacan": "nai-ttn",
"Totozoquean": "nai-tot",
"Trans-Fly Timur": "paa-etf",
"Trans-New Guinea": "ngf",
"Triqui": "omq-tri",
"Tsez": "cau-tsz",
"Tsez Barat": "cau-wts",
"Tsez Timur": "cau-ets",
"Tshangla": "sit-tsk",
"Tsimshian": "nai-tsi",
"Tsogo": "bnt-tso",
"Tswa-Ronga": "bnt-tsr",
"Tucanoan": "sai-tuc",
"Tujia": "sit-tja",
"Tulu-Koraga": "dra-tlk",
"Tungusik": "tuw",
"Tupi": "tup",
"Tupi-Guarani": "tup-gua",
"Turama-Kikori": "paa-tki",
"Turkik": "trk",
"Turkik Am": "trk-cmn",
"Turkik Siberia": "trk-sib",
"Turkik Siberia Selatan": "trk-ssb",
"Turkik Siberia Utara": "trk-nsb",
"Tuu": "khi-tuu",
"Tyrsenia": "qfa-tyn",
"Tày": "tai-tay",
"Ubangi": "nic-ubg",
"Udegheik": "tuw-udg",
"Ugriik": "urj-ugr",
"Uralik": "urj",
"Uru-Chipaya": "sai-ucp",
"Uruwa": "ngf-uru",
"Uti": "nai-utn",
"Uto-Aztek": "azc",
"Utu-Silopi": "ngf-usi",
"Vai-Kono": "dmn-vak",
"Vainakh": "cau-vay",
"Vale": "csu-val",
"Vanuatu Selatan": "poz-vns",
"Vanuatu Tengah": "poz-vnc",
"Vanuatu Utara": "poz-vnn",
"Vaskonik": "euq",
"Vietik": "mkh-vie",
"Volta-Congo": "nic-vco",
"Volta-Niger": "alv-von",
"Wahgi": "ngf-wah",
"Waja-Kam": "alv-wjk",
"Wakash": "wak",
"Walio": "paa-wal",
"Wantoat-Awara": "ngf-waa",
"Wantoatik": "ngf-wan",
"Wapei": "paa-wap",
"Wapei-Palei": "paa-wpa",
"Wara-Natyoro": "alv-wan",
"Waris": "paa-war",
"Warup": "ngf-war",
"Wee": "kro-wee",
"Wenma-Tai Barat Daya": "tai-wen",
"Wichí": "sai-wic",
"Wintuan": "nai-wtq",
"Witotoan": "sai-wit",
"Wojokesik": "ngf-woj",
"Worrorran": "aus-wor",
"Wotu-Wolio": "poz-wot",
"Wára-Kómnzo": "paa-wko",
"Xinca": "nai-xin",
"Yaganon": "ngf-yag",
"Yaka": "bnt-yak",
"Yali": "ngf-yal",
"Yam": "paa-yam",
"Yambasa": "nic-ymb",
"Yangmanic": "aus-yng",
"Yanomami": "sai-ynm",
"Yaqayik": "paa-yaq",
"Yareban": "ngf-yar",
"Yasa-Kombe": "bnt-yko",
"Yau-Nungon": "ngf-ynu",
"Yawa-Saweru": "paa-ysa",
"Yekhee": "alv-yek",
"Yenisei": "qfa-yen",
"Yidinyic": "aus-yid",
"Yok-Uti": "nai-you",
"Yokuts": "yok",
"Yolngu": "aus-yol",
"Yom-Nawdm": "nic-yon",
"Yoruba": "alv-yor",
"Yoruboid": "alv-yrd",
"Yuat": "paa-yua",
"Yue": "zhx-yue",
"Yuin-Kuri": "aus-yuk",
"Yukaghir": "qfa-yuk",
"Yuki": "nai-ykn",
"Yukpan": "sai-yuk",
"Yukubenik": "nic-ykb",
"Yuman-Cochimí": "nai-yuc",
"Yungur": "alv-yun",
"Yupik": "ypk",
"Yupna": "ngf-yup",
"Zamba-Binza": "bnt-zbi",
"Zamucoan": "sai-zam",
"Zan": "ccs-zan",
"Zande": "znd",
"Zaparo": "sai-zap",
"Zapotec": "omq-zpc",
"Zapotecan": "omq-zap",
"Zaza-Gorani": "ira-zgr",
"Zeme": "sit-zem",
"buatan": "art",
"bukan sekeluarga": "qfa-not",
"campuran": "qfa-mix",
"isyarat": "sgn",
"kreol": "qfa-cre",
"kreol atau pijin": "crp",
"pencilan": "qfa-iso",
"pertalian yang dipertikaikan": "qfa-dis",
"pijin": "qfa-pid",
"rGyalrongik Barat": "sit-wgy",
"rGyalrongik Timur": "sit-egy",
"sentuhan": "qfa-cnt",
"substratum": "qfa-sub",
"tidak dapat dikelaskan": "qfa-unc"
}
3949kr1io54pfqzem9wznpeofdwdlvp
Modul:families/code to canonical name.json
828
76131
373564
373527
2026-09-11T13:20:59Z
Hakimi97
2668
[[MediaWiki:UpdateLanguageNameAndCode.js|dikemas kini menggunakan gajet bahasa]]
373564
json
application/json
{
"aav": "Austroasia",
"aav-khs": "Khasi",
"aav-nic": "Nicobar",
"aav-pkl": "Pnar-Khasi-Lyngngam",
"afa": "Afroasia",
"alg": "Algonquin",
"alg-abp": "Abenaki-Penobscot",
"alg-ara": "Arapaho",
"alg-eas": "Algonquin Timur",
"alg-sfk": "Sac-Fox-Kickapoo",
"alv": "Atlantik-Congo",
"alv-aah": "Ayere-Ahan",
"alv-ada": "Adamawa",
"alv-bag": "Baga",
"alv-bak": "Bak",
"alv-bam": "Bambuka",
"alv-bny": "Banyum",
"alv-bua": "Bua",
"alv-bwj": "Bikwin-Jen",
"alv-cng": "Cangin",
"alv-ctn": "Tano Tengah",
"alv-dlt": "Edoid Delta",
"alv-dur": "Duru",
"alv-ede": "Ede",
"alv-edk": "Edekiri",
"alv-edo": "Edoid",
"alv-eeo": "Edo-Esan-Ora",
"alv-fli": "Fali",
"alv-fwo": "Fula-Wolof",
"alv-gbe": "Gbe",
"alv-gda": "Ga-Dangme",
"alv-gng": "Guang",
"alv-gtm": "Pergunungan Ghana-Togo",
"alv-hei": "Heiban",
"alv-ido": "Idomoid",
"alv-igb": "Igboid",
"alv-jfe": "Jola-Felupe",
"alv-jol": "Jola",
"alv-kim": "Kim",
"alv-kis": "Kissi",
"alv-krb": "Karaboro",
"alv-ktg": "Ka-Togo",
"alv-kul": "Kulango",
"alv-kwa": "Kwa",
"alv-lag": "Lagoon",
"alv-lek": "Leko",
"alv-lim": "Limba",
"alv-lni": "Leko-Nimbari",
"alv-mbd": "Mbum-Day",
"alv-mbm": "Mbum",
"alv-mel": "Mel",
"alv-mum": "Mumuye",
"alv-mye": "Mumuye-Yendang",
"alv-nal": "Nalu",
"alv-nce": "Edoid Utara-Tengah",
"alv-ngb": "Nupe-Gbagyi",
"alv-ntg": "Na-Togo",
"alv-nup": "Nupoid",
"alv-nwd": "Edoid Barat Laut",
"alv-nyn": "Nyun",
"alv-pap": "Papel",
"alv-pph": "Phla-Pherá",
"alv-ptn": "Potou-Tano",
"alv-sav": "Savanna",
"alv-sma": "Supyire-Mamara",
"alv-snf": "Senufo",
"alv-sng": "Senegambia",
"alv-snr": "Senari",
"alv-swd": "Edoid Barat Daya",
"alv-tal": "Talodi",
"alv-tdj": "Tagwana-Djimini",
"alv-ten": "Tenda",
"alv-the": "Talodi-Heiban",
"alv-von": "Volta-Niger",
"alv-wan": "Wara-Natyoro",
"alv-wjk": "Waja-Kam",
"alv-yek": "Yekhee",
"alv-yor": "Yoruba",
"alv-yrd": "Yoruboid",
"alv-yun": "Yungur",
"apa": "Apache",
"aqa": "Alacalufan",
"aql": "Algik",
"art": "buatan",
"ath": "Athabaska",
"ath-nor": "Athabaska Utara",
"ath-pco": "Athabaska Pesisir Pasifik",
"auf": "Arawa",
"aus-arn": "Arnhem",
"aus-bub": "Bunuba",
"aus-cww": "New South Wales Tengah",
"aus-dal": "Daly",
"aus-dyb": "Dyirbal",
"aus-gar": "Garawan",
"aus-gun": "Gunwinyguan",
"aus-jar": "Jarrakan",
"aus-kar": "Karnic",
"aus-mir": "Mirndi",
"aus-nga": "Ngayarda",
"aus-nyu": "Nyulnyulan",
"aus-pam": "Pama-Nyunga",
"aus-pmn": "Pama",
"aus-psw": "Pama-Nyunga Barat Daya",
"aus-rnd": "Arandic",
"aus-tnk": "Tangkic",
"aus-wdj": "Iwaidjan",
"aus-wor": "Worrorran",
"aus-yid": "Yidinyic",
"aus-yng": "Yangmanic",
"aus-yol": "Yolngu",
"aus-yuk": "Yuin-Kuri",
"awd": "Arawak",
"awd-nwk": "Nawiki",
"awd-taa": "Ta-Arawak",
"azc": "Uto-Aztek",
"azc-cup": "Cupan",
"azc-dur": "Nahuatl Durango",
"azc-hua": "Nahuatl Huasteca",
"azc-nah": "Nahua",
"azc-num": "Numi",
"azc-pim": "Piman",
"azc-tak": "Takic",
"azc-trc": "Taracahitic",
"bad": "Banda",
"bad-cnt": "Banda Tengah",
"bai": "Bamileke",
"bat": "Baltik",
"bat-eas": "Baltik Timur",
"bat-wes": "Baltik Barat",
"ber": "Barbar",
"bnt": "Bantu",
"bnt-baf": "Bafia",
"bnt-bbo": "Bafo-Bonkeng",
"bnt-bdz": "Boma-Dzing",
"bnt-bek": "Bekwilic",
"bnt-bki": "Bena-Kinga",
"bnt-bmo": "Bangi-Moi",
"bnt-bne": "Bantu Timur Laut",
"bnt-bnm": "Bangi-Ntomba",
"bnt-boa": "Boan",
"bnt-bot": "Botatwe",
"bnt-bsa": "Basaa",
"bnt-bsh": "Bushoong",
"bnt-bso": "Bantu Selatan",
"bnt-bta": "Bati-Angba",
"bnt-btb": "Beti",
"bnt-bte": "Bangi-Tetela",
"bnt-bun": "Buja-Ngombe",
"bnt-chg": "Chaga",
"bnt-cht": "Chaga-Taita",
"bnt-clu": "Chokwe-Luchazi",
"bnt-com": "Comoros",
"bnt-glb": "Bantu Tasik-Tasik Besar",
"bnt-haj": "Haya-Jita",
"bnt-kak": "Kako",
"bnt-kav": "Kavango",
"bnt-kbi": "Komo-Bira",
"bnt-kel": "Kele",
"bnt-kil": "Kilombero",
"bnt-kka": "Kikuyu-Kamba",
"bnt-kmb": "Kimbundu",
"bnt-kng": "Kongo",
"bnt-kpw": "Kpwe",
"bnt-ksb": "Kavango-Bantu Barat Daya",
"bnt-kts": "Kele-Tsogo",
"bnt-lbn": "Luban",
"bnt-leb": "Lebonya",
"bnt-lgb": "Lega-Binja",
"bnt-lok": "Logooli-Kuria",
"bnt-lub": "Luba",
"bnt-lun": "Lunda",
"bnt-mak": "Makua",
"bnt-mbb": "Mboshi-Buja",
"bnt-mbe": "Mbole-Enya",
"bnt-mbi": "Mbinga",
"bnt-mbo": "Mboshi",
"bnt-mbt": "Mbete",
"bnt-mby": "Mbeya",
"bnt-mij": "Mijikenda",
"bnt-mka": "Makaa",
"bnt-mne": "Manenguba",
"bnt-mnj": "Makaa-Njem",
"bnt-mon": "Mongo",
"bnt-mra": "Mbugwe-Rangi",
"bnt-msl": "Masaba-Luhya",
"bnt-mwi": "Mwika",
"bnt-ncb": "Bantu Pesisir Timur Laut",
"bnt-ndb": "Ndzem-Bomwali",
"bnt-ngn": "Ngondi-Ngiri",
"bnt-ngu": "Nguni",
"bnt-nya": "Nyali",
"bnt-nyb": "Nyanga-Buyi",
"bnt-nyg": "Nyoro-Ganda",
"bnt-nys": "Nyasa",
"bnt-nze": "Nzebi",
"bnt-ova": "Ovambo",
"bnt-par": "Pare",
"bnt-pen": "Pende",
"bnt-pob": "Pomo-Bomwali",
"bnt-ruk": "Rukwa",
"bnt-run": "Rungwe",
"bnt-rur": "Rufiji-Ruvuma",
"bnt-ruv": "Ruvu",
"bnt-rvm": "Ruvuma",
"bnt-sab": "Sabaki",
"bnt-saw": "Sawabantu",
"bnt-sbi": "Sabi",
"bnt-seu": "Seuta",
"bnt-shh": "Shi-Havu",
"bnt-sho": "Shona",
"bnt-sir": "Sira",
"bnt-ske": "Soko-Kele",
"bnt-sna": "Sena",
"bnt-sts": "Sotho-Tswana",
"bnt-swb": "Bantu Barat Daya",
"bnt-swh": "Swahili",
"bnt-tek": "Teke",
"bnt-tet": "Tetela",
"bnt-tkc": "Teke Tengah",
"bnt-tkm": "Takama",
"bnt-tmb": "Teke-Mbede",
"bnt-tso": "Tsogo",
"bnt-tsr": "Tswa-Ronga",
"bnt-yak": "Yaka",
"bnt-yko": "Yasa-Kombe",
"bnt-zbi": "Zamba-Binza",
"btk": "Batak",
"cau-abz": "Abkhaz-Abaza",
"cau-and": "Andi",
"cau-ava": "Avar-Andi",
"cau-cir": "Circassia",
"cau-drg": "Dargwa",
"cau-esm": "Samur Timur",
"cau-ets": "Tsez Timur",
"cau-lzg": "Lezghi",
"cau-nec": "Kaukasus Timur Laut",
"cau-nkh": "Nakh",
"cau-nwc": "Kaukasus Barat Laut",
"cau-sam": "Samur",
"cau-ssm": "Samur Selatan",
"cau-tsz": "Tsez",
"cau-vay": "Vainakh",
"cau-wsm": "Samur Barat",
"cau-wts": "Tsez Barat",
"cba": "Chibcha",
"ccs": "Kartvelia",
"ccs-gzn": "Georgia-Zan",
"ccs-zan": "Zan",
"cdc": "Chadik",
"cdc-cbm": "Chadik Tengah",
"cdc-est": "Chad Timur",
"cdc-mas": "Masa",
"cdc-wst": "Chadik Barat",
"cdd": "Caddo",
"cel": "Keltik",
"cel-brs": "Brythonik Barat Daya",
"cel-brw": "Brythonik Barat",
"cel-bry": "Brythonik",
"cel-gae": "Goidelik",
"cel-his": "Hispano-Keltik",
"cel-ins": "Keltik Kepulauan",
"chi": "Chimakuan",
"chm": "Mari",
"cmc": "Chamik",
"crp": "kreol atau pijin",
"csu": "Sudanik Tengah",
"csu-bba": "Bongo-Bagirmi",
"csu-bbk": "Bongo-Baka",
"csu-bgr": "Bagirmi",
"csu-bkr": "Birri-Kresh",
"csu-ecs": "Sudanik Tengah Timur",
"csu-kab": "Kaba",
"csu-lnd": "Lendu",
"csu-maa": "Mangbetu",
"csu-mle": "Mangbutu-Lese",
"csu-mma": "Moru-Madi",
"csu-sar": "Sara",
"csu-val": "Vale",
"cus": "Kushitik",
"cus-cen": "Kushitik Tengah",
"cus-eas": "Kushitik Timur",
"cus-hec": "Kushitik Timur Tanah Tinggi",
"cus-som": "Somaloid",
"cus-sou": "Kushitik Selatan",
"day": "Dayak Darat",
"del": "Lenape",
"den": "Slavey",
"dmn": "Mande",
"dmn-bbu": "Bisa-Busa",
"dmn-emn": "Manding Timur",
"dmn-jje": "Jogo-Jeri",
"dmn-man": "Manding",
"dmn-mda": "Mano-Dan",
"dmn-mdc": "Mande Tengah",
"dmn-mde": "Mande Timur",
"dmn-mdw": "Mande Barat",
"dmn-mjo": "Manding-Jogo",
"dmn-mmo": "Manding-Mokole",
"dmn-mnk": "Maninka",
"dmn-mnw": "Mande Barat Laut",
"dmn-mok": "Mokole",
"dmn-mse": "Mande Tenggara",
"dmn-msw": "Mande Barat Daya",
"dmn-mva": "Manding-Vai",
"dmn-nbe": "Nwa-Beng",
"dmn-sam": "Samo",
"dmn-smg": "Samogo",
"dmn-snb": "Soninke-Bobo",
"dmn-sya": "Susu-Yalunka",
"dmn-vak": "Vai-Kono",
"dmn-wmn": "Manding Barat",
"dra": "Dravidia",
"dra-cen": "Dravidia Tengah",
"dra-gki": "Gondi-Kui",
"dra-gon": "Gondi",
"dra-imd": "Irula-Muduga",
"dra-kan": "Kannadoid",
"dra-kki": "Konda-Kui",
"dra-kml": "Kurux-Malto",
"dra-knk": "Kolami-Naiki",
"dra-kod": "Kodagu",
"dra-kor": "Koraga",
"dra-mal": "Malayalamoid",
"dra-mdy": "Madiya",
"dra-mlo": "Malto",
"dra-mur": "Muria",
"dra-nor": "Dravidia Utara",
"dra-pgd": "Parji-Gadaba",
"dra-sdo": "Dravidia Selatan I",
"dra-sdt": "Dravidia Selatan II",
"dra-sou": "Dravidia Selatan",
"dra-tam": "Tamiloid",
"dra-tel": "Teluguik",
"dra-tkd": "Tamil-Kodagu",
"dra-tkn": "Tamil-Kannada",
"dra-tkt": "Toda-Kota",
"dra-tlk": "Tulu-Koraga",
"dra-tml": "Tamil-Malayalam",
"egx": "Mesir",
"ero": "Horpa",
"esx": "Eskimo-Aleut",
"esx-esk": "Eskimo",
"esx-inu": "Inuit",
"euq": "Vaskonik",
"gba": "Gbaya",
"gba-eas": "Gbaya Timur",
"gba-sou": "Gbaya Selatan",
"gba-wes": "Gbaya Barat",
"gem": "Jermanik",
"gio": "Gelao",
"gme": "Jermanik Timur",
"gmq": "Jermanik Utara",
"gmq-eas": "Skandinavia Timur",
"gmq-ins": "Skandinavia Kepulauan",
"gmq-wes": "Skandinavia Barat",
"gmw": "Jermanik Barat",
"gmw-afr": "Anglo-Frisia",
"gmw-ang": "Anglia",
"gmw-fri": "Frisia",
"gmw-frk": "Franconia Tanah Rendah",
"gmw-hgm": "Jerman Tanah Tinggi",
"gmw-ian": "Anglo-Norman Ireland",
"gmw-lgm": "Jerman Tanah Rendah",
"gmw-nsg": "Jermanik Laut Utara",
"gn": "Guarani",
"grb": "Grebo tepat",
"grk": "Hellenik",
"him": "Pahari Barat",
"hmn": "Hmongik",
"hmx": "Hmong-Mien",
"hmx-mie": "Mienik",
"hok": "Hokan",
"hyx": "Armenia",
"iir": "Indo-Iran",
"iir-nur": "Nuristani",
"ijo": "Ijoid",
"inc": "Indo-Arya",
"inc-bas": "Benggali–Assam",
"inc-bhi": "Bhil",
"inc-bih": "Bihar",
"inc-cen": "Indo-Arya Tengah",
"inc-chi": "Chitral",
"inc-dar": "Dardik",
"inc-dng": "Dangari",
"inc-dre": "Dardik Timur",
"inc-eas": "Indo-Arya Timur",
"inc-hal": "Halbik",
"inc-hie": "Hindi Timur",
"inc-hiw": "Hindi Barat",
"inc-hnd": "Hindustan",
"inc-ins": "Indo-Arya Kepulauan",
"inc-kas": "Kashmirik",
"inc-koh": "Kohistani",
"inc-krd": "Bahasa-bahasa KRDS",
"inc-kun": "Kunar",
"inc-mid": "Indo-Arya Tengah",
"inc-nor": "Indo-Arya Utara",
"inc-nwe": "Indo-Arya Barat Laut",
"inc-old": "Indo-Arya Kuno",
"inc-pac": "Pahari Tengah",
"inc-pae": "Pahari Timur",
"inc-pah": "Pahari",
"inc-pan": "Punjabik",
"inc-pas": "Pashayi",
"inc-rom": "Romani",
"inc-sad": "Sadanik",
"inc-shn": "Shinaic",
"inc-snd": "Sindhik",
"inc-sou": "Indo-Arya Selatan",
"inc-tha": "Tharu",
"inc-wes": "Indo-Arya Barat",
"ine": "Indo-Eropah",
"ine-ana": "Anatolia",
"ine-bsl": "Balto-Slavik",
"ine-luw": "Luwik",
"ine-toc": "Tokharia",
"ira": "Iran",
"ira-cen": "Iran Pusat",
"ira-csp": "Caspia",
"ira-kms": "Komisenia",
"ira-lur": "Lurik",
"ira-mid": "Iran Tengah",
"ira-mny": "Munji-Yidgha",
"ira-mpr": "Medo-Parthia",
"ira-msh": "Mazanderani-Shahmirzadi",
"ira-nei": "Iran Timur Laut",
"ira-nwi": "Iran Barat Laut",
"ira-old": "Iran Kuno",
"ira-orp": "Ormuri-Parachi",
"ira-pat": "Pathan",
"ira-sbc": "Sogdo-Bactria",
"ira-sei": "Iran Tenggara",
"ira-sgc": "Sogdik",
"ira-sgi": "Sanglechi-Ishkashimi",
"ira-shr": "Shughni-Roshani",
"ira-shy": "Shughni-Yazghulami",
"ira-swi": "Iran Barat Daya",
"ira-sym": "Shughni-Yazghulami-Munji",
"ira-wes": "Iran Barat",
"ira-zgr": "Zaza-Gorani",
"iro": "Iroquois",
"iro-nor": "Iroquois Utara",
"itc": "Italik",
"itc-laf": "Latino-Falisci",
"itc-sbl": "Osco-Umbria",
"jpx": "Jepunik",
"jpx-nry": "Ryukyu Utara",
"jpx-ryu": "Ryukyu",
"jpx-sry": "Ryukyu Selatan",
"kar": "Karen",
"kca": "Khanty",
"khi-kal": "Khoe Kalahari",
"khi-khk": "Khoekhoe",
"khi-kho": "Khoe",
"khi-kkw": "Khoe-Kwadi",
"khi-kxa": "Kx'a",
"khi-tuu": "Tuu",
"kro": "Kru",
"kro-aiz": "Aizi",
"kro-bet": "Bété",
"kro-did": "Dida",
"kro-ekr": "Kru Timur",
"kro-grb": "Grebo",
"kro-wee": "Wee",
"kro-wkr": "Kru Barat",
"ku": "Kurdi",
"kv": "Komi",
"map": "Austronesia",
"map-ata": "Atayalik",
"mjg": "Monguor",
"mkh": "Mon-Khmer",
"mkh-asl": "Asli",
"mkh-ban": "Bahnarik",
"mkh-kat": "Katuik",
"mkh-khm": "Khmuik",
"mkh-kmr": "Khmerik",
"mkh-mnc": "Monik",
"mkh-mng": "Mangik",
"mkh-nbn": "Bahnarik Utara",
"mkh-pal": "Palaungik",
"mkh-pea": "Pearik",
"mkh-pkn": "Pakanik",
"mkh-vie": "Vietik",
"mno": "Manobo",
"mns": "Mansi",
"mun": "Munda",
"myn": "Maya",
"nai-cat": "Catawba",
"nai-chu": "Chumashan",
"nai-ckn": "Chinook",
"nai-coo": "Coosan",
"nai-jcq": "Jicaquean",
"nai-ker": "Keresan",
"nai-klp": "Kalapuyan",
"nai-kta": "Kiowa-Tanoan",
"nai-len": "Lenca",
"nai-mdu": "Maiduan",
"nai-min": "Misumalpa",
"nai-miz": "Mixe-Zoque",
"nai-mus": "Muscogee",
"nai-pak": "Pakawan",
"nai-pal": "Palaihnihan",
"nai-plp": "Pen-Uti Penara",
"nai-pom": "Pomo",
"nai-sca": "Sioux-Catawba",
"nai-shp": "Sahaptian",
"nai-shs": "Shastan",
"nai-tot": "Totozoquean",
"nai-tqn": "Tequistlatecan",
"nai-tsi": "Tsimshian",
"nai-ttn": "Totonacan",
"nai-utn": "Uti",
"nai-wtq": "Wintuan",
"nai-xin": "Xinca",
"nai-ykn": "Yuki",
"nai-you": "Yok-Uti",
"nai-yuc": "Yuman-Cochimí",
"ngf": "Trans-New Guinea",
"ngf-ais": "Aisian",
"ngf-ang": "Angan",
"ngf-ank": "Angal-Kewa",
"ngf-ask": "Asmat-Kamoro",
"ngf-asm": "Asmat",
"ngf-ata": "Ankave-Tainae-Akoye",
"ngf-awd": "Awyu-Dumut",
"ngf-awy": "Awyu",
"ngf-bda": "Becking-Dawi",
"ngf-bin": "Binanderean",
"ngf-boa": "Boane",
"ngf-bos": "Bosavi",
"ngf-bsi": "Baruya-Simbari",
"ngf-cda": "Dani Tengah",
"ngf-chw": "Chimbu-Wahgi",
"ngf-dag": "Dagan",
"ngf-dal": "Dallman",
"ngf-dan": "Dani",
"ngf-dum": "Dumut",
"ngf-ehu": "Huon Timur",
"ngf-eku": "Kutubuan Timur",
"ngf-enc": "Engik",
"ngf-eng": "Engan",
"ngf-era": "Erap",
"ngf-eso": "Sogeram Timur",
"ngf-est": "Strickland Timur",
"ngf-eva": "Evapia",
"ngf-fgi": "Fore-Gimi",
"ngf-fhu": "Finisterre-Huon",
"ngf-fin": "Finisterre",
"ngf-gah": "Gahuku",
"ngf-gau": "Gauwa",
"ngf-gaw": "Awyu Raya",
"ngf-gbi": "Binanderean Raya",
"ngf-gko": "Gaena-Korafe",
"ngf-gmo": "Gusap-Mot",
"ngf-gor": "Goroka",
"ngf-gsu": "Gogodala-Suki",
"ngf-gum": "Gum",
"ngf-gvd": "Dani Lembah Besar",
"ngf-hag": "Hagen",
"ngf-han": "Hanseman",
"ngf-huo": "Huon",
"ngf-jim": "Jimi",
"ngf-kab": "Kabwum",
"ngf-kai": "Kainantu",
"ngf-kak": "Kalam-Kobon",
"ngf-kau": "Kaukombar",
"ngf-kbm": "Kosorong-Burum-Mindik",
"ngf-kgo": "Kainantu-Goroka",
"ngf-khu": "Kewa-Huli",
"ngf-kma": "Kâte-Mape",
"ngf-kme": "Kapau-Menya",
"ngf-koi": "Koiarian",
"ngf-kok": "Kokon",
"ngf-kow": "Kowan",
"ngf-ksa": "Kalam-Adelbert Selatan",
"ngf-kto": "Kube-Tobo",
"ngf-kts": "Komyandaret-Tsaukambo",
"ngf-kum": "Kumil",
"ngf-kya": "Kamano-Yagaria",
"ngf-lok": "Ok Tanah Rendah",
"ngf-mab": "Mabuso",
"ngf-mad": "Madang",
"ngf-mek": "Mek",
"ngf-min": "Mindjim",
"ngf-mok": "Ok Pergunungan",
"ngf-mom": "Mombum",
"ngf-msu": "Mian-Suganga",
"ngf-nad": "Adelbert Utara",
"ngf-nbi": "Binanderean Utara",
"ngf-nde": "Ndeiram",
"ngf-ngn": "Ngalik-Nduga",
"ngf-nso": "Sogeram Utara",
"ngf-num": "Numugen",
"ngf-nur": "Nuru",
"ngf-nwh": "Hanseman Barat Laut",
"ngf-oen": "Engan Luar",
"ngf-okk": "Ok",
"ngf-omo": "Omosan",
"ngf-oro": "Orokaivik",
"ngf-pan": "Tasik Paniai",
"ngf-pek": "Peka",
"ngf-pom": "Pomoikan",
"ngf-rai": "Pesisir Rai",
"ngf-sab": "Sabakor",
"ngf-sad": "Adelbert Selatan",
"ngf-sak": "Sau-Angal-Kewa",
"ngf-san": "Sankwep",
"ngf-sbh": "South Bird's Head",
"ngf-sim": "Simbu",
"ngf-sog": "Sogeram",
"ngf-sop": "Sopac",
"ngf-taa": "Tainae-Akoye",
"ngf-tai": "Tairora",
"ngf-tib": "Tiboran",
"ngf-tna": "Tangko-Nakai",
"ngf-uru": "Uruwa",
"ngf-usi": "Utu-Silopi",
"ngf-waa": "Wantoat-Awara",
"ngf-wah": "Wahgi",
"ngf-wan": "Wantoatik",
"ngf-war": "Warup",
"ngf-woj": "Wojokesik",
"ngf-wok": "Ok Barat",
"ngf-wso": "Sogeram Barat",
"ngf-yag": "Yaganon",
"ngf-yal": "Yali",
"ngf-yar": "Yareban",
"ngf-ynu": "Yau-Nungon",
"ngf-yup": "Yupna",
"nic": "Niger-Congo",
"nic-alu": "Alumik",
"nic-bas": "Basa",
"nic-bbe": "Beboid Timur",
"nic-bco": "Benue-Congo",
"nic-bcr": "Bantoid-Cross",
"nic-bdn": "Bantoid Utara",
"nic-bds": "Bantoid Selatan",
"nic-beb": "Beboid",
"nic-ben": "Bendi",
"nic-beo": "Beromik",
"nic-bod": "Bantoid",
"nic-buk": "Buli-Koma",
"nic-bwa": "Bwa",
"nic-cde": "Delta Tengah",
"nic-cri": "Cross River",
"nic-dag": "Dagbani",
"nic-dak": "Dakoid",
"nic-dge": "Escarpment Dogon",
"nic-dgw": "Dogon Barat",
"nic-eko": "Ekoid",
"nic-eov": "Oti-Volta Timur",
"nic-fru": "Furu",
"nic-gne": "Gurunsi Timur",
"nic-gnn": "Gurunsi Utara",
"nic-gns": "Gurunsi",
"nic-gnw": "Gurunsi Barat",
"nic-gre": "Grassfields Timur",
"nic-grf": "Grassfields",
"nic-grm": "Gurma",
"nic-grs": "Grassfields Barat Daya",
"nic-gur": "Gur",
"nic-ief": "Ibibio-Efik",
"nic-jer": "Jera",
"nic-jkn": "Jukunoid",
"nic-jrn": "Jarawan",
"nic-jrw": "Jarawa",
"nic-kam": "Kambari",
"nic-kau": "Kauru",
"nic-kmk": "Kamuku",
"nic-kne": "Kainji Timur",
"nic-knj": "Kainji",
"nic-knn": "Kainji Barat Laut",
"nic-ktl": "Katloid",
"nic-lcr": "Cross River Hilir",
"nic-mam": "Mamfe",
"nic-mba": "Mbam",
"nic-mbc": "Mba",
"nic-mbw": "Mbam Barat",
"nic-mmb": "Mambiloid",
"nic-mom": "Momo",
"nic-mre": "Moré",
"nic-ngd": "Ngbandi",
"nic-nge": "Ngemba",
"nic-ngk": "Ngbaka",
"nic-nin": "Ninzik",
"nic-nka": "Nkambe",
"nic-nkb": "Baka",
"nic-nke": "Ngbaka Timur",
"nic-nkg": "Gbanziri",
"nic-nkk": "Kpala",
"nic-nkm": "Mbaka",
"nic-nkw": "Ngbaka Barat",
"nic-npd": "Dogon Penara Utara",
"nic-nun": "Nun",
"nic-nwa": "Nanga-Walo",
"nic-ogo": "Ogoni",
"nic-ovo": "Oti-Volta",
"nic-pla": "Platoid",
"nic-plc": "Plateau Tengah",
"nic-pld": "Dogon Dataran",
"nic-ple": "Plateau Timur",
"nic-pls": "Plateau Selatan",
"nic-plt": "Plateau",
"nic-ras": "Rashad",
"nic-rnc": "Ring Tengah",
"nic-rng": "Ring",
"nic-rnn": "Ring Utara",
"nic-rnw": "Ring Barat",
"nic-ser": "Sere",
"nic-shi": "Shiroro",
"nic-sis": "Sisaala",
"nic-tar": "Tarokoid",
"nic-tiv": "Tivoid",
"nic-tvc": "Tivoid Tengah",
"nic-tvn": "Tivoid Utara",
"nic-ubg": "Ubangi",
"nic-uce": "Cross River Hulu Timur-Barat",
"nic-ucn": "Cross River Hulu Utara-Selatan",
"nic-ucr": "Cross River Hulu",
"nic-vco": "Volta-Congo",
"nic-wov": "Oti-Volta Barat",
"nic-ykb": "Yukubenik",
"nic-ymb": "Yambasa",
"nic-yon": "Yom-Nawdm",
"njo": "Ao",
"nub": "Nubian",
"nub-hil": "Hill Nubian",
"nur-nor": "Nuristan Utara",
"nur-sou": "Nuristan Selatan",
"omq": "Oto-Mangue",
"omq-cha": "Chatino",
"omq-chi": "Chinantecan",
"omq-cui": "Cuicatec",
"omq-maz": "Mazatecan",
"omq-mix": "Mixtecan",
"omq-mxt": "Mixtec",
"omq-otp": "Oto-Pamean",
"omq-pop": "Popolocan",
"omq-tri": "Triqui",
"omq-zap": "Zapotecan",
"omq-zpc": "Zapotec",
"omv": "Omotik",
"omv-aro": "Aroid",
"omv-diz": "Dizoid",
"omv-eom": "Ometo Timur",
"omv-gon": "Gonga",
"omv-mao": "Mao",
"omv-nom": "Ometo Utara",
"omv-ome": "Ometo",
"oto": "Otomian",
"oto-otm": "Otomi",
"paa": "Papua",
"paa-aia": "Aian",
"paa-alp": "Alor-Pantar",
"paa-amu": "Amto-Musan",
"paa-ani": "Anim",
"paa-ara": "Arapesh",
"paa-arf": "Arafundi",
"paa-ata": "Ataitan",
"paa-baa": "Bayono-Awbono",
"paa-bai": "Baining",
"paa-baw": "Bosngun-Awar",
"paa-bew": "Bewani",
"paa-boa": "Boazi",
"paa-bor": "Border",
"paa-bul": "Sungai Bulaka",
"paa-bvi": "Betaf-Vitou",
"paa-clp": "Dataran Tasik Tengah",
"paa-dtu": "Doso-Turumsa",
"paa-ebh": "Kepala Burung Timur",
"paa-eel": "Eleman Timur",
"paa-egb": "Teluk Geelvink Timur",
"paa-eke": "Keram Timur",
"paa-ele": "Eleman",
"paa-elp": "Dataran Tasik Timur",
"paa-epw": "Pauwasi Timur",
"paa-etf": "Trans-Fly Timur",
"paa-eti": "Timor Timur",
"paa-fas": "Fas",
"paa-flp": "Dataran Tasik Barat Jauh",
"paa-gkw": "Kwerba Raya",
"paa-gto": "Galela-Tobelo",
"paa-hya": "Heyo-Yahang",
"paa-ing": "Teluk Pedalaman",
"paa-isk": "Sko Pedalaman",
"paa-iwa": "Iwam",
"paa-kae": "Kamula-Elevala",
"paa-kan": "Kanum",
"paa-kay": "Kayagarik",
"paa-ker": "Keram",
"paa-kiw": "Kiwaian",
"paa-kko": "Kaure-Kosare",
"paa-koa": "Kombio-Arapesh",
"paa-kol": "Kolopom",
"paa-kom": "Kombio",
"paa-kun": "Kunimaipan",
"paa-kwa": "Kwalean",
"paa-kwe": "Kwerba tepat",
"paa-kwo": "Kwomtari",
"paa-lla": "Loloda-Laba",
"paa-lma": "May Kiri",
"paa-lmu": "Lepki-Murkim",
"paa-lpl": "Dataran Tasik",
"paa-lra": "Ramu Bawah",
"paa-lse": "Sepik Bawah",
"paa-mai": "Mairasi",
"paa-mal": "Mailuan",
"paa-mam": "Maimai",
"paa-man": "Manubaran",
"paa-mar": "Marienberg",
"paa-may": "Maybratik",
"paa-mbi": "Mbaham-Iha",
"paa-mby": "Marind-Boazi-Yaqay",
"paa-mmu": "Mandi-Muniwara",
"paa-mon": "Monumbo",
"paa-mri": "Marindik",
"paa-nam": "Nambu",
"paa-nbo": "Bougainville Utara",
"paa-ndu": "Ndu",
"paa-ngk": "Ngkolmpu",
"paa-nha": "Halmahera Utara",
"paa-nim": "Nimboran",
"paa-nnd": "Ndu Nuklear",
"paa-nnh": "Halmahera Utara Bahagian Utara",
"paa-nto": "Namla-Tofanma",
"paa-ott": "Ottilien",
"paa-pah": "Sungai Pahoturi",
"paa-pal": "Palei",
"paa-pia": "Piawi",
"paa-pio": "Sungai Piore",
"paa-por": "Porapora",
"paa-ram": "Ramu",
"paa-rsa": "Rasawa-Saponi",
"paa-rub": "Ruboni",
"paa-saa": "Samarokena-Airoran",
"paa-sah": "Sahu",
"paa-sbo": "Bougainville Selatan",
"paa-sen": "Sentani",
"paa-sep": "Sepik",
"paa-shi": "Bukit Serra",
"paa-sko": "Sko",
"paa-sng": "Senagi",
"paa-taa": "Taikat-Awyi",
"paa-tam": "Tamolan",
"paa-tap": "Timor-Alor-Pantar",
"paa-teb": "Teberan",
"paa-tir": "Tirio",
"paa-tki": "Turama-Kikori",
"paa-ton": "Tonda",
"paa-too": "Tor-Orya",
"paa-tor": "Tor",
"paa-trr": "Torricelli",
"paa-tti": "Ternate-Tidore",
"paa-wal": "Walio",
"paa-wap": "Wapei",
"paa-war": "Waris",
"paa-wbh": "Kepala Burung Barat",
"paa-wel": "Eleman Barat",
"paa-wig": "Teluk Pedalaman Barat",
"paa-wke": "Keram Barat",
"paa-wko": "Wára-Kómnzo",
"paa-wlp": "Dataran Tasik Barat",
"paa-wpa": "Wapei-Palei",
"paa-wpw": "Pauwasi Barat",
"paa-yam": "Yam",
"paa-yaq": "Yaqayik",
"paa-ysa": "Yawa-Saweru",
"paa-yua": "Yuat",
"phi": "Filipina",
"phi-kal": "Kalamian",
"poz": "Melayu-Polinesia",
"poz-aay": "Kepulauan Admiralty",
"poz-bnn": "Borneo Utara",
"poz-bre": "Barito Timur",
"poz-brw": "Barito Barat",
"poz-bss": "Bali-Sasak-Sumbawa",
"poz-btk": "Bungku-Tolaki",
"poz-cet": "Melayu-Polinesia Tengah-Timur",
"poz-clb": "Sulawesi",
"poz-cln": "New Caledonia",
"poz-cma": "Maluku Tengah",
"poz-hce": "Halmahera-Cenderawasih",
"poz-kal": "Kaili-Pamona",
"poz-lgx": "Lampungik",
"poz-mcm": "Melayu-Chamik",
"poz-mic": "Mikronesia",
"poz-mly": "Melayik",
"poz-msa": "Melayu-Sumbawa",
"poz-mun": "Muna-Buton",
"poz-nws": "Sumatera Barat Laut",
"poz-occ": "Oceania Tengah-Timur",
"poz-oce": "Oceania",
"poz-ocs": "Oceania Selatan",
"poz-ocw": "Oceania Barat",
"poz-pcc": "Pasifik Tengah",
"poz-pep": "Polinesia Timur",
"poz-pnp": "Polinesia Nuklear",
"poz-pol": "Polinesia",
"poz-san": "Sabah",
"poz-sbj": "Sama-Bajau",
"poz-slb": "Saluan-Banggai",
"poz-sls": "Solomon Tenggara",
"poz-ssw": "Sulawesi Selatan",
"poz-stm": "St. Matthias",
"poz-swa": "Sarawak Utara",
"poz-tem": "Temotu",
"poz-tim": "Timorik",
"poz-ton": "Tongik",
"poz-tot": "Tomini-Tolitoli",
"poz-vnc": "Vanuatu Tengah",
"poz-vnn": "Vanuatu Utara",
"poz-vns": "Vanuatu Selatan",
"poz-wot": "Wotu-Wolio",
"pqe": "Melayu-Polinesia Timur",
"qfa-adc": "Andaman Raya Tengah",
"qfa-adm": "Andaman Raya",
"qfa-adn": "Andaman Raya Utara",
"qfa-ads": "Andaman Raya Selatan",
"qfa-ain": "Ainuik",
"qfa-bej": "Be-Jizhao",
"qfa-bet": "Be-Tai",
"qfa-buy": "Buyang",
"qfa-cka": "Chukotka-Kamchatka",
"qfa-ckn": "Chukotka",
"qfa-cnt": "sentuhan",
"qfa-cre": "kreol",
"qfa-dgn": "Dogon",
"qfa-dis": "pertalian yang dipertikaikan",
"qfa-dny": "Dene-Yenisei",
"qfa-hur": "Hurro-Urartian",
"qfa-iso": "pencilan",
"qfa-kad": "Kadu",
"qfa-kms": "Kam-Sui",
"qfa-kor": "Koreanik",
"qfa-kra": "Kra",
"qfa-lic": "Hlai",
"qfa-mch": "Makro-Chibcha",
"qfa-mix": "campuran",
"qfa-not": "bukan sekeluarga",
"qfa-onb": "Be",
"qfa-ong": "Ongan",
"qfa-pid": "pijin",
"qfa-sub": "substratum",
"qfa-tak": "Kra-Dai",
"qfa-tyn": "Tyrsenia",
"qfa-unc": "tidak dapat dikelaskan",
"qfa-xgs": "Serbi-Mongolik",
"qfa-xgx": "Para-Mongolik",
"qfa-yen": "Yenisei",
"qfa-yke": "Ketik",
"qfa-yko": "Kottik",
"qfa-ypm": "Pumpokolik",
"qfa-yrn": "Arinik",
"qfa-yuk": "Yukaghir",
"qwe": "Quechua",
"raj": "Rajasthan",
"roa": "Romawi",
"roa-asl": "Asturleon",
"roa-cas": "Castilia",
"roa-dal": "Romawi Dalmatia",
"roa-eas": "Romawi Timur",
"roa-emr": "Emilia-Romagnol",
"roa-gap": "Galicia-Portugis",
"roa-gar": "Gallo-Romawi",
"roa-git": "Gallo-Italik",
"roa-grh": "Gallo-Raetia",
"roa-ibe": "Ibero-Romawi",
"roa-itd": "Italo-Dalmatia",
"roa-itr": "Italo-Romawi",
"roa-iwr": "Italo-Romawi Barat",
"roa-nar": "Navarro-Aragon",
"roa-ocr": "Occitano-Romawi",
"roa-oil": "Oïl",
"roa-rhe": "Rhaeto-Romawi",
"roa-sou": "Romawi Selatan",
"roa-wes": "Romawi Barat",
"sai-ara": "Arauca",
"sai-aym": "Aymara",
"sai-bar": "Barbacoa",
"sai-bor": "Boran",
"sai-cah": "Cahuapanan",
"sai-car": "Karib",
"sai-cer": "Cerrado",
"sai-chc": "Choco",
"sai-cho": "Chonan",
"sai-cje": "Jê Tengah",
"sai-cpc": "Chapacuran",
"sai-crn": "Charruan",
"sai-ctc": "Catacao",
"sai-guc": "Guaicuruan",
"sai-guh": "Guajibo",
"sai-gui": "Guiana",
"sai-har": "Harákmbut",
"sai-hkt": "Harákmbut-Katukinan",
"sai-hrp": "Huarpean",
"sai-jee": "Jê",
"sai-jir": "Jirajaran",
"sai-jiv": "Jivaro",
"sai-ktk": "Katukinan",
"sai-kui": "Kuikuroan",
"sai-map": "Mapoyan",
"sai-mas": "Mascoian",
"sai-mgc": "Mataco-Guaicuru",
"sai-mje": "Makro-Jê",
"sai-mtc": "Matacoan",
"sai-mur": "Mura",
"sai-nad": "Nadahup",
"sai-nje": "Jê Utara",
"sai-nmk": "Nambikwaran",
"sai-otm": "Otomacoan",
"sai-pan": "Pano",
"sai-pat": "Pano-Tacana",
"sai-pek": "Pekodian",
"sai-pem": "Pemong",
"sai-pey": "Peba-Yaguan",
"sai-prk": "Parukotoan",
"sai-sje": "Jê Selatan",
"sai-tac": "Tacanan",
"sai-tar": "Tarano",
"sai-tin": "Tiniguan",
"sai-tuc": "Tucanoan",
"sai-tyu": "Ticuna-Yuri",
"sai-ucp": "Uru-Chipaya",
"sai-ven": "Karib Venezuela",
"sai-wic": "Wichí",
"sai-wit": "Witotoan",
"sai-ynm": "Yanomami",
"sai-yuk": "Yukpan",
"sai-zam": "Zamucoan",
"sai-zap": "Zaparo",
"sal": "Salish",
"sdv": "SudanikTimur",
"sdv-bri": "Bari",
"sdv-daj": "Daju",
"sdv-dnu": "Dinka-Nuer",
"sdv-eje": "Jebel Timur",
"sdv-kln": "Kalenjin",
"sdv-lma": "Lotuko-Maa",
"sdv-lon": "Luo Utara",
"sdv-los": "Luo Selatan",
"sdv-luo": "Luo",
"sdv-nes": "SudanikTimur Utara",
"sdv-nie": "Nilotik Timur",
"sdv-nil": "Nilotik",
"sdv-nis": "Nilotik Selatan",
"sdv-niw": "Nilotik Barat",
"sdv-nma": "Nandi-Markweta",
"sdv-nyi": "Nyima",
"sdv-tmn": "Taman",
"sdv-ttu": "Teso-Turkana",
"sel": "Selkup",
"sem": "Samiah",
"sem-ara": "Aram",
"sem-arb": "Arab",
"sem-are": "Aram Timur",
"sem-arw": "Aram Barat",
"sem-ase": "Aram Tenggara",
"sem-can": "Kanaan",
"sem-cen": "Samiah Tengah",
"sem-cna": "Neo-Aram Tengah",
"sem-eas": "Samiah Timur",
"sem-eth": "Samiah Habsyah",
"sem-nna": "Neo-Aram Timur Laut",
"sem-nwe": "Samiah Barat Laut",
"sem-osa": "Arab Selatan Kuno",
"sem-sar": "Arab Selatan Moden",
"sem-wes": "Samiah Barat",
"sgn": "isyarat",
"sgn-asl": "Bahasa Isyarat Amerika",
"sgn-fsl": "Bahasa-bahasa Isyarat Perancis",
"sgn-gsl": "Bahasa-bahasa Isyarat Jerman",
"sgn-jsl": "Bahasa-bahasa Isyarat Jepun",
"sio": "Sioux",
"sio-dhe": "Dhegiha",
"sio-dkt": "Dakota",
"sio-mor": "Sioux Sungai Missouri",
"sio-msv": "Sioux Lembah Mississippi",
"sio-ohv": "Sioux Lembah Ohio",
"sit": "Sino-Tibet",
"sit-aao": "Naga Tengah",
"sit-alm": "Almora",
"sit-bai": "Bai",
"sit-bdi": "Bod",
"sit-cln": "Cai-Long",
"sit-dhi": "Dhimalish",
"sit-ebo": "Bod Timur",
"sit-egy": "rGyalrongik Timur",
"sit-ers": "Ersuik",
"sit-gma": "Magarik Raya",
"sit-gsi": "Siangik Raya",
"sit-hrs": "Hrusish",
"sit-jnp": "Jingphoik",
"sit-jpl": "Kachin-Luik",
"sit-kch": "Konyak-Chang",
"sit-kha": "Kham",
"sit-khb": "Kho-Bwa",
"sit-khc": "Chug-Lish",
"sit-khm": "Mey-Sartang",
"sit-khw": "Kho-Bwa Barat",
"sit-kic": "Kiranti Tengah",
"sit-kie": "Kiranti Timur",
"sit-kin": "Kinnaurik",
"sit-kir": "Kiranti",
"sit-kiw": "Kiranti Barat",
"sit-kon": "Naga Utara",
"sit-kyk": "Kyirong-Kagate",
"sit-lab": "Ladakhi-Balti",
"sit-las": "Lahuli-Spiti",
"sit-luu": "Lui",
"sit-mar": "Maringik",
"sit-mba": "Makro-Bai",
"sit-mdz": "Midzu",
"sit-mnz": "Mondzi",
"sit-mru": "Mruik",
"sit-nas": "Naish",
"sit-nax": "Naik",
"sit-nba": "Bai Utara",
"sit-new": "Newarik",
"sit-nng": "Nung",
"sit-qia": "Qiangik",
"sit-rgy": "Rgyalrongik",
"sit-sba": "Sino-Bai",
"sit-tam": "Tamangik",
"sit-tan": "Tani",
"sit-tib": "Tibetik",
"sit-tja": "Tujia",
"sit-tma": "Tangkhul-Maring",
"sit-tng": "Tangkhulik",
"sit-tno": "Tangsa-Nocte",
"sit-tsk": "Tshangla",
"sit-wgy": "rGyalrongik Barat",
"sit-whm": "Himalaya Barat",
"sit-zem": "Zeme",
"sla": "Slavik",
"smi": "Sami",
"son": "Songhay",
"sqj": "Albania",
"ssa": "Nilo-Sahara",
"ssa-fur": "Fur",
"ssa-klk": "Kuliak",
"ssa-kom": "Koman",
"ssa-sah": "Sahara",
"syd": "Samoyed",
"syd-ene": "Enets",
"tai": "Tai",
"tai-cen": "Tai Tengah",
"tai-cho": "Tai Chongzuo",
"tai-nor": "Tai Utara",
"tai-sap": "Sapa-Tai Barat Daya",
"tai-swe": "Tai Barat Daya",
"tai-tay": "Tày",
"tai-wen": "Wenma-Tai Barat Daya",
"tbq": "Tibet-Burma",
"tbq-anp": "Angami-Pochuri",
"tbq-axi": "Axioid",
"tbq-bdg": "Bodo-Garo",
"tbq-bis": "Bisoid",
"tbq-bka": "Bi-Ka",
"tbq-bkj": "Sal",
"tbq-brm": "Burmik",
"tbq-buq": "Burmo-Qiangik",
"tbq-drp": "Phula Hilir",
"tbq-han": "Hanoid",
"tbq-hph": "Phula Tanah Tinggi",
"tbq-jin": "Jino",
"tbq-kuk": "Kuki-Chin",
"tbq-kzh": "Kazhuoish",
"tbq-lal": "Lalo",
"tbq-lho": "Lahoish",
"tbq-llo": "Lipo-Lolopo",
"tbq-lob": "Lolo-Burma",
"tbq-lol": "Loloik",
"tbq-lso": "Lisu",
"tbq-lwo": "Lawu",
"tbq-muj": "Muji",
"tbq-nas": "Nasu",
"tbq-nis": "Nisu",
"tbq-nlo": "Loloik Utara",
"tbq-nso": "Niso",
"tbq-nus": "Nusu",
"tbq-phw": "Phowa",
"tbq-rph": "Phula Sungai",
"tbq-sel": "Loloik Tenggara",
"tbq-sil": "Siloid",
"tbq-slo": "Loloik Selatan",
"tbq-tal": "Talu",
"tbq-urp": "Phula Hulu",
"trk": "Turkik",
"trk-cmn": "Turkik Am",
"trk-kar": "Karluk",
"trk-kbu": "Kipchak-Bulgar",
"trk-kcu": "Kipchak-Cuman",
"trk-kip": "Kipchak",
"trk-kkp": "Kyrgyz-Kipchak",
"trk-kno": "Kipchak-Nogai",
"trk-nsb": "Turkik Siberia Utara",
"trk-ogr": "Oghur",
"trk-ogz": "Oghuz",
"trk-sib": "Turkik Siberia",
"trk-ssb": "Turkik Siberia Selatan",
"tup": "Tupi",
"tup-gua": "Tupi-Guarani",
"tuw": "Tungusik",
"tuw-ewe": "Ewenik",
"tuw-jrc": "Jurchenik",
"tuw-nan": "Nanaik",
"tuw-udg": "Udegheik",
"urj": "Uralik",
"urj-fin": "Finnik",
"urj-mdv": "Mordvinik",
"urj-prm": "Permik",
"urj-ugr": "Ugriik",
"wak": "Wakash",
"wen": "Sorbia",
"xgn": "Mongolik",
"xgn-cen": "Mongolik Tengah",
"xgn-shr": "Shirongolik",
"xgn-sou": "Mongolik Selatan",
"xme": "Medes",
"xme-ttc": "Tatik",
"xnd": "Na-Dene",
"xsc": "Scythia",
"xsc-sak": "Saka",
"xsc-sar": "Sarmata",
"xsc-skw": "Saka-Wakhi",
"yok": "Yokuts",
"ypk": "Yupik",
"yrk": "Nenets",
"zhx": "Sinitik",
"zhx-com": "Min Pesisir",
"zhx-inm": "Min Pedalaman",
"zhx-man": "Mandarinik",
"zhx-min": "Min",
"zhx-nan": "Min Selatan",
"zhx-pin": "Pinghua",
"zhx-yue": "Yue",
"zle": "Slavik Timur",
"zls": "Slavik Selatan",
"zlw": "Slavik Barat",
"zlw-lch": "Lechitik",
"zlw-pom": "Pomerania",
"znd": "Zande"
}
fqx47cgi5f9oj4k43ujuw67eofrcafc
Modul:etymon/categories
828
82358
373584
373533
2026-09-11T19:19:51Z
SNN95
2113
ujian berjaya
373584
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
etymology = "Module:etymology",
affix = "Module:affix",
etymology_specialized = "Module:etymology/specialized",
utilities = "Module:utilities",
roots = "Module:roots",
},
loadData = {
data = "Module:etymon/data",
},
})
-- Fungsi utiliti untuk huruf besar
local function ucfirst(text)
if not text then return text end
return mw.ustring.upper(mw.ustring.sub(text, 1, 1)) .. mw.ustring.sub(text, 2)
end
-- Nilaikan sama ada kata kunci adalah transitif bagi sesuatu istilah
local function is_transitive(transitive_mode, page_lang, term_lang)
if transitive_mode == M.data.TRANSITIVE.ALWAYS then
return true
elseif transitive_mode == M.data.TRANSITIVE.NEVER then
return false
elseif transitive_mode == M.data.TRANSITIVE.CROSS_LANG then
return page_lang:getCode() ~= term_lang:getCode()
elseif transitive_mode == M.data.TRANSITIVE.CROSS_LANG_NO_INTERNAL_SOURCE then
return page_lang:getCode() ~= term_lang:getCode()
end
error("Mod transitif tidak diketahui: " .. tostring(transitive_mode))
end
-- Dapatkan konfigurasi kata kunci dengan pengesampingan khusus bahasa
local function get_keyword_config(keyword, lang_exc)
local base_config = M.data.keywords[keyword]
if not base_config then
return nil -- Kata kunci tidak sah
end
local overrides = lang_exc and lang_exc.keyword_overrides and lang_exc.keyword_overrides[keyword]
if not overrides then
return base_config
end
-- Gabungkan pengesampingan ke dalam konfigurasi asas
local merged = {}
for k, v in pairs(base_config) do
merged[k] = v
end
for k, v in pairs(overrides) do
merged[k] = v
end
return merged
end
function export.get_cat_name(source)
local _, cat_name = M.etymology.get_display_and_cat_name(source, true)
return cat_name
end
-- Normalkan alias jenis imbuhan
local aftype_aliases = {
["pre"] = "awalan",
["suf"] = "akhiran",
["in"] = "infix",
["inter"] = "interfix",
["circum"] = "circumfix",
["naf"] = "non-affix",
["root"] = "non-affix",
}
local function add_category(categories, cat_name, sort_key, sort_base)
if categories[cat_name] == nil then
categories[cat_name] = {
sort_key = sort_key,
sort_base = sort_base,
}
return
end
local existing = categories[cat_name]
if existing.sort_key == nil and sort_key ~= nil then
existing.sort_key = sort_key
end
if existing.sort_base == nil and sort_base ~= nil then
existing.sort_base = sort_base
end
end
-- Kumpulkan kategori imbuhan daripada bekas kumpulan peringkat atas
local function collect_affix_categories(node, page_lang, available_etymon_ids, senseid_parent_etymon, lang_exc)
local parts = {}
local part_index = 1
for _, container in ipairs(node.children or {}) do
local config = container.keyword_info
if config and config.affix_categories then
for _, term in ipairs(container.terms or {}) do
if not term.unknown_term then
local part_data = {
term = term.title,
tr = term.tr,
ts = term.ts,
alt = term.alt,
itemno = part_index,
orig_index = part_index
}
-- Tentukan jenis imbuhan: aftype tersurat > pos=root > auto-kesan
local aftype = term.aftype
if aftype then
aftype = aftype_aliases[aftype] or aftype
part_data.type = aftype
elseif term.args and term.args.pos and term.args.pos == "root" then
part_data.type = "non-affix"
end
if term.lang:getCode() ~= page_lang:getCode() then
part_data.lang = term.lang
end
local target_ids = available_etymon_ids[term.target_key]
local has_multiple_ids = target_ids and #target_ids > 1
local id_exists_in_disambiguation = false
local matched_id = nil
-- Hitung senseid yang tersedia untuk halaman sasaran
local senseid_count = 0
local target_prefix = term.target_key .. ":"
if senseid_parent_etymon then
for key, _ in pairs(senseid_parent_etymon) do
if key:sub(1, #target_prefix) == target_prefix then
senseid_count = senseid_count + 1
end
end
end
local has_multiple_senseids = senseid_count > 1
if term.id then
-- Periksa jika pengguna menyediakan senseid yang sah
local senseid_key = term.target_key .. ":" .. term.id
if senseid_parent_etymon and senseid_parent_etymon[senseid_key] then
if has_multiple_senseids then
-- senseid kabur: gunakan senseid
matched_id = term.id
id_exists_in_disambiguation = true
elseif has_multiple_ids then
-- senseid unik tetapi etimon kabur: gunakan ID etimon
matched_id = term.etymon_id or term.id
id_exists_in_disambiguation = true
end
else
-- Periksa jika pengguna menyediakan ID etimon yang sah
if has_multiple_ids and target_ids then
for _, id_data in ipairs(target_ids) do
local stored_id = type(id_data) == "table" and id_data.id or id_data
if stored_id == term.id then
-- Etimon kabur: gunakan ID etimon
id_exists_in_disambiguation = true
matched_id = term.id
break
end
end
end
-- Sandaran: periksa etymon_id yang diselesaikan (cth. daripada langkah-langkah sebelumnya)
if not id_exists_in_disambiguation and has_multiple_ids and term.etymon_id and target_ids then
for _, id_data in ipairs(target_ids) do
local stored_id = type(id_data) == "table" and id_data.id or id_data
if stored_id == term.etymon_id then
id_exists_in_disambiguation = true
matched_id = term.etymon_id
break
end
end
end
end
end
-- Gunakan ID yang sepadan jika dijumpai
if term.override or id_exists_in_disambiguation then
part_data.id = matched_id or term.id
end
table.insert(parts, part_data)
part_index = part_index + 1
end
end
end
end
if #parts == 0 then return {} end
local affix_data = {
lang = page_lang,
parts = parts,
pos = "perkataan",
sort_key = nil,
}
if #parts == 1 then
affix_data.allow_no_affixes_or_compounds = true
end
local affix_categories = M.affix.get_affix_categories_only(affix_data)
local result = {}
for _, cat in ipairs(affix_categories) do
if type(cat) == "table" then
table.insert(result, { cat = cat.cat, sort_key = cat.sort_key, sort_base = cat.sort_base })
else
table.insert(result, { cat = cat })
end
end
return result
end
local function lang_is_source(page_lang, source)
return page_lang:getCode() == source:getCode() or page_lang:hasParent(source)
end
local function is_borrowing_keyword_config(config)
return config and (config.borrowing_type or config.specialized_borrowing)
end
local function add_reborrow_category(categories, page_lang)
local lang_name = page_lang:getFullName()
add_category(categories, "Perkataan " .. lang_name .. " yang dipinjam kembali ke dalam " .. lang_name)
end
local function borrow_returns_to_page_lang(page_lang, source, in_foreign_branch)
if not in_foreign_branch then
return false
end
if source:getFullCode() == page_lang:getFullCode() then
return true
end
return page_lang:hasParent(source)
end
local function node_borrows_from_lang(node, page_lang, visited, in_foreign_branch)
visited = visited or {}
if not node or visited[node] then
return false
end
visited[node] = true
if node.is_duplicate then
if node.duplicate_of then
return node_borrows_from_lang(node.duplicate_of, page_lang, visited, in_foreign_branch)
end
return false
end
local node_is_foreign = in_foreign_branch
or (node.lang and node.lang:getFullCode() ~= page_lang:getFullCode())
for _, container in ipairs(node.children or {}) do
if is_borrowing_keyword_config(container.keyword_info) then
for _, child_term in ipairs(container.terms or {}) do
if borrow_returns_to_page_lang(page_lang, child_term.lang, node_is_foreign) then
return true
end
end
end
for _, child_term in ipairs(container.terms or {}) do
if child_term.status == M.data.STATUS.OK or child_term.status == M.data.STATUS.INLINE then
if node_borrows_from_lang(child_term, page_lang, visited, node_is_foreign) then
return true
end
end
end
end
return false
end
local function should_add_reborrow_category(page_lang, term)
if page_lang:getCode() == term.lang:getCode() then
return false
end
if term.status ~= M.data.STATUS.OK and term.status ~= M.data.STATUS.INLINE then
return false
end
return node_borrows_from_lang(term, page_lang, {}, false)
end
-- Tambah kategori berkaitan peminjaman (peringkat atas sahaja)
local function collect_borrowing_categories(categories, page_lang, term, config, check_reborrow_path)
if check_reborrow_path and should_add_reborrow_category(page_lang, term) then
add_reborrow_category(categories, page_lang)
end
if config.borrowing_type == "borrowed" and not lang_is_source(page_lang, term.lang) then
local temp_categories = {}
M.etymology.insert_borrowed_cat(temp_categories, page_lang, term.lang)
for _, cat in ipairs(temp_categories) do
add_category(categories, cat)
end
end
if config.specialized_borrowing and not lang_is_source(page_lang, term.lang) then
local result = M.etymology_specialized.specialized_borrowing {
bortype = config.specialized_borrowing,
lang = page_lang,
sources = { term.lang },
terms = { { lang = term.lang, term = "-" } },
notext = true,
nocat = false,
}
for cat_name in result:gmatch("%[%[Category:([^%]]+)%]%]") do
add_category(categories, cat_name)
end
end
end
-- Tambah kategori terbitan berasaskan sumber (peringkat atas sahaja)
local function collect_source_derivation_categories(categories, page_lang, term, config)
if not config.source_category_type then
return
end
local temp_categories = {}
M.etymology.insert_source_cat_get_display {
lang = page_lang,
source = term.lang,
categories = temp_categories,
borrowing_type = config.source_category_type,
nocat = false,
}
for _, cat in ipairs(temp_categories) do
add_category(categories, cat)
end
end
-- Tambah kategori bahasa sumber
local function collect_source_categories(categories, page_lang, term, chain, get_norm_lang_func)
if page_lang:getCode() == get_norm_lang_func(term.lang):getCode() then
return
end
local temp_categories = {}
M.etymology.insert_source_cat_get_display {
lang = page_lang,
source = term.lang,
categories = temp_categories,
nocat = false,
}
for _, cat in ipairs(temp_categories) do
add_category(categories, cat)
end
if chain.inherited then
temp_categories = {}
M.etymology.insert_source_cat_get_display {
lang = page_lang,
source = term.lang,
categories = temp_categories,
borrowing_type = "terms inherited",
nocat = false,
}
for _, cat in ipairs(temp_categories) do
add_category(categories, cat)
end
end
end
-- Tambah kategori akar/perkataan
local function collect_pos_categories(categories, page_lang, root_title, term, available_etymon_ids, chain,
get_norm_lang_func, lang_exc, keyword)
local pos_types = { root = "akar", word = "perkataan" }
-- Tentukan pos: daripada postype istilah, pos_override kata kunci, atau args.pos
local pos
local config = get_keyword_config(keyword, lang_exc)
if term.postype then
-- Pengubahsuai postype peringkat istilah mengambil keutamaan tertinggi
pos = term.postype
elseif config and config.pos_override then
pos = config.pos_override
elseif type(term.args) == "table" and term.args.pos then
pos = term.args.pos
end
local pos_type = pos_types[pos]
if not pos_type or term.unknown_term then
return
end
-- Langkau kategori akar/perkataan untuk keturunan kumpulan imbuhan
-- if pos_type then
-- return
-- end
local same_language = get_norm_lang_func(page_lang):getFullCode() == get_norm_lang_func(term.lang):getFullCode()
-- Langkau rujukan kendiri
if same_language and root_title == term.title then
return
end
local entry_name
if pos_type == "akar" then
entry_name = term.title
M.roots.assert_root(term.lang, entry_name)
else
entry_name = term.lang:makeEntryName(term.title)
end
local lang_name = page_lang:getCanonicalName()
local cat_name
if chain.passed_through then
local etymon_lang_name = export.get_cat_name(term.lang)
cat_name = "Perkataan " .. lang_name .. " yang diterbitkan daripada " .. pos_type .. " " .. etymon_lang_name .. " " .. entry_name
else
cat_name = "Perkataan " .. lang_name .. " yang tergolong dalam " .. pos_type .. " " .. entry_name
end
-- Tambah penyahkaburan ID jika perlu (untuk akar/perkataan: gunakan etymon_id jika diselesaikan melalui senseid, jika tidak gunakan id)
local target_ids = available_etymon_ids[term.target_key]
local effective_id = term.etymon_id or term.id -- etymon_id jika senseid, jika tidak id sudah pun merupakan id etimon
if target_ids and effective_id then
local same_pos_count = 0
for _, id_data in ipairs(target_ids) do
if type(id_data) == "table" and id_data.pos == pos then
same_pos_count = same_pos_count + 1
end
end
if same_pos_count > 1 then
cat_name = cat_name .. " (" .. effective_id .. ")"
end
end
add_category(categories, cat_name)
end
-- Hitung keadaan rantaian untuk suatu istilah berdasarkan rantaian induk dan konfigurasi kata kunci
-- Corak sengkang untuk pengesanan imbuhan (sengkang biasa + khusus skrip)
local AFFIX_HYPHEN_PATTERN = "[%-%־ـ᠊]" -- sengkang biasa, maqqef Ibrani, tatweel Arab, sengkang Mongolia
-- Periksa jika suatu istilah merupakan imbuhan sebenar (bukan ahli bukan imbuhan dalam kumpulan imbuhan)
local function is_actual_affix(term)
-- Periksa pengubahsuai aftype tersurat
if term.aftype then
local normalized = aftype_aliases[term.aftype] or term.aftype
return normalized ~= "non-affix"
end
-- Periksa jika pos=root (dilayan sebagai bukan imbuhan)
if term.args and term.args.pos and term.args.pos == "root" then
return false
end
-- Auto-kesan menggunakan sengkang: awalan berakhir dengan -, akhiran bermula dengan -, dsb.
if term.title then
local title = term.title
-- Tanggalkan * di hadapan untuk istilah yang direkonstruksi sebelum memeriksa sengkang
title = title:gsub("^%*", "")
-- Periksa sengkang di awal atau akhir (mengendalikan sengkang khusus skrip juga)
if title:match("^" .. AFFIX_HYPHEN_PATTERN) or title:match(AFFIX_HYPHEN_PATTERN .. "$") then
return true
end
end
-- Lalai: bukan imbuhan
return false
end
local function compute_category_chain(parent_chain, config, page_lang, term_lang, get_norm_lang_func, parent_term_lang, term)
-- Jejak jika kita berada di dalam imbuhan sebenar (untuk menindas kategori akar pada keturunan)
-- Hanya tetapkan jika istilah tersebut merupakan imbuhan sebenar (awalan, akhiran, dsb.), bukan ahli bukan imbuhan
local inside_affix = parent_chain.inside_affix
if config.affix_categories and term and is_actual_affix(term) then
inside_affix = true
end
-- Jika no_child_categories ditetapkan, lumpuhkan semuanya
if config.no_child_categories then
return {
passed_through = parent_chain.passed_through or page_lang:getCode() ~= get_norm_lang_func(term_lang):getCode(),
inherited = false,
source = false,
pos = false,
recurse = false,
inside_affix = inside_affix,
}
end
local term_is_transitive = is_transitive(config.transitive, page_lang, term_lang)
local new_source = parent_chain.source and term_is_transitive
-- Untuk CROSS_LANG_NO_INTERNAL_SOURCE: jejak konteks bahasa terbitan dalaman
-- Periksa jika istilah ini adalah dalaman secara relatif terhadap bahasa istilah induk (jika parent_term_lang disediakan)
-- atau secara relatif terhadap bahasa halaman (jika tiada parent_term_lang)
local internal_lang = parent_chain.internal_lang
local is_internal_in_context = false
if config.transitive == M.data.TRANSITIVE.CROSS_LANG_NO_INTERNAL_SOURCE then
local check_lang = parent_term_lang or page_lang
local term_lang_code = get_norm_lang_func(term_lang):getCode()
local check_lang_code = get_norm_lang_func(check_lang):getCode()
if internal_lang then
-- Sudah berada dalam konteks terbitan dalaman: periksa jika istilah ini juga dalaman
is_internal_in_context = term_lang_code == internal_lang
else
-- Periksa jika istilah ini adalah dalaman secara relatif terhadap istilah induk (atau halaman jika tiada induk)
is_internal_in_context = term_lang_code == check_lang_code
end
end
-- Tingkah laku rantaian sumber untuk CROSS_LANG_NO_INTERNAL_SOURCE
if config.transitive == M.data.TRANSITIVE.CROSS_LANG_NO_INTERNAL_SOURCE then
if is_internal_in_context then
-- Terbitan dalaman
new_source = false
internal_lang = get_norm_lang_func(term_lang):getCode()
else
-- Merentas bahasa
new_source = parent_chain.source and term_is_transitive
internal_lang = nil
end
end
local new_pos = parent_chain.pos
return {
passed_through = parent_chain.passed_through or page_lang:getCode() ~= get_norm_lang_func(term_lang):getCode(),
inherited = parent_chain.inherited and config.inherited_chain,
source = new_source,
pos = new_pos,
internal_lang = internal_lang,
recurse = new_source or new_pos,
inside_affix = inside_affix,
}
end
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local page_lang = opts.page_lang
local available_etymon_ids = opts.available_etymon_ids
local senseid_parent_etymon = opts.senseid_parent_etymon
local get_norm_lang_func = opts.get_norm_lang_func
local lang_exc = opts.lang_exc
local categories = {}
local seen = {}
local lang_name = page_lang:getCanonicalName()
local root_title = data_tree.title
-- Kumpulkan pepohon secara rekursif
local function collect(node, parent_chain, is_toplevel)
-- Elakkan memproses nod yang sama dua kali
if not node.unknown_term and node.title then
local key = node.lang:getFullCode() .. ":" .. (node.title or "") .. ":" .. (node.id or "")
if seen[key] then return end
seen[key] = true
end
-- Kumpulkan kategori imbuhan pada peringkat atas sahaja
if is_toplevel then
local affix_cats = collect_affix_categories(node, page_lang, available_etymon_ids, senseid_parent_etymon, lang_exc)
for _, cat in ipairs(affix_cats) do
-- Buang cantuman "lang_name" dari sini kerana Modul:affix sudah menjana nama bahasa yang lengkap
add_category(categories, cat.cat, cat.sort_key, cat.sort_base)
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
local config = supplement.config
if config and config.toplevel_category then
add_category(categories, ucfirst(config.toplevel_category) .. " bahasa " .. lang_name)
end
end
end
end
-- Proses setiap bekas
for _, container in ipairs(node.children or {}) do
local keyword = container.keyword
local config = get_keyword_config(keyword, lang_exc)
-- Langkau kata kunci yang tidak sah
if config then
-- Proses setiap istilah dalam bekas
for _, term in ipairs(container.terms or {}) do
local term_chain = compute_category_chain(parent_chain, config, page_lang, term.lang, get_norm_lang_func, node.lang, term)
local no_child_categories = config.no_child_categories == true
local term_is_transitive = is_transitive(config.transitive, page_lang, term.lang)
-- Pemprosesan peringkat atas sahaja
if is_toplevel then
-- Penjejakan etimon yang hilang/kabur
if not term.unknown_term and (term.status == M.data.STATUS.MISSING or term.status == M.data.STATUS.REDLINK) then
add_category(categories, "Lema " .. lang_name .. " yang merujuk etimon yang hilang")
end
if not term.unknown_term and term.status == M.data.STATUS.AMBIGUOUS then
add_category(categories, "Lema " .. lang_name .. " yang merujuk etimon yang kabur")
end
if term.missing_descendants_header then
add_category(categories, "Lema " .. lang_name .. " yang merujuk etimon tanpa bahagian Keturunan")
end
if term.missing_descendants_entry then
add_category(categories, "Lema " .. lang_name .. " yang merujuk etimon tanpa istilah ini dalam bahagian Keturunan")
end
-- Kategori peringkat atas (cth., "undefined derivations")
if config.toplevel_category then
add_category(categories, ucfirst(config.toplevel_category) .. " bahasa " .. lang_name)
end
-- Kategori peminjaman (bor, lbor, slbor, ubor, obor)
if config.borrowing_type or config.specialized_borrowing then
collect_borrowing_categories(categories, page_lang, term, config, true)
end
-- Kategori peminjaman daripada pengubahsuai <bor>, <lbor>, atau <slbor> pada istilah kumpulan imbuhan
local kw_config = M.data.keywords[keyword]
if kw_config and kw_config.affix_categories then
if term.bor then
local bor_config = { borrowing_type = "borrowed" }
collect_borrowing_categories(categories, page_lang, term, bor_config, true)
elseif term.lbor then
local bor_config = { specialized_borrowing = "learned" }
collect_borrowing_categories(categories, page_lang, term, bor_config, true)
elseif term.slbor then
local bor_config = { specialized_borrowing = "semi-learned" }
collect_borrowing_categories(categories, page_lang, term, bor_config, true)
end
end
-- Kategori terbitan berasaskan sumber (sl, calque, pcal)
if config.source_category_type then
collect_source_derivation_categories(categories, page_lang, term, config)
end
-- Langkau semua pengkategorian anak jika no_child_categories ditetapkan
if not no_child_categories then
-- Kategori sumber hanya jika transitif
if term_is_transitive then
collect_source_categories(categories, page_lang, term, term_chain, get_norm_lang_func)
end
-- Kategori pos sentiasa (melainkan no_child_categories)
collect_pos_categories(categories, page_lang, root_title, term, available_etymon_ids, term_chain,
get_norm_lang_func, lang_exc, keyword)
end
else
-- Di bawah peringkat atas, patuhi rantaian induk
if parent_chain.source then
collect_source_categories(categories, page_lang, term, term_chain, get_norm_lang_func)
end
if parent_chain.pos then
collect_pos_categories(categories, page_lang, root_title, term, available_etymon_ids, term_chain,
get_norm_lang_func, lang_exc, keyword)
end
end
-- Rekursi ke dalam anak istilah jika perlu dan status membenarkan
if term_chain.recurse and (term.status == M.data.STATUS.OK or term.status == M.data.STATUS.INLINE) then
collect(term, term_chain, false)
end
end
end
end
end
-- Keadaan rantaian awal
local initial_chain = {
passed_through = false,
inherited = true,
source = true,
pos = true,
internal_lang = nil,
recurse = true,
inside_affix = false,
}
collect(data_tree, initial_chain, true)
local cat_list = {}
for cat_name, sort_data in pairs(categories) do
if sort_data.sort_key ~= nil or sort_data.sort_base ~= nil then
table.insert(cat_list, {
name = cat_name,
sort_key = sort_data.sort_key,
sort_base = sort_data.sort_base,
})
else
table.insert(cat_list, cat_name)
end
end
return cat_list
end
function export.build(opts)
opts = opts or {}
local categories = {}
if not opts.suppress_categories and not opts.nocat then
categories = export.render({
data_tree = opts.data_tree,
page_lang = opts.page_lang,
available_etymon_ids = opts.available_etymon_ids,
senseid_parent_etymon = opts.senseid_parent_etymon,
get_norm_lang_func = opts.get_norm_lang_func,
lang_exc = opts.lang_exc,
})
end
local page_lang = opts.page_lang
if not page_lang then
return categories
end
local lang_name = page_lang:getCanonicalName()
table.insert(categories, "Halaman dengan etimon")
table.insert(categories, "Lema " .. lang_name .. " dengan etimon")
if opts.tree then
table.insert(categories, "Halaman dengan pepohon etimologi")
table.insert(categories, "Lema " .. lang_name .. " dengan pepohon etimologi")
end
if opts.text then
table.insert(categories, "Lema " .. lang_name .. " dengan teks etimologi")
end
if opts.exnihilo then
table.insert(categories, "Perkataan " .. lang_name .. " yang dicipta ex nihilo")
end
if opts.toplevel_has_inline_etymology then
table.insert(categories, "Halaman dengan etimon sebaris untuk pautan merah")
end
if opts.toplevel_redundant_etymology then
table.insert(categories, "Halaman dengan etimon sebaris lewah")
end
if opts.toplevel_idless_etymon then
table.insert(categories, "Halaman yang menggunakan etimon tanpa ID")
end
if opts.has_mismatched_id then
table.insert(categories, "Lema " .. lang_name .. " yang merujuk etimon dengan ID yang tidak sepadan")
end
if opts.linked_page_multiple_etymons_idless then
table.insert(categories,
"Lema " .. lang_name .. " yang merujuk halaman dengan berbilang etimon yang kehilangan ID")
end
if opts.linked_page_partial_etymology_sections then
table.insert(categories,
"Lema " .. lang_name .. " yang merujuk halaman dengan bahagian etimologi yang kehilangan etimon")
end
if opts.text_stop_lang_missing then
table.insert(categories, "Halaman dengan bahasa henti teks etimologi bukan dalam rantaian")
table.insert(categories, "Lema " .. lang_name .. " dengan bahasa henti teks etimologi bukan dalam rantaian")
end
return categories
end
function export.format(entries, lang)
if type(entries) ~= "table" or #entries == 0 then
return ""
end
local parts = {}
for _, category in ipairs(entries) do
if type(category) == "table" and type(category.name) == "string" then
table.insert(parts, M.utilities.format_categories({ category.name }, lang, category.sort_key, category.sort_base))
elseif type(category) == "string" then
table.insert(parts, M.utilities.format_categories({ category }, lang))
end
end
return table.concat(parts)
end
return export
3s0p5juoi0lfbdk57jfta3d6318mgp2
Wikikamus:dtp/mokianu
4
141724
373567
370930
2026-09-11T15:35:33Z
Lynumiss
5957
tambah ayat
373567
wikitext
text/x-wiki
==Bahasa {{bahasa|dtp}}==
===Kata nama===
{{inti|dtp|kata nama}}
# meminta {{cp|dtp|'''Mokianu''' oku songinan do tupolo mantad taki ku.|Saya '''[[meminta]]''' sebiji durian daripada datuk saya.}}
4mgr78an77jbvsh3rqp9ei4cjbi8m6g
kirkification
0
144614
373581
373531
2026-09-11T18:47:46Z
SNN95
2113
373581
wikitext
text/x-wiki
== Bahasa Inggeris ==
[[File:Mona Lisa Kirkification.jpg|thumb|alt=Mona Lisa dengan wajah digantikan dengan wajah Charlie Kirk|'''''Kirkification''' of the [[Mona Lisa]]'' (Kirkifikasi ''Mona Lisa'')]]
===Etimologi===
<!---{{ety|en|:af|Kirk<alt:(Charlie) Kirk><id:original proper noun>|-ification|tree=1}}--->
Gabungan {{akhiran/ujian|en|Kirk|ification}}.
===Sebutan===
* {{AFA|en|/kɜːkɪ.fɪˈkeɪ.ʃən/|a=RP}}
* {{AFA|en|/kɜɹkɪ.fɪˈkeɪ.ʃən/|a=GA}}
* {{audio|en|En-us-kirkification.ogg|a=US}}
* {{rhymes|en|eɪʃən|s=5}}
===Kata nama===
{{en-kn}}
# Perbuatan menyunting or atau mengganti muka pada gambar seseorang dengan gambar aktivis politik Amerika Syarikat, [[w:Charlie Kirk|Charlie Kirk]].
#* {{quote-journal|en|author=Cade Savoy|date=2025-11-17|title=AI ‘Kirkification’ prompts important questions about digital grief|work=[[w:The Reveille (newspaper)|The Reveille]]|location=Baton Rouge, Louisiana|publisher=LSU|archiveurl=https://web.archive.org/web/20251213174921/https://lsureveille.com/270296/opinion/opinion-ai-kirkification-prompts-important-questions-about-digital-grief/
|text=That was until I logged into my X account and saw Kirk’s face grafted onto ex-Syrian dictator Bashar al-Assad.{{pb}}Assad isn’t alone: “'''Kirkification'''” — the practice of using AI to superimpose Kirk’s face onto another person — has taken over the internet, primarily as a means of poking fun at the dead man’s supporters.}}
#* {{quote-journal|en|title=Kirkification: Gen Z and sardonic online culture|article_series=CT Viewpoints|author=Jada King|date=2026-3-18|work=w:CT Mirror|location=Hartford, Connecticut|archiveurl=https://web.archive.org/web/20260724113734/https://ctmirror.org/2026/03/18/kirkification-gen-z-and-sardonic-online-culture/
|text=Fear, anger, and doubt keep us online, and when being exposed to atrocity after atrocity, numbness is inevitable.{{pb}}In this way, '''Kirkification''' is extremely brilliant; it effectively closes the gap between politics and comedy, acting as a form of humorous political subversion.}}
#* {{RQ:New Yorker|Brady Brickner-Wood|The Kirkification of Our Troubled Times|date=2026-4-29|archiveurl=https://web.archive.org/web/20260429180802/https://www.newyorker.com/culture/infinite-scroll/the-kirkification-of-our-troubled-times
|text='''Kirkification''' began as a process of nihilistic disenchantment: churning out content that captures the confusion and cynicism of a generation trying to make sense of, and detach from, the brutal realities of contemporary political life.}}
# {{lb|en|linguistik}} Perbuatan mengubah sesebuah perkataan untuk menyertakan ''Kirk'' dalam ejaan atau sebulannya, merujuk kepada aktivis politik Amerika Syarikat, Charlie Kirk.
onr7fnlfpm9nepteat8m9e3ufovveju
373585
373581
2026-09-11T19:20:35Z
SNN95
2113
Membatalkan semakan [[Special:Diff/373581|373581]] oleh [[Special:Contributions/SNN95|SNN95]] ([[User talk:SNN95|bincang]])
373585
wikitext
text/x-wiki
== Bahasa Inggeris ==
[[File:Mona Lisa Kirkification.jpg|thumb|alt=Mona Lisa dengan wajah digantikan dengan wajah Charlie Kirk|'''''Kirkification''' of the [[Mona Lisa]]'' (Kirkifikasi ''Mona Lisa'')]]
===Etimologi===
{{ety|en|:af|Kirk<alt:(Charlie) Kirk><id:original proper noun>|-ification|tree=1}}
Gabungan {{suffix|en|Kirk|ification}}.
===Sebutan===
* {{AFA|en|/kɜːkɪ.fɪˈkeɪ.ʃən/|a=RP}}
* {{AFA|en|/kɜɹkɪ.fɪˈkeɪ.ʃən/|a=GA}}
* {{audio|en|En-us-kirkification.ogg|a=US}}
* {{rhymes|en|eɪʃən|s=5}}
===Kata nama===
{{en-kn}}
# Perbuatan menyunting or atau mengganti muka pada gambar seseorang dengan gambar aktivis politik Amerika Syarikat, [[w:Charlie Kirk|Charlie Kirk]].
#* {{quote-journal|en|author=Cade Savoy|date=2025-11-17|title=AI ‘Kirkification’ prompts important questions about digital grief|work=[[w:The Reveille (newspaper)|The Reveille]]|location=Baton Rouge, Louisiana|publisher=LSU|archiveurl=https://web.archive.org/web/20251213174921/https://lsureveille.com/270296/opinion/opinion-ai-kirkification-prompts-important-questions-about-digital-grief/
|text=That was until I logged into my X account and saw Kirk’s face grafted onto ex-Syrian dictator Bashar al-Assad.{{pb}}Assad isn’t alone: “'''Kirkification'''” — the practice of using AI to superimpose Kirk’s face onto another person — has taken over the internet, primarily as a means of poking fun at the dead man’s supporters.}}
#* {{quote-journal|en|title=Kirkification: Gen Z and sardonic online culture|article_series=CT Viewpoints|author=Jada King|date=2026-3-18|work=w:CT Mirror|location=Hartford, Connecticut|archiveurl=https://web.archive.org/web/20260724113734/https://ctmirror.org/2026/03/18/kirkification-gen-z-and-sardonic-online-culture/
|text=Fear, anger, and doubt keep us online, and when being exposed to atrocity after atrocity, numbness is inevitable.{{pb}}In this way, '''Kirkification''' is extremely brilliant; it effectively closes the gap between politics and comedy, acting as a form of humorous political subversion.}}
#* {{RQ:New Yorker|Brady Brickner-Wood|The Kirkification of Our Troubled Times|date=2026-4-29|archiveurl=https://web.archive.org/web/20260429180802/https://www.newyorker.com/culture/infinite-scroll/the-kirkification-of-our-troubled-times
|text='''Kirkification''' began as a process of nihilistic disenchantment: churning out content that captures the confusion and cynicism of a generation trying to make sense of, and detach from, the brutal realities of contemporary political life.}}
# {{lb|en|linguistik}} Perbuatan mengubah sesebuah perkataan untuk menyertakan ''Kirk'' dalam ejaan atau sebulannya, merujuk kepada aktivis politik Amerika Syarikat, Charlie Kirk.
sg5cy63lmq7gexi6058k1wdsjpqfaag
Wikikamus:bdr/betong
4
144623
373566
2026-09-11T14:29:15Z
Jainnie
10839
Tambah ayat
373566
wikitext
text/x-wiki
==Bahasa {{bahasa|bdr}}==
===Kata sifat===
{{inti|bdr|kata sifat}}
# {{label|1=bdr|2=dialek|3=Sabah}} hamil {{cp|bdr|Dendo makai badu darag a '''betong'''.|Wanita berbaju merah itu '''[[hamil]]'''.}}
84doqkn5yevsse4ir2gh8w1n30fs1me
Wikikamus:dtp/popoinsodu
4
144624
373568
2026-09-11T15:38:03Z
Lynumiss
5957
Tambah kata
373568
wikitext
text/x-wiki
==Bahasa {{bahasa|dtp}}==
===Kata kerja===
{{inti|dtp|kata kerja}}
# {{label|1=dtp|2=Bundu Liwan|3=Sabah}} menjauhkan {{cp|dtp|Ginayat di taki i tadi ku montok '''popoinsodu''' mantad do tapui.|Datuk menarik adik saya untuk '''[[menjauhkan]]'''nya daripada api.}}
gvlapb3ntl8iw77cl36v28jmxvglw5x
Pengguna:SNN95/Etinomtreetest
2
144625
373569
2026-09-11T18:03:39Z
SNN95
2113
Mencipta laman baru dengan kandungan '{{ety|en|:af|Kirk<alt:(Charlie) Kirk><id:original proper noun>|-ification|tree=1}} Gabungan {{suffix|en|Kirk|ification}}.'
373569
wikitext
text/x-wiki
{{ety|en|:af|Kirk<alt:(Charlie) Kirk><id:original proper noun>|-ification|tree=1}}
Gabungan {{suffix|en|Kirk|ification}}.
khdgziktru3h5wgpx8c4wkq02fmo13c
Modul:affix/ujian
828
144626
373570
2026-09-11T18:04:56Z
SNN95
2113
Mencipta laman baru dengan kandungan 'local export = {} local debug_force_cat = false -- if set to true, always display categories even on userspace pages local m_links = require("Module:links") local m_str_utils = require("Module:string utilities") local m_table = require("Module:table") local en_utilities_module = "Module:en-utilities" local etymology_module = "Module:etymology" local pron_qualifier_module = "Module:pron qualifier" local scripts_module = "Module:scripts" local utilitie...'
373570
Scribunto
text/plain
local export = {}
local debug_force_cat = false -- if set to true, always display categories even on userspace pages
local m_links = require("Module:links")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local etymology_module = "Module:etymology"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local utilities_module = "Module:utilities"
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.affix_lang_data_module_prefix = "Module:affix/lang-data/"
local ulen = m_str_utils.len
local rfind = m_str_utils.find
local rmatch = m_str_utils.match
local pluralize = require(en_utilities_module).pluralize
local u = m_str_utils.char
local ucfirst = m_str_utils.ucfirst
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
function export.affix_variants(canonical, variants)
local mappings = {}
for _, variant in ipairs(variants) do
mappings[variant] = canonical
end
return mappings
end
function export.id_mapping(default, ids)
local mapping = { default = default }
if ids then
for id, target in pairs(ids) do
mapping[id] = target
end
end
return mapping
end
function export.id_mapping_with_affix_variants(base, id_variants)
local mappings = {}
for id, variants in pairs(id_variants) do
for _, variant in ipairs(variants) do
mappings[variant] = export.id_mapping(base, {[id] = base})
end
end
return mappings
end
function export.merge_tables(...)
local result = {}
for i = 1, select('#', ...) do
local t = select(i, ...)
if t then
for k, v in pairs(t) do
result[k] = v
end
end
end
return result
end
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.langs_with_lang_specific_data = {
["az"] = true,
["fi"] = true,
["fr"] = true,
["izh"] = true,
["la"] = true,
["sah"] = true,
["tr"] = true,
["trk-pro"] = true,
}
local default_pos = "term"
-----------------------------------------------------------------------------------------
-- Template and display hyphens --
-----------------------------------------------------------------------------------------
local ZWNJ = u(0x200C) -- zero-width non-joiner
local template_hyphens = {
["Arab"] = "ـ" .. ZWNJ .. "-",
["Aran"] = "ـ" .. ZWNJ .. "-",
["Hebr"] = "־",
["Mong"] = "᠊",
}
local lookup_hyphens = {
["Hebr"] = "־",
["Arab"] = "ـ",
["Aran"] = "ـ",
}
local function default_display_hyphen(script, hyph)
if not hyph then
return template_hyphens[script] or "-"
end
return hyph
end
local function arab_get_display_hyphen(_script, hyph)
if not hyph then
return "ـ" -- tatweel
elseif hyph == ZWNJ then
return ""
else
return hyph
end
end
local function no_display_hyphen(_script, _hyph)
return ""
end
local display_hyphens = {
["Arab"] = arab_get_display_hyphen,
["Aran"] = arab_get_display_hyphen,
["Bopo"] = no_display_hyphen,
["Hani"] = no_display_hyphen,
["Hans"] = no_display_hyphen,
["Hant"] = no_display_hyphen,
["Jpan"] = no_display_hyphen,
["Jurc"] = no_display_hyphen,
["Kitl"] = no_display_hyphen,
["Kits"] = no_display_hyphen,
["Laoo"] = no_display_hyphen,
["Nshu"] = no_display_hyphen,
["Shui"] = no_display_hyphen,
["Tang"] = no_display_hyphen,
["Thaa"] = no_display_hyphen,
["Thai"] = no_display_hyphen,
["Tibt"] = no_display_hyphen,
}
-----------------------------------------------------------------------------------------
-- Basic Utility functions --
-----------------------------------------------------------------------------------------
local function glossary_link(entry, text)
text = text or entry
return "[[Lampiran:Glosari#" .. entry .. "|" .. text .. "]]"
end
local function track(page)
if type(page) == "table" then
for i, pg in ipairs(page) do
page[i] = "affix/" .. pg
end
else
page = "affix/" .. page
end
require("Module:debug/track")(page)
end
local function ine(val)
return val ~= "" and val or nil
end
-----------------------------------------------------------------------------------------
-- Compound types --
-----------------------------------------------------------------------------------------
local function make_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext) .. " majmuk",
cat = typ .. " majmuk",
}
end
local function make_non_glossary_compound_type(typ, alttext)
local link = alttext and "[[" .. typ .. "|" .. alttext .. "]]" or "[[" .. typ .. "]]"
return {
text = link .. " majmuk",
cat = typ .. " majmuk",
}
end
local function make_raw_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
cat = pluralize(typ),
}
end
local function make_borrowing_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
borrowing_type = pluralize(typ),
}
end
export.etymology_types = {
["adapted borrowing"] = make_borrowing_type("adapted borrowing"),
["adap"] = "adapted borrowing",
["abor"] = "adapted borrowing",
["alliterative"] = make_non_glossary_compound_type("alliterative"),
["allit"] = "alliterative",
["antonymous"] = make_non_glossary_compound_type("antonymous"),
["ant"] = "antonymous",
["bahuvrihi"] = make_compound_type("bahuvrihi", "bahuvrīhi"),
["bahu"] = "bahuvrihi",
["bv"] = "bahuvrihi",
["coordinative"] = make_compound_type("coordinative"),
["coord"] = "coordinative",
["descriptive"] = make_compound_type("descriptive"),
["desc"] = "descriptive",
["determinative"] = make_compound_type("determinative"),
["det"] = "determinative",
["dvandva"] = make_compound_type("dvandva"),
["dva"] = "dvandva",
["dvigu"] = make_compound_type("dvigu"),
["dvi"] = "dvigu",
["endocentric"] = make_compound_type("endocentric"),
["endo"] = "endocentric",
["exocentric"] = make_compound_type("exocentric"),
["exo"] = "exocentric",
["izafet I"] = make_compound_type("izafet I"),
["iz1"] = "izafet I",
["izafet II"] = make_compound_type("izafet II"),
["iz2"] = "izafet II",
["izafet III"] = make_compound_type("izafet III"),
["iz3"] = "izafet III",
["karmadharaya"] = make_compound_type("karmadharaya", "karmadhāraya"),
["karma"] = "karmadharaya",
["kd"] = "karmadharaya",
["kenning"] = make_raw_compound_type("kenning"),
["ken"] = "kenning",
["rhyming"] = make_non_glossary_compound_type("rhyming"),
["rhy"] = "rhyming",
["synonymous"] = make_non_glossary_compound_type("synonymous"),
["syn"] = "synonymous",
["tatpurusa"] = make_compound_type("tatpurusa", "tatpuruṣa"),
["tat"] = "tatpurusa",
["tp"] = "tatpurusa",
}
local function process_etymology_type(typ, nocap, notext, has_parts, lang)
local text_sections = {}
local categories = {}
local borrowing_type
if typ then
local typdata = export.etymology_types[typ]
if type(typdata) == "string" then
typdata = export.etymology_types[typdata]
end
if not typdata then
error("Internal error: Unrecognized type '" .. typ .. "'")
end
local text = typdata.text
if not nocap then
text = ucfirst(text)
end
local cat = typdata.cat
borrowing_type = typdata.borrowing_type
local oftext = typdata.oftext or " of"
if not notext then
table.insert(text_sections, text)
if has_parts then
table.insert(text_sections, oftext)
table.insert(text_sections, " ")
end
end
if cat then
table.insert(categories, cat .. " bahasa " .. lang:getFullName())
end
end
return text_sections, categories, borrowing_type
end
-----------------------------------------------------------------------------------------
-- Utility functions --
-----------------------------------------------------------------------------------------
local function ipairs_with_gaps(t)
local indices = m_table.numKeys(t)
local max_index = #indices > 0 and math.max(unpack(indices)) or 0
local i = 0
return function()
if i < max_index then
i = i + 1
return i, t[i]
end
end
end
export.ipairs_with_gaps = ipairs_with_gaps
function export.join_formatted_parts(data)
local cattext
local lang = data.data.lang
local force_cat = data.data.force_cat or debug_force_cat
if data.data.nocat then
cattext = ""
else
for i, cat in ipairs(data.categories) do
if type(cat) == "table" then
data.categories[i] = require(utilities_module).format_categories({cat.cat},
lang, cat.sort_key, cat.sort_base, force_cat)
else
data.categories[i] = require(utilities_module).format_categories({cat}, lang,
data.data.sort_key, nil, force_cat)
end
end
cattext = table.concat(data.categories)
end
local result = table.concat(data.parts_formatted, not data.separator_already_added and " +‎ " or nil) ..
(data.data.lit and ", secara harfiah " .. m_links.mark(data.data.lit, "gloss") or "")
local q = data.data.q
local qq = data.data.qq
local l = data.data.l
local ll = data.data.ll
local infl = data.data.infl
if q and q[1] or qq and qq[1] or l and l[1] or ll and ll[1] or infl and infl[1] then
result = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = result,
q = q,
qq = qq,
l = l,
ll = ll,
infl = infl,
}
end
return result .. cattext
end
local function strip_diacritics_no_links(lang, term)
return lang:stripDiacritics(m_links.remove_links(term))
end
local function canonicalize_part(part, lang, sc)
if not part then
return
end
part.part_lang = part.lang
part.lang = part.lang or lang
part.sc = part.sc or sc
local term = part.term
if not term then
return
elseif not part.fragment then
part.term, part.fragment = m_links.get_fragment(term)
else
part.term = m_links.get_fragment(term)
end
end
function export.link_term(part, data, include_separator)
local result
if part.part_lang then
result = require(etymology_module).format_derived {
terms = {part},
lang = "bahasa " .. data.lang,
sources = {part.lang},
sort_key = data.sort_key,
nocat = data.nocat,
template_name = "affix",
qualifiers_labels_on_outside = true,
borrowing_type = data.borrowing_type,
force_cat = data.force_cat or debug_force_cat,
}
else
result = m_links.full_link(part, "term", nil, "show qualifiers")
end
if include_separator and part.separator then
return part.separator .. result
else
return result
end
end
local function canonicalize_script_code(scode)
return (scode:gsub("^.*%-", ""))
end
-----------------------------------------------------------------------------------------
-- Affix-handling functions --
-----------------------------------------------------------------------------------------
local function detect_script_and_hyphens(text, lang, sc)
local scode
if sc then
scode = sc:getCode()
else
local possible_script_codes = lang:getScriptCodes()
local num_possible_script_codes = m_table.length(possible_script_codes)
if num_possible_script_codes == 0 then
error("Something is majorly wrong! Language " .. lang:getCanonicalName() .. " has no script codes.")
end
if num_possible_script_codes == 1 then
scode = possible_script_codes[1]
else
local may_have_nondefault_hyphen = false
for _, script_code in ipairs(possible_script_codes) do
script_code = canonicalize_script_code(script_code)
if template_hyphens[script_code] or display_hyphens[script_code] then
may_have_nondefault_hyphen = true
break
end
end
if not may_have_nondefault_hyphen then
scode = "Latn"
else
scode = lang:findBestScript(text):getCode()
end
end
end
scode = canonicalize_script_code(scode)
local template_hyphen = template_hyphens[scode] or "-"
local lookup_hyphen = lookup_hyphens[scode] or "-"
local display_hyphen = display_hyphens[scode] or default_display_hyphen
return scode, template_hyphen, display_hyphen, lookup_hyphen
end
local function reconstruct_term_per_hyphens(term, affix_type, scode, thyph_re, new_hyphen)
local function get_hyphen(hyph)
if type(new_hyphen) == "string" then
return new_hyphen
end
return new_hyphen(scode, hyph)
end
if affix_type == "non-affix" then
return term
elseif affix_type == "apitan" then
local before, before_hyphen, after_hyphen, after = rmatch(term, "^(.*)" .. thyph_re .. " " .. thyph_re
.. "(.*)$")
if not before or ulen(term) <= 3 then
return term
end
return before .. get_hyphen(before_hyphen) .. " " .. get_hyphen(after_hyphen) .. after
elseif affix_type == "sisipan" or affix_type == "jalinan" then
local before_hyphen, middle, after_hyphen = rmatch(term, "^" .. thyph_re .. "(.*)" .. thyph_re .. "$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "awalan" then
local middle, after_hyphen = rmatch(term, "^(.*)" .. thyph_re .. "$")
if middle and ulen(term) <= 1 then
return term
end
return (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "akhiran" then
local before_hyphen, middle = rmatch(term, "^" .. thyph_re .. "(.*)$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term)
else
error(("Internal error: Unrecognized affix type '%s'"):format(affix_type))
end
end
local function lookup_affix_mapping(affix, affix_type, lang, scode, thyph_re, lookup_hyph, affix_id)
local function do_lookup(afx)
local lookup_affix = reconstruct_term_per_hyphens(afx, affix_type, scode, thyph_re, lookup_hyph)
local function do_lookup_for_langcode(langcode)
if export.langs_with_lang_specific_data[langcode] then
local langdata = mw.loadData(export.affix_lang_data_module_prefix .. langcode)
if langdata.affix_mappings then
local mapping = langdata.affix_mappings[lookup_affix]
if mapping then
if type(mapping) == "table" then
mapping = mapping[affix_id] or mapping.default or mapping[affix_id or false]
if mapping then
return mapping
end
else
return mapping
end
end
end
end
end
local langcode = lang:getCode()
local mapping = do_lookup_for_langcode(langcode)
if mapping then
return mapping
end
local full_langcode = lang:getFullCode()
if full_langcode ~= langcode then
mapping = do_lookup_for_langcode(full_langcode)
if mapping then
return mapping
end
end
return nil
end
if affix:find("%[%[") then
return nil
end
return do_lookup(affix) or do_lookup(lang:stripDiacritics(affix)) or nil
end
function export.parse_term_for_affixes(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not term then
return "non-affix", nil, nil, nil
end
if term == "^" then
term = ""
return "non-affix", term, term, term
end
if term:find("^%^") then
local langcode = lang:getCode()
if langcode ~= "ko" and langcode ~= "okm" and langcode ~= "jje" then
error("Use of ^ to force non-affix status is no longer supported; use an inline modifier <naf> or <root> " ..
"after the component")
end
end
local reconstructed = ""
if term:find("^%*") then
reconstructed = "*"
term = term:gsub("^%*", "")
end
local scode, thyph, dhyph, lhyph = detect_script_and_hyphens(term, lang, sc)
thyph = "([" .. thyph .. "])"
if not affix_type then
if rfind(term, thyph .. " " .. thyph) then
affix_type = "apitan"
else
local has_beginning_hyphen = rfind(term, "^" .. thyph)
local has_ending_hyphen = rfind(term, thyph .. "$")
if has_beginning_hyphen and has_ending_hyphen then
affix_type = "jalinan"
elseif has_ending_hyphen then
affix_type = "awalan"
elseif has_beginning_hyphen then
affix_type = "akhiran"
else
affix_type = "non-affix"
end
end
end
local link_term, display_term, lookup_term
if affix_type == "non-affix" then
link_term = term
display_term = term
lookup_term = term
else
display_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, dhyph)
if do_affix_mapping then
link_term = lookup_affix_mapping(term, affix_type, lang, scode, thyph, lhyph, affix_id)
if link_term then
link_term = reconstruct_term_per_hyphens(link_term, affix_type, scode, thyph, dhyph)
else
link_term = display_term
end
else
link_term = display_term
end
if return_lookup_affix then
lookup_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, lhyph)
else
lookup_term = display_term
end
end
link_term = reconstructed .. link_term
display_term = reconstructed .. display_term
lookup_term = reconstructed .. lookup_term
return affix_type, link_term, display_term, lookup_term
end
function export.make_affix(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not (affix_type == "awalan" or affix_type == "akhiran" or affix_type == "apitan" or affix_type == "sisipan" or
affix_type == "jalinan" or affix_type == "non-affix") then
error("Internal error: Invalid affix type " .. (affix_type or "(nil)"))
end
local _, link_term, display_term, lookup_term = export.parse_term_for_affixes(term, lang, sc, affix_type,
do_affix_mapping, return_lookup_affix, affix_id)
return link_term, display_term, lookup_term
end
-----------------------------------------------------------------------------------------
-- Main entry points --
-----------------------------------------------------------------------------------------
local function generate_affix_categories(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.surface_analysis or data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local whole_words = 0
local is_affix_or_compound = false
for i, part in ipairs_with_gaps(data.parts) do
part = part or {}
data.parts[i] = part
canonicalize_part(part, data.lang, data.sc)
part.affix_type, part.affix_link_term, part.affix_display_term = export.parse_term_for_affixes(part.term,
part.lang, part.sc, part.type, not part.alt, nil, part.id)
part.term = ine(part.affix_link_term)
part.alt = part.alt or (part.affix_display_term ~= part.affix_link_term and part.affix_display_term) or nil
end
if not data.noaffixcat then
for i, part in ipairs_with_gaps(data.parts) do
local affix_type = part.affix_type
if affix_type ~= "non-affix" then
is_affix_or_compound = true
local part_sort_base = nil
local part_sort = part.sort or data.sort_key
if i == 1 and data.parts[2] and data.parts[2].term then
local part2 = data.parts[2]
part_sort_base = ine(part2.affix_link_term) or ine(part2.alt)
if part_sort_base then
part_sort_base = strip_diacritics_no_links(part2.lang, part_sort_base)
end
end
if part.pos and rfind(part.pos, "patronym") then
table.insert(categories, {cat = "Patronim bahasa " .. data.lang:getFullName(), sort_key = part_sort, sort_base = part_sort_base})
end
if data.pos ~= "terms" and part.pos and rfind(part.pos, "diminutive") then
table.insert(categories, {cat = ucfirst(data.pos) .. " diminutif bahasa " .. data.lang:getFullName(), sort_key = part_sort,
sort_base = part_sort_base})
end
if ine(part.affix_link_term) and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, part.affix_link_term) ..
(part.id and " (" .. part.id .. ")" or ""),
sort_key = part_sort, sort_base = part_sort_base})
end
else
whole_words = whole_words + 1
if whole_words == 2 then
is_affix_or_compound = true
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
end
end
end
if not is_affix_or_compound and not data.allow_no_affixes_or_compounds then
error("The parameters did not include any affixes, and the term is not a compound. Please provide at least one affix.")
end
end
return text_sections, categories, borrowing_type
end
function export.show_affix(data)
local text_sections, categories, _ = generate_affix_categories(data)
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if data.surface_analysis then
local text = "dengan " .. glossary_link("surface analysis") .. ", "
if not data.nocap then
text = ucfirst(text)
end
table.insert(text_sections, 1, text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.get_affix_categories_only(data)
local _, categories, _ = generate_affix_categories(data)
return categories
end
function export.show_surface_analysis(data)
data.surface_analysis = true
data.allow_no_affixes_or_compounds = true
return export.show_affix(data)
end
function export.show_compound(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local parts_formatted = {}
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
local whole_words = 0
for i, part in ipairs(data.parts) do
canonicalize_part(part, data.lang, data.sc)
local affix_type, link_term, display_term = export.parse_term_for_affixes(part.term, part.lang, part.sc,
part.type, not part.alt, nil, part.id)
if affix_type == "jalinan" or (part.type and part.type ~= "non-affix") then
if link_term and link_term ~= "" and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, link_term), sort_key = part.sort or data.sort_key})
end
part.term = link_term ~= "" and link_term or nil
part.alt = part.alt or (display_term ~= link_term and display_term) or nil
else
if affix_type ~= "non-affix" then
local langcode = data.lang:getCode()
track { affix_type, affix_type .. "/lang/" .. langcode }
local full_langcode = data.lang:getFullCode()
if langcode ~= full_langcode then
track(affix_type .. "/lang/" .. full_langcode)
end
else
whole_words = whole_words + 1
end
end
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if whole_words == 1 then
track("one whole word")
elseif whole_words == 0 then
track("looks like confix")
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.show_compound_like(data)
data.allow_no_affixes_or_compounds = true
local text_sections, categories, _ = generate_affix_categories(data)
if data.cat then
table.insert(categories, data.cat .. " bahasa " .. data.lang:getFullName())
end
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if #data.parts > 0 and data.oftext then
table.insert(text_sections, 1, " " .. data.oftext .. " ")
end
if data.text then
table.insert(text_sections, 1, data.text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
local function make_part_into_affix(part, lang, sc, affix_type)
canonicalize_part(part, lang, sc)
local link_term, display_term = export.make_affix(part.term, part.lang, part.sc, affix_type, not part.alt, nil, part.id)
part.term = link_term
part.alt = part.alt and export.make_affix(part.alt, part.lang, part.sc, affix_type) or (display_term ~= link_term and display_term) or nil
local Latn = require(scripts_module).getByCode("Latn")
part.tr = export.make_affix(part.tr, part.lang, Latn, affix_type)
part.ts = export.make_affix(part.ts, part.lang, Latn, affix_type)
end
local function track_wrong_affix_type(template, part, expected_affix_type)
if part and not part.type then
local affix_type = export.parse_term_for_affixes(part.term, part.lang, part.sc)
if affix_type ~= expected_affix_type then
local part_name = expected_affix_type or "base"
local langcode = part.lang:getCode()
local full_langcode = part.lang:getFullCode()
require("Module:debug/track") {
template,
template .. "/" .. part_name,
template .. "/" .. part_name .. "/" .. (affix_type or "none"),
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. langcode
}
if full_langcode ~= langcode then
require("Module:debug/track")(
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. full_langcode
)
end
end
end
end
local function insert_affix_category(categories, pos, affix_type, part, sort_key, sort_base, lang)
if part.term and not part.part_lang then
local cat = ucfirst(pos) .. " bahasa " .. lang:getFullName() .. " ber" .. affix_type .. " dengan " .. strip_diacritics_no_links(part.lang, part.term) ..
(part.id and " (" .. part.id .. ")" or "")
if sort_key or sort_base then
table.insert(categories, {cat = cat, sort_key = sort_key, sort_base = sort_base})
else
table.insert(categories, cat)
end
end
end
function export.show_circumfix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("apitan", data.prefix, "awalan")
track_wrong_affix_type("apitan", data.base, nil)
track_wrong_affix_type("apitan", data.suffix, "akhiran")
local circumfix = nil
if data.prefix.term and data.suffix.term then
circumfix = data.prefix.term .. " " .. data.suffix.term
data.prefix.alt = data.prefix.alt or data.prefix.term
data.suffix.alt = data.suffix.alt or data.suffix.term
data.prefix.term = circumfix
data.suffix.term = circumfix
end
local parts_formatted = {}
local categories = {}
local sort_base
if data.base.term then
sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
end
table.insert(parts_formatted, export.link_term(data.prefix, data))
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.suffix, data))
if not data.prefix.part_lang then
table.insert(categories, {cat=ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " dengan apitan " .. strip_diacritics_no_links(data.prefix.lang,
circumfix), sort_key=data.sort_key, sort_base=sort_base})
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_confix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("confix", data.prefix, "awalan")
track_wrong_affix_type("confix", data.base, nil)
track_wrong_affix_type("confix", data.suffix, "akhiran")
local parts_formatted = {}
local prefix_sort_base
if data.base and data.base.term then
prefix_sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
elseif data.suffix.term then
prefix_sort_base = strip_diacritics_no_links(data.suffix.lang, data.suffix.term)
end
local categories = {}
table.insert(parts_formatted, export.link_term(data.prefix, data))
insert_affix_category(categories, data.pos, "awalan", data.prefix, data.sort_key, prefix_sort_base, data.lang)
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
end
table.insert(parts_formatted, export.link_term(data.suffix, data))
insert_affix_category(categories, data.pos, "akhiran", data.suffix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_infix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.infix, data.lang, data.sc, "sisipan")
track_wrong_affix_type("sisipan", data.base, nil)
track_wrong_affix_type("sisipan", data.infix, "sisipan")
local parts_formatted = {}
local categories = {}
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.infix, data))
insert_affix_category(categories, data.pos, "sisipan", data.infix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_prefix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, prefix in ipairs(data.prefixes) do
make_part_into_affix(prefix, data.lang, data.sc, "awalan")
end
for i, prefix in ipairs(data.prefixes) do
track_wrong_affix_type("awalan", prefix, "awalan")
end
track_wrong_affix_type("awalan", data.base, nil)
local parts_formatted = {}
local first_sort_base = nil
local categories = {}
if data.prefixes[2] then
first_sort_base = ine(data.prefixes[2].term) or ine(data.prefixes[2].alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.prefixes[2].lang, first_sort_base)
end
elseif data.base then
first_sort_base = ine(data.base.term) or ine(data.base.alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.base.lang, first_sort_base)
end
end
for i, prefix in ipairs(data.prefixes) do
table.insert(parts_formatted, export.link_term(prefix, data))
insert_affix_category(categories, data.pos, "awalan", prefix, data.sort_key, i == 1 and first_sort_base or nil, data.lang)
end
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_suffix(data)
local categories = {}
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, suffix in ipairs(data.suffixes) do
make_part_into_affix(suffix, data.lang, data.sc, "akhiran")
end
track_wrong_affix_type("akhiran", data.base, nil)
for i, suffix in ipairs(data.suffixes) do
track_wrong_affix_type("akhiran", suffix, "akhiran")
end
local parts_formatted = {}
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
for i, suffix in ipairs(data.suffixes) do
table.insert(parts_formatted, export.link_term(suffix, data))
end
for i, suffix in ipairs(data.suffixes) do
insert_affix_category(categories, data.pos, "akhiran", suffix, nil, nil, data.lang)
if suffix.pos and rfind(suffix.pos, "patronym") then
table.insert(categories, "Patronim bahasa " .. data.lang:getFullName())
end
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
return export
r14756u1oxst93dd0142i348lybryyb
373574
373570
2026-09-11T18:22:22Z
SNN95
2113
373574
Scribunto
text/plain
local export = {}
local debug_force_cat = false -- if set to true, always display categories even on userspace pages
local m_links = require("Module:links")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local etymology_module = "Module:etymology"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local utilities_module = "Module:utilities"
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.affix_lang_data_module_prefix = "Module:affix/lang-data/"
local ulen = m_str_utils.len
local rfind = m_str_utils.find
local rmatch = m_str_utils.match
local pluralize = require(en_utilities_module).pluralize
local u = m_str_utils.char
local ucfirst = m_str_utils.ucfirst
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
function export.affix_variants(canonical, variants)
local mappings = {}
for _, variant in ipairs(variants) do
mappings[variant] = canonical
end
return mappings
end
function export.id_mapping(default, ids)
local mapping = { default = default }
if ids then
for id, target in pairs(ids) do
mapping[id] = target
end
end
return mapping
end
function export.id_mapping_with_affix_variants(base, id_variants)
local mappings = {}
for id, variants in pairs(id_variants) do
for _, variant in ipairs(variants) do
mappings[variant] = export.id_mapping(base, {[id] = base})
end
end
return mappings
end
function export.merge_tables(...)
local result = {}
for i = 1, select('#', ...) do
local t = select(i, ...)
if t then
for k, v in pairs(t) do
result[k] = v
end
end
end
return result
end
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.langs_with_lang_specific_data = {
["az"] = true,
["fi"] = true,
["fr"] = true,
["izh"] = true,
["la"] = true,
["sah"] = true,
["tr"] = true,
["trk-pro"] = true,
}
local default_pos = "perkataan"
-----------------------------------------------------------------------------------------
-- Template and display hyphens --
-----------------------------------------------------------------------------------------
local ZWNJ = u(0x200C) -- zero-width non-joiner
local template_hyphens = {
["Arab"] = "ـ" .. ZWNJ .. "-",
["Aran"] = "ـ" .. ZWNJ .. "-",
["Hebr"] = "־",
["Mong"] = "᠊",
}
local lookup_hyphens = {
["Hebr"] = "־",
["Arab"] = "ـ",
["Aran"] = "ـ",
}
local function default_display_hyphen(script, hyph)
if not hyph then
return template_hyphens[script] or "-"
end
return hyph
end
local function arab_get_display_hyphen(_script, hyph)
if not hyph then
return "ـ" -- tatweel
elseif hyph == ZWNJ then
return ""
else
return hyph
end
end
local function no_display_hyphen(_script, _hyph)
return ""
end
local display_hyphens = {
["Arab"] = arab_get_display_hyphen,
["Aran"] = arab_get_display_hyphen,
["Bopo"] = no_display_hyphen,
["Hani"] = no_display_hyphen,
["Hans"] = no_display_hyphen,
["Hant"] = no_display_hyphen,
["Jpan"] = no_display_hyphen,
["Jurc"] = no_display_hyphen,
["Kitl"] = no_display_hyphen,
["Kits"] = no_display_hyphen,
["Laoo"] = no_display_hyphen,
["Nshu"] = no_display_hyphen,
["Shui"] = no_display_hyphen,
["Tang"] = no_display_hyphen,
["Thaa"] = no_display_hyphen,
["Thai"] = no_display_hyphen,
["Tibt"] = no_display_hyphen,
}
-----------------------------------------------------------------------------------------
-- Basic Utility functions --
-----------------------------------------------------------------------------------------
local function glossary_link(entry, text)
text = text or entry
return "[[Lampiran:Glosari#" .. entry .. "|" .. text .. "]]"
end
local function track(page)
if type(page) == "table" then
for i, pg in ipairs(page) do
page[i] = "affix/" .. pg
end
else
page = "affix/" .. page
end
require("Module:debug/track")(page)
end
local function ine(val)
return val ~= "" and val or nil
end
-----------------------------------------------------------------------------------------
-- Compound types --
-----------------------------------------------------------------------------------------
local function make_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext) .. " majmuk",
cat = typ .. " majmuk",
}
end
local function make_non_glossary_compound_type(typ, alttext)
local link = alttext and "[[" .. typ .. "|" .. alttext .. "]]" or "[[" .. typ .. "]]"
return {
text = link .. " majmuk",
cat = typ .. " majmuk",
}
end
local function make_raw_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
cat = pluralize(typ),
}
end
local function make_borrowing_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
borrowing_type = pluralize(typ),
}
end
export.etymology_types = {
["adapted borrowing"] = make_borrowing_type("adapted borrowing"),
["adap"] = "adapted borrowing",
["abor"] = "adapted borrowing",
["alliterative"] = make_non_glossary_compound_type("alliterative"),
["allit"] = "alliterative",
["antonymous"] = make_non_glossary_compound_type("antonymous"),
["ant"] = "antonymous",
["bahuvrihi"] = make_compound_type("bahuvrihi", "bahuvrīhi"),
["bahu"] = "bahuvrihi",
["bv"] = "bahuvrihi",
["coordinative"] = make_compound_type("coordinative"),
["coord"] = "coordinative",
["descriptive"] = make_compound_type("descriptive"),
["desc"] = "descriptive",
["determinative"] = make_compound_type("determinative"),
["det"] = "determinative",
["dvandva"] = make_compound_type("dvandva"),
["dva"] = "dvandva",
["dvigu"] = make_compound_type("dvigu"),
["dvi"] = "dvigu",
["endocentric"] = make_compound_type("endocentric"),
["endo"] = "endocentric",
["exocentric"] = make_compound_type("exocentric"),
["exo"] = "exocentric",
["izafet I"] = make_compound_type("izafet I"),
["iz1"] = "izafet I",
["izafet II"] = make_compound_type("izafet II"),
["iz2"] = "izafet II",
["izafet III"] = make_compound_type("izafet III"),
["iz3"] = "izafet III",
["karmadharaya"] = make_compound_type("karmadharaya", "karmadhāraya"),
["karma"] = "karmadharaya",
["kd"] = "karmadharaya",
["kenning"] = make_raw_compound_type("kenning"),
["ken"] = "kenning",
["rhyming"] = make_non_glossary_compound_type("rhyming"),
["rhy"] = "rhyming",
["synonymous"] = make_non_glossary_compound_type("synonymous"),
["syn"] = "synonymous",
["tatpurusa"] = make_compound_type("tatpurusa", "tatpuruṣa"),
["tat"] = "tatpurusa",
["tp"] = "tatpurusa",
}
local function process_etymology_type(typ, nocap, notext, has_parts, lang)
local text_sections = {}
local categories = {}
local borrowing_type
if typ then
local typdata = export.etymology_types[typ]
if type(typdata) == "string" then
typdata = export.etymology_types[typdata]
end
if not typdata then
error("Internal error: Unrecognized type '" .. typ .. "'")
end
local text = typdata.text
if not nocap then
text = ucfirst(text)
end
local cat = typdata.cat
borrowing_type = typdata.borrowing_type
local oftext = typdata.oftext or " of"
if not notext then
table.insert(text_sections, text)
if has_parts then
table.insert(text_sections, oftext)
table.insert(text_sections, " ")
end
end
if cat then
table.insert(categories, cat .. " bahasa " .. lang:getFullName())
end
end
return text_sections, categories, borrowing_type
end
-----------------------------------------------------------------------------------------
-- Utility functions --
-----------------------------------------------------------------------------------------
local function ipairs_with_gaps(t)
local indices = m_table.numKeys(t)
local max_index = #indices > 0 and math.max(unpack(indices)) or 0
local i = 0
return function()
if i < max_index then
i = i + 1
return i, t[i]
end
end
end
export.ipairs_with_gaps = ipairs_with_gaps
function export.join_formatted_parts(data)
local cattext
local lang = data.data.lang
local force_cat = data.data.force_cat or debug_force_cat
if data.data.nocat then
cattext = ""
else
for i, cat in ipairs(data.categories) do
if type(cat) == "table" then
data.categories[i] = require(utilities_module).format_categories({cat.cat},
lang, cat.sort_key, cat.sort_base, force_cat)
else
data.categories[i] = require(utilities_module).format_categories({cat}, lang,
data.data.sort_key, nil, force_cat)
end
end
cattext = table.concat(data.categories)
end
local result = table.concat(data.parts_formatted, not data.separator_already_added and " +‎ " or nil) ..
(data.data.lit and ", secara harfiah " .. m_links.mark(data.data.lit, "gloss") or "")
local q = data.data.q
local qq = data.data.qq
local l = data.data.l
local ll = data.data.ll
local infl = data.data.infl
if q and q[1] or qq and qq[1] or l and l[1] or ll and ll[1] or infl and infl[1] then
result = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = result,
q = q,
qq = qq,
l = l,
ll = ll,
infl = infl,
}
end
return result .. cattext
end
local function strip_diacritics_no_links(lang, term)
return lang:stripDiacritics(m_links.remove_links(term))
end
local function canonicalize_part(part, lang, sc)
if not part then
return
end
part.part_lang = part.lang
part.lang = part.lang or lang
part.sc = part.sc or sc
local term = part.term
if not term then
return
elseif not part.fragment then
part.term, part.fragment = m_links.get_fragment(term)
else
part.term = m_links.get_fragment(term)
end
end
function export.link_term(part, data, include_separator)
local result
if part.part_lang then
result = require(etymology_module).format_derived {
terms = {part},
lang = "bahasa " .. data.lang,
sources = {part.lang},
sort_key = data.sort_key,
nocat = data.nocat,
template_name = "affix",
qualifiers_labels_on_outside = true,
borrowing_type = data.borrowing_type,
force_cat = data.force_cat or debug_force_cat,
}
else
result = m_links.full_link(part, "perkataan", nil, "show qualifiers")
end
if include_separator and part.separator then
return part.separator .. result
else
return result
end
end
local function canonicalize_script_code(scode)
return (scode:gsub("^.*%-", ""))
end
-----------------------------------------------------------------------------------------
-- Affix-handling functions --
-----------------------------------------------------------------------------------------
local function detect_script_and_hyphens(text, lang, sc)
local scode
if sc then
scode = sc:getCode()
else
local possible_script_codes = lang:getScriptCodes()
local num_possible_script_codes = m_table.length(possible_script_codes)
if num_possible_script_codes == 0 then
error("Something is majorly wrong! Language " .. lang:getCanonicalName() .. " has no script codes.")
end
if num_possible_script_codes == 1 then
scode = possible_script_codes[1]
else
local may_have_nondefault_hyphen = false
for _, script_code in ipairs(possible_script_codes) do
script_code = canonicalize_script_code(script_code)
if template_hyphens[script_code] or display_hyphens[script_code] then
may_have_nondefault_hyphen = true
break
end
end
if not may_have_nondefault_hyphen then
scode = "Latn"
else
scode = lang:findBestScript(text):getCode()
end
end
end
scode = canonicalize_script_code(scode)
local template_hyphen = template_hyphens[scode] or "-"
local lookup_hyphen = lookup_hyphens[scode] or "-"
local display_hyphen = display_hyphens[scode] or default_display_hyphen
return scode, template_hyphen, display_hyphen, lookup_hyphen
end
local function reconstruct_term_per_hyphens(term, affix_type, scode, thyph_re, new_hyphen)
local function get_hyphen(hyph)
if type(new_hyphen) == "string" then
return new_hyphen
end
return new_hyphen(scode, hyph)
end
if affix_type == "non-affix" then
return term
elseif affix_type == "apitan" then
local before, before_hyphen, after_hyphen, after = rmatch(term, "^(.*)" .. thyph_re .. " " .. thyph_re
.. "(.*)$")
if not before or ulen(term) <= 3 then
return term
end
return before .. get_hyphen(before_hyphen) .. " " .. get_hyphen(after_hyphen) .. after
elseif affix_type == "sisipan" or affix_type == "jalinan" then
local before_hyphen, middle, after_hyphen = rmatch(term, "^" .. thyph_re .. "(.*)" .. thyph_re .. "$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "awalan" then
local middle, after_hyphen = rmatch(term, "^(.*)" .. thyph_re .. "$")
if middle and ulen(term) <= 1 then
return term
end
return (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "akhiran" then
local before_hyphen, middle = rmatch(term, "^" .. thyph_re .. "(.*)$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term)
else
error(("Internal error: Unrecognized affix type '%s'"):format(affix_type))
end
end
local function lookup_affix_mapping(affix, affix_type, lang, scode, thyph_re, lookup_hyph, affix_id)
local function do_lookup(afx)
local lookup_affix = reconstruct_term_per_hyphens(afx, affix_type, scode, thyph_re, lookup_hyph)
local function do_lookup_for_langcode(langcode)
if export.langs_with_lang_specific_data[langcode] then
local langdata = mw.loadData(export.affix_lang_data_module_prefix .. langcode)
if langdata.affix_mappings then
local mapping = langdata.affix_mappings[lookup_affix]
if mapping then
if type(mapping) == "table" then
mapping = mapping[affix_id] or mapping.default or mapping[affix_id or false]
if mapping then
return mapping
end
else
return mapping
end
end
end
end
end
local langcode = lang:getCode()
local mapping = do_lookup_for_langcode(langcode)
if mapping then
return mapping
end
local full_langcode = lang:getFullCode()
if full_langcode ~= langcode then
mapping = do_lookup_for_langcode(full_langcode)
if mapping then
return mapping
end
end
return nil
end
if affix:find("%[%[") then
return nil
end
return do_lookup(affix) or do_lookup(lang:stripDiacritics(affix)) or nil
end
function export.parse_term_for_affixes(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not term then
return "non-affix", nil, nil, nil
end
if term == "^" then
term = ""
return "non-affix", term, term, term
end
if term:find("^%^") then
local langcode = lang:getCode()
if langcode ~= "ko" and langcode ~= "okm" and langcode ~= "jje" then
error("Use of ^ to force non-affix status is no longer supported; use an inline modifier <naf> or <root> " ..
"after the component")
end
end
local reconstructed = ""
if term:find("^%*") then
reconstructed = "*"
term = term:gsub("^%*", "")
end
local scode, thyph, dhyph, lhyph = detect_script_and_hyphens(term, lang, sc)
thyph = "([" .. thyph .. "])"
if not affix_type then
if rfind(term, thyph .. " " .. thyph) then
affix_type = "apitan"
else
local has_beginning_hyphen = rfind(term, "^" .. thyph)
local has_ending_hyphen = rfind(term, thyph .. "$")
if has_beginning_hyphen and has_ending_hyphen then
affix_type = "jalinan"
elseif has_ending_hyphen then
affix_type = "awalan"
elseif has_beginning_hyphen then
affix_type = "akhiran"
else
affix_type = "non-affix"
end
end
end
local link_term, display_term, lookup_term
if affix_type == "non-affix" then
link_term = term
display_term = term
lookup_term = term
else
display_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, dhyph)
if do_affix_mapping then
link_term = lookup_affix_mapping(term, affix_type, lang, scode, thyph, lhyph, affix_id)
if link_term then
link_term = reconstruct_term_per_hyphens(link_term, affix_type, scode, thyph, dhyph)
else
link_term = display_term
end
else
link_term = display_term
end
if return_lookup_affix then
lookup_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, lhyph)
else
lookup_term = display_term
end
end
link_term = reconstructed .. link_term
display_term = reconstructed .. display_term
lookup_term = reconstructed .. lookup_term
return affix_type, link_term, display_term, lookup_term
end
function export.make_affix(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not (affix_type == "awalan" or affix_type == "akhiran" or affix_type == "apitan" or affix_type == "sisipan" or
affix_type == "jalinan" or affix_type == "non-affix") then
error("Internal error: Invalid affix type " .. (affix_type or "(nil)"))
end
local _, link_term, display_term, lookup_term = export.parse_term_for_affixes(term, lang, sc, affix_type,
do_affix_mapping, return_lookup_affix, affix_id)
return link_term, display_term, lookup_term
end
-----------------------------------------------------------------------------------------
-- Main entry points --
-----------------------------------------------------------------------------------------
local function generate_affix_categories(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.surface_analysis or data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local whole_words = 0
local is_affix_or_compound = false
for i, part in ipairs_with_gaps(data.parts) do
part = part or {}
data.parts[i] = part
canonicalize_part(part, data.lang, data.sc)
part.affix_type, part.affix_link_term, part.affix_display_term = export.parse_term_for_affixes(part.term,
part.lang, part.sc, part.type, not part.alt, nil, part.id)
part.term = ine(part.affix_link_term)
part.alt = part.alt or (part.affix_display_term ~= part.affix_link_term and part.affix_display_term) or nil
end
if not data.noaffixcat then
for i, part in ipairs_with_gaps(data.parts) do
local affix_type = part.affix_type
if affix_type ~= "non-affix" then
is_affix_or_compound = true
local part_sort_base = nil
local part_sort = part.sort or data.sort_key
if i == 1 and data.parts[2] and data.parts[2].term then
local part2 = data.parts[2]
part_sort_base = ine(part2.affix_link_term) or ine(part2.alt)
if part_sort_base then
part_sort_base = strip_diacritics_no_links(part2.lang, part_sort_base)
end
end
if part.pos and rfind(part.pos, "patronym") then
table.insert(categories, {cat = "Patronim bahasa " .. data.lang:getFullName(), sort_key = part_sort, sort_base = part_sort_base})
end
if data.pos ~= "terms" and part.pos and rfind(part.pos, "diminutive") then
table.insert(categories, {cat = ucfirst(data.pos) .. " diminutif bahasa " .. data.lang:getFullName(), sort_key = part_sort,
sort_base = part_sort_base})
end
if ine(part.affix_link_term) and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, part.affix_link_term) ..
(part.id and " (" .. part.id .. ")" or ""),
sort_key = part_sort, sort_base = part_sort_base})
end
else
whole_words = whole_words + 1
if whole_words == 2 then
is_affix_or_compound = true
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
end
end
end
if not is_affix_or_compound and not data.allow_no_affixes_or_compounds then
error("The parameters did not include any affixes, and the term is not a compound. Please provide at least one affix.")
end
end
return text_sections, categories, borrowing_type
end
function export.show_affix(data)
local text_sections, categories, _ = generate_affix_categories(data)
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if data.surface_analysis then
local text = "dengan " .. glossary_link("surface analysis") .. ", "
if not data.nocap then
text = ucfirst(text)
end
table.insert(text_sections, 1, text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.get_affix_categories_only(data)
local _, categories, _ = generate_affix_categories(data)
return categories
end
function export.show_surface_analysis(data)
data.surface_analysis = true
data.allow_no_affixes_or_compounds = true
return export.show_affix(data)
end
function export.show_compound(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local parts_formatted = {}
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
local whole_words = 0
for i, part in ipairs(data.parts) do
canonicalize_part(part, data.lang, data.sc)
local affix_type, link_term, display_term = export.parse_term_for_affixes(part.term, part.lang, part.sc,
part.type, not part.alt, nil, part.id)
if affix_type == "jalinan" or (part.type and part.type ~= "non-affix") then
if link_term and link_term ~= "" and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, link_term), sort_key = part.sort or data.sort_key})
end
part.term = link_term ~= "" and link_term or nil
part.alt = part.alt or (display_term ~= link_term and display_term) or nil
else
if affix_type ~= "non-affix" then
local langcode = data.lang:getCode()
track { affix_type, affix_type .. "/lang/" .. langcode }
local full_langcode = data.lang:getFullCode()
if langcode ~= full_langcode then
track(affix_type .. "/lang/" .. full_langcode)
end
else
whole_words = whole_words + 1
end
end
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if whole_words == 1 then
track("one whole word")
elseif whole_words == 0 then
track("looks like confix")
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.show_compound_like(data)
data.allow_no_affixes_or_compounds = true
local text_sections, categories, _ = generate_affix_categories(data)
if data.cat then
table.insert(categories, data.cat .. " bahasa " .. data.lang:getFullName())
end
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if #data.parts > 0 and data.oftext then
table.insert(text_sections, 1, " " .. data.oftext .. " ")
end
if data.text then
table.insert(text_sections, 1, data.text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
local function make_part_into_affix(part, lang, sc, affix_type)
canonicalize_part(part, lang, sc)
local link_term, display_term = export.make_affix(part.term, part.lang, part.sc, affix_type, not part.alt, nil, part.id)
part.term = link_term
part.alt = part.alt and export.make_affix(part.alt, part.lang, part.sc, affix_type) or (display_term ~= link_term and display_term) or nil
local Latn = require(scripts_module).getByCode("Latn")
part.tr = export.make_affix(part.tr, part.lang, Latn, affix_type)
part.ts = export.make_affix(part.ts, part.lang, Latn, affix_type)
end
local function track_wrong_affix_type(template, part, expected_affix_type)
if part and not part.type then
local affix_type = export.parse_term_for_affixes(part.term, part.lang, part.sc)
if affix_type ~= expected_affix_type then
local part_name = expected_affix_type or "base"
local langcode = part.lang:getCode()
local full_langcode = part.lang:getFullCode()
require("Module:debug/track") {
template,
template .. "/" .. part_name,
template .. "/" .. part_name .. "/" .. (affix_type or "none"),
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. langcode
}
if full_langcode ~= langcode then
require("Module:debug/track")(
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. full_langcode
)
end
end
end
end
local function insert_affix_category(categories, pos, affix_type, part, sort_key, sort_base, lang)
if part.term and not part.part_lang then
local cat = ucfirst(pos) .. " bahasa " .. lang:getFullName() .. " ber" .. affix_type .. " dengan " .. strip_diacritics_no_links(part.lang, part.term) ..
(part.id and " (" .. part.id .. ")" or "")
if sort_key or sort_base then
table.insert(categories, {cat = cat, sort_key = sort_key, sort_base = sort_base})
else
table.insert(categories, cat)
end
end
end
function export.show_circumfix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("apitan", data.prefix, "awalan")
track_wrong_affix_type("apitan", data.base, nil)
track_wrong_affix_type("apitan", data.suffix, "akhiran")
local circumfix = nil
if data.prefix.term and data.suffix.term then
circumfix = data.prefix.term .. " " .. data.suffix.term
data.prefix.alt = data.prefix.alt or data.prefix.term
data.suffix.alt = data.suffix.alt or data.suffix.term
data.prefix.term = circumfix
data.suffix.term = circumfix
end
local parts_formatted = {}
local categories = {}
local sort_base
if data.base.term then
sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
end
table.insert(parts_formatted, export.link_term(data.prefix, data))
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.suffix, data))
if not data.prefix.part_lang then
table.insert(categories, {cat=ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " dengan apitan " .. strip_diacritics_no_links(data.prefix.lang,
circumfix), sort_key=data.sort_key, sort_base=sort_base})
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_confix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("confix", data.prefix, "awalan")
track_wrong_affix_type("confix", data.base, nil)
track_wrong_affix_type("confix", data.suffix, "akhiran")
local parts_formatted = {}
local prefix_sort_base
if data.base and data.base.term then
prefix_sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
elseif data.suffix.term then
prefix_sort_base = strip_diacritics_no_links(data.suffix.lang, data.suffix.term)
end
local categories = {}
table.insert(parts_formatted, export.link_term(data.prefix, data))
insert_affix_category(categories, data.pos, "awalan", data.prefix, data.sort_key, prefix_sort_base, data.lang)
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
end
table.insert(parts_formatted, export.link_term(data.suffix, data))
insert_affix_category(categories, data.pos, "akhiran", data.suffix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_infix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.infix, data.lang, data.sc, "sisipan")
track_wrong_affix_type("sisipan", data.base, nil)
track_wrong_affix_type("sisipan", data.infix, "sisipan")
local parts_formatted = {}
local categories = {}
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.infix, data))
insert_affix_category(categories, data.pos, "sisipan", data.infix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_prefix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, prefix in ipairs(data.prefixes) do
make_part_into_affix(prefix, data.lang, data.sc, "awalan")
end
for i, prefix in ipairs(data.prefixes) do
track_wrong_affix_type("awalan", prefix, "awalan")
end
track_wrong_affix_type("awalan", data.base, nil)
local parts_formatted = {}
local first_sort_base = nil
local categories = {}
if data.prefixes[2] then
first_sort_base = ine(data.prefixes[2].term) or ine(data.prefixes[2].alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.prefixes[2].lang, first_sort_base)
end
elseif data.base then
first_sort_base = ine(data.base.term) or ine(data.base.alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.base.lang, first_sort_base)
end
end
for i, prefix in ipairs(data.prefixes) do
table.insert(parts_formatted, export.link_term(prefix, data))
insert_affix_category(categories, data.pos, "awalan", prefix, data.sort_key, i == 1 and first_sort_base or nil, data.lang)
end
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_suffix(data)
local categories = {}
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, suffix in ipairs(data.suffixes) do
make_part_into_affix(suffix, data.lang, data.sc, "akhiran")
end
track_wrong_affix_type("akhiran", data.base, nil)
for i, suffix in ipairs(data.suffixes) do
track_wrong_affix_type("akhiran", suffix, "akhiran")
end
local parts_formatted = {}
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
for i, suffix in ipairs(data.suffixes) do
table.insert(parts_formatted, export.link_term(suffix, data))
end
for i, suffix in ipairs(data.suffixes) do
insert_affix_category(categories, data.pos, "akhiran", suffix, nil, nil, data.lang)
if suffix.pos and rfind(suffix.pos, "patronym") then
table.insert(categories, "Patronim bahasa " .. data.lang:getFullName())
end
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
return export
lk9b5qws7y55achy421prvfsfdl2h74
373576
373574
2026-09-11T18:26:41Z
SNN95
2113
373576
Scribunto
text/plain
local export = {}
local debug_force_cat = false -- if set to true, always display categories even on userspace pages
local m_links = require("Module:links")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local etymology_module = "Module:etymology"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local utilities_module = "Module:utilities"
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.affix_lang_data_module_prefix = "Module:affix/lang-data/"
local ulen = m_str_utils.len
local rfind = m_str_utils.find
local rmatch = m_str_utils.match
local pluralize = require(en_utilities_module).pluralize
local u = m_str_utils.char
local ucfirst = m_str_utils.ucfirst
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
function export.affix_variants(canonical, variants)
local mappings = {}
for _, variant in ipairs(variants) do
mappings[variant] = canonical
end
return mappings
end
function export.id_mapping(default, ids)
local mapping = { default = default }
if ids then
for id, target in pairs(ids) do
mapping[id] = target
end
end
return mapping
end
function export.id_mapping_with_affix_variants(base, id_variants)
local mappings = {}
for id, variants in pairs(id_variants) do
for _, variant in ipairs(variants) do
mappings[variant] = export.id_mapping(base, {[id] = base})
end
end
return mappings
end
function export.merge_tables(...)
local result = {}
for i = 1, select('#', ...) do
local t = select(i, ...)
if t then
for k, v in pairs(t) do
result[k] = v
end
end
end
return result
end
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.langs_with_lang_specific_data = {
["az"] = true,
["fi"] = true,
["fr"] = true,
["izh"] = true,
["la"] = true,
["sah"] = true,
["tr"] = true,
["trk-pro"] = true,
}
local default_pos = "term"
-----------------------------------------------------------------------------------------
-- Template and display hyphens --
-----------------------------------------------------------------------------------------
local ZWNJ = u(0x200C) -- zero-width non-joiner
local template_hyphens = {
["Arab"] = "ـ" .. ZWNJ .. "-",
["Aran"] = "ـ" .. ZWNJ .. "-",
["Hebr"] = "־",
["Mong"] = "᠊",
}
local lookup_hyphens = {
["Hebr"] = "־",
["Arab"] = "ـ",
["Aran"] = "ـ",
}
local function default_display_hyphen(script, hyph)
if not hyph then
return template_hyphens[script] or "-"
end
return hyph
end
local function arab_get_display_hyphen(_script, hyph)
if not hyph then
return "ـ" -- tatweel
elseif hyph == ZWNJ then
return ""
else
return hyph
end
end
local function no_display_hyphen(_script, _hyph)
return ""
end
local display_hyphens = {
["Arab"] = arab_get_display_hyphen,
["Aran"] = arab_get_display_hyphen,
["Bopo"] = no_display_hyphen,
["Hani"] = no_display_hyphen,
["Hans"] = no_display_hyphen,
["Hant"] = no_display_hyphen,
["Jpan"] = no_display_hyphen,
["Jurc"] = no_display_hyphen,
["Kitl"] = no_display_hyphen,
["Kits"] = no_display_hyphen,
["Laoo"] = no_display_hyphen,
["Nshu"] = no_display_hyphen,
["Shui"] = no_display_hyphen,
["Tang"] = no_display_hyphen,
["Thaa"] = no_display_hyphen,
["Thai"] = no_display_hyphen,
["Tibt"] = no_display_hyphen,
}
-----------------------------------------------------------------------------------------
-- Basic Utility functions --
-----------------------------------------------------------------------------------------
local function glossary_link(entry, text)
text = text or entry
return "[[Lampiran:Glosari#" .. entry .. "|" .. text .. "]]"
end
local function track(page)
if type(page) == "table" then
for i, pg in ipairs(page) do
page[i] = "affix/" .. pg
end
else
page = "affix/" .. page
end
require("Module:debug/track")(page)
end
local function ine(val)
return val ~= "" and val or nil
end
-----------------------------------------------------------------------------------------
-- Compound types --
-----------------------------------------------------------------------------------------
local function make_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext) .. " majmuk",
cat = typ .. " majmuk",
}
end
local function make_non_glossary_compound_type(typ, alttext)
local link = alttext and "[[" .. typ .. "|" .. alttext .. "]]" or "[[" .. typ .. "]]"
return {
text = link .. " majmuk",
cat = typ .. " majmuk",
}
end
local function make_raw_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
cat = pluralize(typ),
}
end
local function make_borrowing_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
borrowing_type = pluralize(typ),
}
end
export.etymology_types = {
["adapted borrowing"] = make_borrowing_type("adapted borrowing"),
["adap"] = "adapted borrowing",
["abor"] = "adapted borrowing",
["alliterative"] = make_non_glossary_compound_type("alliterative"),
["allit"] = "alliterative",
["antonymous"] = make_non_glossary_compound_type("antonymous"),
["ant"] = "antonymous",
["bahuvrihi"] = make_compound_type("bahuvrihi", "bahuvrīhi"),
["bahu"] = "bahuvrihi",
["bv"] = "bahuvrihi",
["coordinative"] = make_compound_type("coordinative"),
["coord"] = "coordinative",
["descriptive"] = make_compound_type("descriptive"),
["desc"] = "descriptive",
["determinative"] = make_compound_type("determinative"),
["det"] = "determinative",
["dvandva"] = make_compound_type("dvandva"),
["dva"] = "dvandva",
["dvigu"] = make_compound_type("dvigu"),
["dvi"] = "dvigu",
["endocentric"] = make_compound_type("endocentric"),
["endo"] = "endocentric",
["exocentric"] = make_compound_type("exocentric"),
["exo"] = "exocentric",
["izafet I"] = make_compound_type("izafet I"),
["iz1"] = "izafet I",
["izafet II"] = make_compound_type("izafet II"),
["iz2"] = "izafet II",
["izafet III"] = make_compound_type("izafet III"),
["iz3"] = "izafet III",
["karmadharaya"] = make_compound_type("karmadharaya", "karmadhāraya"),
["karma"] = "karmadharaya",
["kd"] = "karmadharaya",
["kenning"] = make_raw_compound_type("kenning"),
["ken"] = "kenning",
["rhyming"] = make_non_glossary_compound_type("rhyming"),
["rhy"] = "rhyming",
["synonymous"] = make_non_glossary_compound_type("synonymous"),
["syn"] = "synonymous",
["tatpurusa"] = make_compound_type("tatpurusa", "tatpuruṣa"),
["tat"] = "tatpurusa",
["tp"] = "tatpurusa",
}
local function process_etymology_type(typ, nocap, notext, has_parts, lang)
local text_sections = {}
local categories = {}
local borrowing_type
if typ then
local typdata = export.etymology_types[typ]
if type(typdata) == "string" then
typdata = export.etymology_types[typdata]
end
if not typdata then
error("Internal error: Unrecognized type '" .. typ .. "'")
end
local text = typdata.text
if not nocap then
text = ucfirst(text)
end
local cat = typdata.cat
borrowing_type = typdata.borrowing_type
local oftext = typdata.oftext or " of"
if not notext then
table.insert(text_sections, text)
if has_parts then
table.insert(text_sections, oftext)
table.insert(text_sections, " ")
end
end
if cat then
table.insert(categories, cat .. " bahasa " .. lang:getFullName())
end
end
return text_sections, categories, borrowing_type
end
-----------------------------------------------------------------------------------------
-- Utility functions --
-----------------------------------------------------------------------------------------
local function ipairs_with_gaps(t)
local indices = m_table.numKeys(t)
local max_index = #indices > 0 and math.max(unpack(indices)) or 0
local i = 0
return function()
if i < max_index then
i = i + 1
return i, t[i]
end
end
end
export.ipairs_with_gaps = ipairs_with_gaps
function export.join_formatted_parts(data)
local cattext
local lang = data.data.lang
local force_cat = data.data.force_cat or debug_force_cat
if data.data.nocat then
cattext = ""
else
for i, cat in ipairs(data.categories) do
if type(cat) == "table" then
data.categories[i] = require(utilities_module).format_categories({cat.cat},
lang, cat.sort_key, cat.sort_base, force_cat)
else
data.categories[i] = require(utilities_module).format_categories({cat}, lang,
data.data.sort_key, nil, force_cat)
end
end
cattext = table.concat(data.categories)
end
local result = table.concat(data.parts_formatted, not data.separator_already_added and " +‎ " or nil) ..
(data.data.lit and ", secara harfiah " .. m_links.mark(data.data.lit, "gloss") or "")
local q = data.data.q
local qq = data.data.qq
local l = data.data.l
local ll = data.data.ll
local infl = data.data.infl
if q and q[1] or qq and qq[1] or l and l[1] or ll and ll[1] or infl and infl[1] then
result = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = result,
q = q,
qq = qq,
l = l,
ll = ll,
infl = infl,
}
end
return result .. cattext
end
local function strip_diacritics_no_links(lang, term)
return lang:stripDiacritics(m_links.remove_links(term))
end
local function canonicalize_part(part, lang, sc)
if not part then
return
end
part.part_lang = part.lang
part.lang = part.lang or lang
part.sc = part.sc or sc
local term = part.term
if not term then
return
elseif not part.fragment then
part.term, part.fragment = m_links.get_fragment(term)
else
part.term = m_links.get_fragment(term)
end
end
function export.link_term(part, data, include_separator)
local result
if part.part_lang then
result = require(etymology_module).format_derived {
terms = {part},
lang = "bahasa " .. data.lang,
sources = {part.lang},
sort_key = data.sort_key,
nocat = data.nocat,
template_name = "affix",
qualifiers_labels_on_outside = true,
borrowing_type = data.borrowing_type,
force_cat = data.force_cat or debug_force_cat,
}
else
result = m_links.full_link(part, "term", nil, "show qualifiers")
end
if include_separator and part.separator then
return part.separator .. result
else
return result
end
end
local function canonicalize_script_code(scode)
return (scode:gsub("^.*%-", ""))
end
-----------------------------------------------------------------------------------------
-- Affix-handling functions --
-----------------------------------------------------------------------------------------
local function detect_script_and_hyphens(text, lang, sc)
local scode
if sc then
scode = sc:getCode()
else
local possible_script_codes = lang:getScriptCodes()
local num_possible_script_codes = m_table.length(possible_script_codes)
if num_possible_script_codes == 0 then
error("Something is majorly wrong! Language " .. lang:getCanonicalName() .. " has no script codes.")
end
if num_possible_script_codes == 1 then
scode = possible_script_codes[1]
else
local may_have_nondefault_hyphen = false
for _, script_code in ipairs(possible_script_codes) do
script_code = canonicalize_script_code(script_code)
if template_hyphens[script_code] or display_hyphens[script_code] then
may_have_nondefault_hyphen = true
break
end
end
if not may_have_nondefault_hyphen then
scode = "Latn"
else
scode = lang:findBestScript(text):getCode()
end
end
end
scode = canonicalize_script_code(scode)
local template_hyphen = template_hyphens[scode] or "-"
local lookup_hyphen = lookup_hyphens[scode] or "-"
local display_hyphen = display_hyphens[scode] or default_display_hyphen
return scode, template_hyphen, display_hyphen, lookup_hyphen
end
local function reconstruct_term_per_hyphens(term, affix_type, scode, thyph_re, new_hyphen)
local function get_hyphen(hyph)
if type(new_hyphen) == "string" then
return new_hyphen
end
return new_hyphen(scode, hyph)
end
if affix_type == "non-affix" then
return term
elseif affix_type == "apitan" then
local before, before_hyphen, after_hyphen, after = rmatch(term, "^(.*)" .. thyph_re .. " " .. thyph_re
.. "(.*)$")
if not before or ulen(term) <= 3 then
return term
end
return before .. get_hyphen(before_hyphen) .. " " .. get_hyphen(after_hyphen) .. after
elseif affix_type == "sisipan" or affix_type == "jalinan" then
local before_hyphen, middle, after_hyphen = rmatch(term, "^" .. thyph_re .. "(.*)" .. thyph_re .. "$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "awalan" then
local middle, after_hyphen = rmatch(term, "^(.*)" .. thyph_re .. "$")
if middle and ulen(term) <= 1 then
return term
end
return (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "akhiran" then
local before_hyphen, middle = rmatch(term, "^" .. thyph_re .. "(.*)$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term)
else
error(("Internal error: Unrecognized affix type '%s'"):format(affix_type))
end
end
local function lookup_affix_mapping(affix, affix_type, lang, scode, thyph_re, lookup_hyph, affix_id)
local function do_lookup(afx)
local lookup_affix = reconstruct_term_per_hyphens(afx, affix_type, scode, thyph_re, lookup_hyph)
local function do_lookup_for_langcode(langcode)
if export.langs_with_lang_specific_data[langcode] then
local langdata = mw.loadData(export.affix_lang_data_module_prefix .. langcode)
if langdata.affix_mappings then
local mapping = langdata.affix_mappings[lookup_affix]
if mapping then
if type(mapping) == "table" then
mapping = mapping[affix_id] or mapping.default or mapping[affix_id or false]
if mapping then
return mapping
end
else
return mapping
end
end
end
end
end
local langcode = lang:getCode()
local mapping = do_lookup_for_langcode(langcode)
if mapping then
return mapping
end
local full_langcode = lang:getFullCode()
if full_langcode ~= langcode then
mapping = do_lookup_for_langcode(full_langcode)
if mapping then
return mapping
end
end
return nil
end
if affix:find("%[%[") then
return nil
end
return do_lookup(affix) or do_lookup(lang:stripDiacritics(affix)) or nil
end
function export.parse_term_for_affixes(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not term then
return "non-affix", nil, nil, nil
end
if term == "^" then
term = ""
return "non-affix", term, term, term
end
if term:find("^%^") then
local langcode = lang:getCode()
if langcode ~= "ko" and langcode ~= "okm" and langcode ~= "jje" then
error("Use of ^ to force non-affix status is no longer supported; use an inline modifier <naf> or <root> " ..
"after the component")
end
end
local reconstructed = ""
if term:find("^%*") then
reconstructed = "*"
term = term:gsub("^%*", "")
end
local scode, thyph, dhyph, lhyph = detect_script_and_hyphens(term, lang, sc)
thyph = "([" .. thyph .. "])"
if not affix_type then
if rfind(term, thyph .. " " .. thyph) then
affix_type = "apitan"
else
local has_beginning_hyphen = rfind(term, "^" .. thyph)
local has_ending_hyphen = rfind(term, thyph .. "$")
if has_beginning_hyphen and has_ending_hyphen then
affix_type = "jalinan"
elseif has_ending_hyphen then
affix_type = "awalan"
elseif has_beginning_hyphen then
affix_type = "akhiran"
else
affix_type = "non-affix"
end
end
end
local link_term, display_term, lookup_term
if affix_type == "non-affix" then
link_term = term
display_term = term
lookup_term = term
else
display_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, dhyph)
if do_affix_mapping then
link_term = lookup_affix_mapping(term, affix_type, lang, scode, thyph, lhyph, affix_id)
if link_term then
link_term = reconstruct_term_per_hyphens(link_term, affix_type, scode, thyph, dhyph)
else
link_term = display_term
end
else
link_term = display_term
end
if return_lookup_affix then
lookup_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, lhyph)
else
lookup_term = display_term
end
end
link_term = reconstructed .. link_term
display_term = reconstructed .. display_term
lookup_term = reconstructed .. lookup_term
return affix_type, link_term, display_term, lookup_term
end
function export.make_affix(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not (affix_type == "awalan" or affix_type == "akhiran" or affix_type == "apitan" or affix_type == "sisipan" or
affix_type == "jalinan" or affix_type == "non-affix") then
error("Internal error: Invalid affix type " .. (affix_type or "(nil)"))
end
local _, link_term, display_term, lookup_term = export.parse_term_for_affixes(term, lang, sc, affix_type,
do_affix_mapping, return_lookup_affix, affix_id)
return link_term, display_term, lookup_term
end
-----------------------------------------------------------------------------------------
-- Main entry points --
-----------------------------------------------------------------------------------------
local function generate_affix_categories(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.surface_analysis or data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local whole_words = 0
local is_affix_or_compound = false
for i, part in ipairs_with_gaps(data.parts) do
part = part or {}
data.parts[i] = part
canonicalize_part(part, data.lang, data.sc)
part.affix_type, part.affix_link_term, part.affix_display_term = export.parse_term_for_affixes(part.term,
part.lang, part.sc, part.type, not part.alt, nil, part.id)
part.term = ine(part.affix_link_term)
part.alt = part.alt or (part.affix_display_term ~= part.affix_link_term and part.affix_display_term) or nil
end
if not data.noaffixcat then
for i, part in ipairs_with_gaps(data.parts) do
local affix_type = part.affix_type
if affix_type ~= "non-affix" then
is_affix_or_compound = true
local part_sort_base = nil
local part_sort = part.sort or data.sort_key
if i == 1 and data.parts[2] and data.parts[2].term then
local part2 = data.parts[2]
part_sort_base = ine(part2.affix_link_term) or ine(part2.alt)
if part_sort_base then
part_sort_base = strip_diacritics_no_links(part2.lang, part_sort_base)
end
end
if part.pos and rfind(part.pos, "patronym") then
table.insert(categories, {cat = "Patronim bahasa " .. data.lang:getFullName(), sort_key = part_sort, sort_base = part_sort_base})
end
if data.pos ~= "terms" and part.pos and rfind(part.pos, "diminutive") then
table.insert(categories, {cat = ucfirst(data.pos) .. " diminutif bahasa " .. data.lang:getFullName(), sort_key = part_sort,
sort_base = part_sort_base})
end
if ine(part.affix_link_term) and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, part.affix_link_term) ..
(part.id and " (" .. part.id .. ")" or ""),
sort_key = part_sort, sort_base = part_sort_base})
end
else
whole_words = whole_words + 1
if whole_words == 2 then
is_affix_or_compound = true
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
end
end
end
if not is_affix_or_compound and not data.allow_no_affixes_or_compounds then
error("The parameters did not include any affixes, and the term is not a compound. Please provide at least one affix.")
end
end
return text_sections, categories, borrowing_type
end
function export.show_affix(data)
local text_sections, categories, _ = generate_affix_categories(data)
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if data.surface_analysis then
local text = "dengan " .. glossary_link("surface analysis") .. ", "
if not data.nocap then
text = ucfirst(text)
end
table.insert(text_sections, 1, text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.get_affix_categories_only(data)
local _, categories, _ = generate_affix_categories(data)
return categories
end
function export.show_surface_analysis(data)
data.surface_analysis = true
data.allow_no_affixes_or_compounds = true
return export.show_affix(data)
end
function export.show_compound(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local parts_formatted = {}
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
local whole_words = 0
for i, part in ipairs(data.parts) do
canonicalize_part(part, data.lang, data.sc)
local affix_type, link_term, display_term = export.parse_term_for_affixes(part.term, part.lang, part.sc,
part.type, not part.alt, nil, part.id)
if affix_type == "jalinan" or (part.type and part.type ~= "non-affix") then
if link_term and link_term ~= "" and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, link_term), sort_key = part.sort or data.sort_key})
end
part.term = link_term ~= "" and link_term or nil
part.alt = part.alt or (display_term ~= link_term and display_term) or nil
else
if affix_type ~= "non-affix" then
local langcode = data.lang:getCode()
track { affix_type, affix_type .. "/lang/" .. langcode }
local full_langcode = data.lang:getFullCode()
if langcode ~= full_langcode then
track(affix_type .. "/lang/" .. full_langcode)
end
else
whole_words = whole_words + 1
end
end
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if whole_words == 1 then
track("one whole word")
elseif whole_words == 0 then
track("looks like confix")
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.show_compound_like(data)
data.allow_no_affixes_or_compounds = true
local text_sections, categories, _ = generate_affix_categories(data)
if data.cat then
table.insert(categories, data.cat .. " bahasa " .. data.lang:getFullName())
end
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if #data.parts > 0 and data.oftext then
table.insert(text_sections, 1, " " .. data.oftext .. " ")
end
if data.text then
table.insert(text_sections, 1, data.text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
local function make_part_into_affix(part, lang, sc, affix_type)
canonicalize_part(part, lang, sc)
local link_term, display_term = export.make_affix(part.term, part.lang, part.sc, affix_type, not part.alt, nil, part.id)
part.term = link_term
part.alt = part.alt and export.make_affix(part.alt, part.lang, part.sc, affix_type) or (display_term ~= link_term and display_term) or nil
local Latn = require(scripts_module).getByCode("Latn")
part.tr = export.make_affix(part.tr, part.lang, Latn, affix_type)
part.ts = export.make_affix(part.ts, part.lang, Latn, affix_type)
end
local function track_wrong_affix_type(template, part, expected_affix_type)
if part and not part.type then
local affix_type = export.parse_term_for_affixes(part.term, part.lang, part.sc)
if affix_type ~= expected_affix_type then
local part_name = expected_affix_type or "base"
local langcode = part.lang:getCode()
local full_langcode = part.lang:getFullCode()
require("Module:debug/track") {
template,
template .. "/" .. part_name,
template .. "/" .. part_name .. "/" .. (affix_type or "none"),
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. langcode
}
if full_langcode ~= langcode then
require("Module:debug/track")(
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. full_langcode
)
end
end
end
end
local function insert_affix_category(categories, pos, affix_type, part, sort_key, sort_base, lang)
if part.term and not part.part_lang then
local cat = ucfirst(pos) .. " bahasa " .. lang:getFullName() .. " ber" .. affix_type .. " dengan " .. strip_diacritics_no_links(part.lang, part.term) ..
(part.id and " (" .. part.id .. ")" or "")
if sort_key or sort_base then
table.insert(categories, {cat = cat, sort_key = sort_key, sort_base = sort_base})
else
table.insert(categories, cat)
end
end
end
function export.show_circumfix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("apitan", data.prefix, "awalan")
track_wrong_affix_type("apitan", data.base, nil)
track_wrong_affix_type("apitan", data.suffix, "akhiran")
local circumfix = nil
if data.prefix.term and data.suffix.term then
circumfix = data.prefix.term .. " " .. data.suffix.term
data.prefix.alt = data.prefix.alt or data.prefix.term
data.suffix.alt = data.suffix.alt or data.suffix.term
data.prefix.term = circumfix
data.suffix.term = circumfix
end
local parts_formatted = {}
local categories = {}
local sort_base
if data.base.term then
sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
end
table.insert(parts_formatted, export.link_term(data.prefix, data))
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.suffix, data))
if not data.prefix.part_lang then
table.insert(categories, {cat=ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " dengan apitan " .. strip_diacritics_no_links(data.prefix.lang,
circumfix), sort_key=data.sort_key, sort_base=sort_base})
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_confix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("confix", data.prefix, "awalan")
track_wrong_affix_type("confix", data.base, nil)
track_wrong_affix_type("confix", data.suffix, "akhiran")
local parts_formatted = {}
local prefix_sort_base
if data.base and data.base.term then
prefix_sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
elseif data.suffix.term then
prefix_sort_base = strip_diacritics_no_links(data.suffix.lang, data.suffix.term)
end
local categories = {}
table.insert(parts_formatted, export.link_term(data.prefix, data))
insert_affix_category(categories, data.pos, "awalan", data.prefix, data.sort_key, prefix_sort_base, data.lang)
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
end
table.insert(parts_formatted, export.link_term(data.suffix, data))
insert_affix_category(categories, data.pos, "akhiran", data.suffix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_infix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.infix, data.lang, data.sc, "sisipan")
track_wrong_affix_type("sisipan", data.base, nil)
track_wrong_affix_type("sisipan", data.infix, "sisipan")
local parts_formatted = {}
local categories = {}
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.infix, data))
insert_affix_category(categories, data.pos, "sisipan", data.infix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_prefix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, prefix in ipairs(data.prefixes) do
make_part_into_affix(prefix, data.lang, data.sc, "awalan")
end
for i, prefix in ipairs(data.prefixes) do
track_wrong_affix_type("awalan", prefix, "awalan")
end
track_wrong_affix_type("awalan", data.base, nil)
local parts_formatted = {}
local first_sort_base = nil
local categories = {}
if data.prefixes[2] then
first_sort_base = ine(data.prefixes[2].term) or ine(data.prefixes[2].alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.prefixes[2].lang, first_sort_base)
end
elseif data.base then
first_sort_base = ine(data.base.term) or ine(data.base.alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.base.lang, first_sort_base)
end
end
for i, prefix in ipairs(data.prefixes) do
table.insert(parts_formatted, export.link_term(prefix, data))
insert_affix_category(categories, data.pos, "awalan", prefix, data.sort_key, i == 1 and first_sort_base or nil, data.lang)
end
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_suffix(data)
local categories = {}
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, suffix in ipairs(data.suffixes) do
make_part_into_affix(suffix, data.lang, data.sc, "akhiran")
end
track_wrong_affix_type("akhiran", data.base, nil)
for i, suffix in ipairs(data.suffixes) do
track_wrong_affix_type("akhiran", suffix, "akhiran")
end
local parts_formatted = {}
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
for i, suffix in ipairs(data.suffixes) do
table.insert(parts_formatted, export.link_term(suffix, data))
end
for i, suffix in ipairs(data.suffixes) do
insert_affix_category(categories, data.pos, "akhiran", suffix, nil, nil, data.lang)
if suffix.pos and rfind(suffix.pos, "patronym") then
table.insert(categories, "Patronim bahasa " .. data.lang:getFullName())
end
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
return export
r14756u1oxst93dd0142i348lybryyb
373577
373576
2026-09-11T18:36:19Z
SNN95
2113
373577
Scribunto
text/plain
local export = {}
local debug_force_cat = false -- if set to true, always display categories even on userspace pages
local m_links = require("Module:links")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local etymology_module = "Module:etymology"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local utilities_module = "Module:utilities"
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.affix_lang_data_module_prefix = "Module:affix/lang-data/"
local ulen = m_str_utils.len
local rfind = m_str_utils.find
local rmatch = m_str_utils.match
local pluralize = require(en_utilities_module).pluralize
local u = m_str_utils.char
local ucfirst = m_str_utils.ucfirst
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
function export.affix_variants(canonical, variants)
local mappings = {}
for _, variant in ipairs(variants) do
mappings[variant] = canonical
end
return mappings
end
function export.id_mapping(default, ids)
local mapping = { default = default }
if ids then
for id, target in pairs(ids) do
mapping[id] = target
end
end
return mapping
end
function export.id_mapping_with_affix_variants(base, id_variants)
local mappings = {}
for id, variants in pairs(id_variants) do
for _, variant in ipairs(variants) do
mappings[variant] = export.id_mapping(base, {[id] = base})
end
end
return mappings
end
function export.merge_tables(...)
local result = {}
for i = 1, select('#', ...) do
local t = select(i, ...)
if t then
for k, v in pairs(t) do
result[k] = v
end
end
end
return result
end
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.langs_with_lang_specific_data = {
["az"] = true,
["fi"] = true,
["fr"] = true,
["izh"] = true,
["la"] = true,
["sah"] = true,
["tr"] = true,
["trk-pro"] = true,
}
local default_pos = "perkataan"
-- Fungsi khas untuk membetulkan artifak 's' selepas pluralize dijalankan
local function get_normalized_pos(pos)
pos = pos or default_pos
pos = pluralize(pos)
local pos_lower = pos:lower()
if pos_lower == "perkataans" or pos_lower == "terms" or pos_lower == "words" then
return "perkataan"
elseif pos_lower == "istilahs" then
return "istilah"
end
return pos
end
-----------------------------------------------------------------------------------------
-- Template and display hyphens --
-----------------------------------------------------------------------------------------
local ZWNJ = u(0x200C) -- zero-width non-joiner
local template_hyphens = {
["Arab"] = "ـ" .. ZWNJ .. "-",
["Aran"] = "ـ" .. ZWNJ .. "-",
["Hebr"] = "־",
["Mong"] = "᠊",
}
local lookup_hyphens = {
["Hebr"] = "־",
["Arab"] = "ـ",
["Aran"] = "ـ",
}
local function default_display_hyphen(script, hyph)
if not hyph then
return template_hyphens[script] or "-"
end
return hyph
end
local function arab_get_display_hyphen(_script, hyph)
if not hyph then
return "ـ" -- tatweel
elseif hyph == ZWNJ then
return ""
else
return hyph
end
end
local function no_display_hyphen(_script, _hyph)
return ""
end
local display_hyphens = {
["Arab"] = arab_get_display_hyphen,
["Aran"] = arab_get_display_hyphen,
["Bopo"] = no_display_hyphen,
["Hani"] = no_display_hyphen,
["Hans"] = no_display_hyphen,
["Hant"] = no_display_hyphen,
["Jpan"] = no_display_hyphen,
["Jurc"] = no_display_hyphen,
["Kitl"] = no_display_hyphen,
["Kits"] = no_display_hyphen,
["Laoo"] = no_display_hyphen,
["Nshu"] = no_display_hyphen,
["Shui"] = no_display_hyphen,
["Tang"] = no_display_hyphen,
["Thaa"] = no_display_hyphen,
["Thai"] = no_display_hyphen,
["Tibt"] = no_display_hyphen,
}
-----------------------------------------------------------------------------------------
-- Basic Utility functions --
-----------------------------------------------------------------------------------------
local function glossary_link(entry, text)
text = text or entry
return "[[Lampiran:Glosari#" .. entry .. "|" .. text .. "]]"
end
local function track(page)
if type(page) == "table" then
for i, pg in ipairs(page) do
page[i] = "affix/" .. pg
end
else
page = "affix/" .. page
end
require("Module:debug/track")(page)
end
local function ine(val)
return val ~= "" and val or nil
end
-----------------------------------------------------------------------------------------
-- Compound types --
-----------------------------------------------------------------------------------------
local function make_compound_type(anchor, malay_text)
malay_text = malay_text or anchor
return {
text = "kata majmuk " .. glossary_link(anchor, malay_text),
cat = "Kata majmuk " .. malay_text,
}
end
local function make_non_glossary_compound_type(anchor, malay_text)
malay_text = malay_text or anchor
local link = "[[" .. anchor .. "|" .. malay_text .. "]]"
return {
text = "kata majmuk " .. link,
cat = "Kata majmuk " .. malay_text,
}
end
local function make_raw_compound_type(anchor, malay_text)
malay_text = malay_text or anchor
return {
text = glossary_link(anchor, malay_text),
cat = malay_text,
}
end
local function make_borrowing_type(anchor, malay_text)
malay_text = malay_text or anchor
return {
text = glossary_link(anchor, malay_text),
borrowing_type = malay_text,
}
end
export.etymology_types = {
["adapted borrowing"] = make_borrowing_type("adapted borrowing", "pinjaman yang disesuaikan"),
["adap"] = "adapted borrowing",
["abor"] = "adapted borrowing",
["alliterative"] = make_non_glossary_compound_type("alliterative", "aliterasi"),
["allit"] = "alliterative",
["antonymous"] = make_non_glossary_compound_type("antonymous", "antonim"),
["ant"] = "antonymous",
["bahuvrihi"] = make_compound_type("bahuvrihi", "bahuvrīhi"),
["bahu"] = "bahuvrihi",
["bv"] = "bahuvrihi",
["coordinative"] = make_compound_type("coordinative", "koordinatif"),
["coord"] = "coordinative",
["descriptive"] = make_compound_type("descriptive", "deskriptif"),
["desc"] = "descriptive",
["determinative"] = make_compound_type("determinative", "determinatif"),
["det"] = "determinative",
["dvandva"] = make_compound_type("dvandva"),
["dva"] = "dvandva",
["dvigu"] = make_compound_type("dvigu"),
["dvi"] = "dvigu",
["endocentric"] = make_compound_type("endocentric", "endosentrik"),
["endo"] = "endocentric",
["exocentric"] = make_compound_type("exocentric", "eksosentrik"),
["exo"] = "exocentric",
["izafet I"] = make_compound_type("izafet I"),
["iz1"] = "izafet I",
["izafet II"] = make_compound_type("izafet II"),
["iz2"] = "izafet II",
["izafet III"] = make_compound_type("izafet III"),
["iz3"] = "izafet III",
["karmadharaya"] = make_compound_type("karmadharaya", "karmadhāraya"),
["karma"] = "karmadharaya",
["kd"] = "karmadharaya",
["kenning"] = make_raw_compound_type("kenning"),
["ken"] = "kenning",
["rhyming"] = make_non_glossary_compound_type("rhyming", "berima"),
["rhy"] = "rhyming",
["synonymous"] = make_non_glossary_compound_type("synonymous", "sinonim"),
["syn"] = "synonymous",
["tatpurusa"] = make_compound_type("tatpurusa", "tatpuruṣa"),
["tat"] = "tatpurusa",
["tp"] = "tatpurusa",
}
local function process_etymology_type(typ, nocap, notext, has_parts, lang)
local text_sections = {}
local categories = {}
local borrowing_type
if typ then
local typdata = export.etymology_types[typ]
if type(typdata) == "string" then
typdata = export.etymology_types[typdata]
end
if not typdata then
error("Ralat dalaman: Jenis tidak dikenali '" .. typ .. "'")
end
local text = typdata.text
if not nocap then
text = ucfirst(text)
end
local cat = typdata.cat
borrowing_type = typdata.borrowing_type
local oftext = typdata.oftext or " daripada"
if not notext then
table.insert(text_sections, text)
if has_parts then
table.insert(text_sections, oftext)
table.insert(text_sections, " ")
end
end
if cat then
table.insert(categories, cat .. " bahasa " .. lang:getFullName())
end
end
return text_sections, categories, borrowing_type
end
-----------------------------------------------------------------------------------------
-- Utility functions --
-----------------------------------------------------------------------------------------
local function ipairs_with_gaps(t)
local indices = m_table.numKeys(t)
local max_index = #indices > 0 and math.max(unpack(indices)) or 0
local i = 0
return function()
if i < max_index then
i = i + 1
return i, t[i]
end
end
end
export.ipairs_with_gaps = ipairs_with_gaps
function export.join_formatted_parts(data)
local cattext
local lang = data.data.lang
local force_cat = data.data.force_cat or debug_force_cat
if data.data.nocat then
cattext = ""
else
for i, cat in ipairs(data.categories) do
if type(cat) == "table" then
data.categories[i] = require(utilities_module).format_categories({cat.cat},
lang, cat.sort_key, cat.sort_base, force_cat)
else
data.categories[i] = require(utilities_module).format_categories({cat}, lang,
data.data.sort_key, nil, force_cat)
end
end
cattext = table.concat(data.categories)
end
local result = table.concat(data.parts_formatted, not data.separator_already_added and " +‎ " or nil) ..
(data.data.lit and ", secara harfiah " .. m_links.mark(data.data.lit, "gloss") or "")
local q = data.data.q
local qq = data.data.qq
local l = data.data.l
local ll = data.data.ll
local infl = data.data.infl
if q and q[1] or qq and qq[1] or l and l[1] or ll and ll[1] or infl and infl[1] then
result = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = result,
q = q,
qq = qq,
l = l,
ll = ll,
infl = infl,
}
end
return result .. cattext
end
local function strip_diacritics_no_links(lang, term)
return lang:stripDiacritics(m_links.remove_links(term))
end
local function canonicalize_part(part, lang, sc)
if not part then
return
end
part.part_lang = part.lang
part.lang = part.lang or lang
part.sc = part.sc or sc
local term = part.term
if not term then
return
elseif not part.fragment then
part.term, part.fragment = m_links.get_fragment(term)
else
part.term = m_links.get_fragment(term)
end
end
function export.link_term(part, data, include_separator)
local result
if part.part_lang then
result = require(etymology_module).format_derived {
lang = data.lang,
terms = {part},
sources = {part.lang},
sort_key = data.sort_key,
nocat = data.nocat,
template_name = "affix",
qualifiers_labels_on_outside = true,
borrowing_type = data.borrowing_type,
force_cat = data.force_cat or debug_force_cat,
}
else
result = m_links.full_link(part, "term", nil, "show qualifiers")
end
if include_separator and part.separator then
return part.separator .. result
else
return result
end
end
local function canonicalize_script_code(scode)
return (scode:gsub("^.*%-", ""))
end
-----------------------------------------------------------------------------------------
-- Affix-handling functions --
-----------------------------------------------------------------------------------------
local function detect_script_and_hyphens(text, lang, sc)
local scode
if sc then
scode = sc:getCode()
else
local possible_script_codes = lang:getScriptCodes()
local num_possible_script_codes = m_table.length(possible_script_codes)
if num_possible_script_codes == 0 then
error("Ralat mendalam! Bahasa " .. lang:getCanonicalName() .. " tidak mempunyai kod skrip.")
end
if num_possible_script_codes == 1 then
scode = possible_script_codes[1]
else
local may_have_nondefault_hyphen = false
for _, script_code in ipairs(possible_script_codes) do
script_code = canonicalize_script_code(script_code)
if template_hyphens[script_code] or display_hyphens[script_code] then
may_have_nondefault_hyphen = true
break
end
end
if not may_have_nondefault_hyphen then
scode = "Latn"
else
scode = lang:findBestScript(text):getCode()
end
end
end
scode = canonicalize_script_code(scode)
local template_hyphen = template_hyphens[scode] or "-"
local lookup_hyphen = lookup_hyphens[scode] or "-"
local display_hyphen = display_hyphens[scode] or default_display_hyphen
return scode, template_hyphen, display_hyphen, lookup_hyphen
end
local function reconstruct_term_per_hyphens(term, affix_type, scode, thyph_re, new_hyphen)
local function get_hyphen(hyph)
if type(new_hyphen) == "string" then
return new_hyphen
end
return new_hyphen(scode, hyph)
end
if affix_type == "non-affix" then
return term
elseif affix_type == "apitan" then
local before, before_hyphen, after_hyphen, after = rmatch(term, "^(.*)" .. thyph_re .. " " .. thyph_re
.. "(.*)$")
if not before or ulen(term) <= 3 then
return term
end
return before .. get_hyphen(before_hyphen) .. " " .. get_hyphen(after_hyphen) .. after
elseif affix_type == "sisipan" or affix_type == "jalinan" then
local before_hyphen, middle, after_hyphen = rmatch(term, "^" .. thyph_re .. "(.*)" .. thyph_re .. "$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "awalan" then
local middle, after_hyphen = rmatch(term, "^(.*)" .. thyph_re .. "$")
if middle and ulen(term) <= 1 then
return term
end
return (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "akhiran" then
local before_hyphen, middle = rmatch(term, "^" .. thyph_re .. "(.*)$")
if before_hyphen and ulen(term) <= 1 then
return term
end
return get_hyphen(before_hyphen) .. (middle or term)
else
error(("Ralat dalaman: Jenis imbuhan tidak dikenali '%s'"):format(affix_type))
end
end
local function lookup_affix_mapping(affix, affix_type, lang, scode, thyph_re, lookup_hyph, affix_id)
local function do_lookup(afx)
local lookup_affix = reconstruct_term_per_hyphens(afx, affix_type, scode, thyph_re, lookup_hyph)
local function do_lookup_for_langcode(langcode)
if export.langs_with_lang_specific_data[langcode] then
local langdata = mw.loadData(export.affix_lang_data_module_prefix .. langcode)
if langdata.affix_mappings then
local mapping = langdata.affix_mappings[lookup_affix]
if mapping then
if type(mapping) == "table" then
mapping = mapping[affix_id] or mapping.default or mapping[affix_id or false]
if mapping then
return mapping
end
else
return mapping
end
end
end
end
end
local langcode = lang:getCode()
local mapping = do_lookup_for_langcode(langcode)
if mapping then
return mapping
end
local full_langcode = lang:getFullCode()
if full_langcode ~= langcode then
mapping = do_lookup_for_langcode(full_langcode)
if mapping then
return mapping
end
end
return nil
end
if affix:find("%[%[") then
return nil
end
return do_lookup(affix) or do_lookup(lang:stripDiacritics(affix)) or nil
end
function export.parse_term_for_affixes(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not term then
return "non-affix", nil, nil, nil
end
if term == "^" then
term = ""
return "non-affix", term, term, term
end
if term:find("^%^") then
local langcode = lang:getCode()
if langcode ~= "ko" and langcode ~= "okm" and langcode ~= "jje" then
error("Penggunaan ^ untuk memaksa status bukan imbuhan tidak lagi disokong; gunakan pengubahsuai sebaris <naf> atau <root> " ..
"selepas komponen tersebut")
end
end
local reconstructed = ""
if term:find("^%*") then
reconstructed = "*"
term = term:gsub("^%*", "")
end
local scode, thyph, dhyph, lhyph = detect_script_and_hyphens(term, lang, sc)
thyph = "([" .. thyph .. "])"
if not affix_type then
if rfind(term, thyph .. " " .. thyph) then
affix_type = "apitan"
else
local has_beginning_hyphen = rfind(term, "^" .. thyph)
local has_ending_hyphen = rfind(term, thyph .. "$")
if has_beginning_hyphen and has_ending_hyphen then
affix_type = "jalinan"
elseif has_ending_hyphen then
affix_type = "awalan"
elseif has_beginning_hyphen then
affix_type = "akhiran"
else
affix_type = "non-affix"
end
end
end
local link_term, display_term, lookup_term
if affix_type == "non-affix" then
link_term = term
display_term = term
lookup_term = term
else
display_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, dhyph)
if do_affix_mapping then
link_term = lookup_affix_mapping(term, affix_type, lang, scode, thyph, lhyph, affix_id)
if link_term then
link_term = reconstruct_term_per_hyphens(link_term, affix_type, scode, thyph, dhyph)
else
link_term = display_term
end
else
link_term = display_term
end
if return_lookup_affix then
lookup_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, lhyph)
else
lookup_term = display_term
end
end
link_term = reconstructed .. link_term
display_term = reconstructed .. display_term
lookup_term = reconstructed .. lookup_term
return affix_type, link_term, display_term, lookup_term
end
function export.make_affix(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not (affix_type == "awalan" or affix_type == "akhiran" or affix_type == "apitan" or affix_type == "sisipan" or
affix_type == "jalinan" or affix_type == "non-affix") then
error("Ralat dalaman: Jenis imbuhan tidak sah " .. (affix_type or "(nil)"))
end
local _, link_term, display_term, lookup_term = export.parse_term_for_affixes(term, lang, sc, affix_type,
do_affix_mapping, return_lookup_affix, affix_id)
return link_term, display_term, lookup_term
end
-----------------------------------------------------------------------------------------
-- Main entry points --
-----------------------------------------------------------------------------------------
local function generate_affix_categories(data)
data.pos = get_normalized_pos(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.surface_analysis or data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local whole_words = 0
local is_affix_or_compound = false
for i, part in ipairs_with_gaps(data.parts) do
part = part or {}
data.parts[i] = part
canonicalize_part(part, data.lang, data.sc)
part.affix_type, part.affix_link_term, part.affix_display_term = export.parse_term_for_affixes(part.term,
part.lang, part.sc, part.type, not part.alt, nil, part.id)
part.term = ine(part.affix_link_term)
part.alt = part.alt or (part.affix_display_term ~= part.affix_link_term and part.affix_display_term) or nil
end
if not data.noaffixcat then
for i, part in ipairs_with_gaps(data.parts) do
local affix_type = part.affix_type
if affix_type ~= "non-affix" then
is_affix_or_compound = true
local part_sort_base = nil
local part_sort = part.sort or data.sort_key
if i == 1 and data.parts[2] and data.parts[2].term then
local part2 = data.parts[2]
part_sort_base = ine(part2.affix_link_term) or ine(part2.alt)
if part_sort_base then
part_sort_base = strip_diacritics_no_links(part2.lang, part_sort_base)
end
end
if part.pos and rfind(part.pos, "patronym") then
table.insert(categories, {cat = "Patronim bahasa " .. data.lang:getFullName(), sort_key = part_sort, sort_base = part_sort_base})
end
if data.pos ~= "perkataan" and part.pos and rfind(part.pos, "diminutive") then
table.insert(categories, {cat = ucfirst(data.pos) .. " diminutif bahasa " .. data.lang:getFullName(), sort_key = part_sort,
sort_base = part_sort_base})
end
if ine(part.affix_link_term) and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, part.affix_link_term) ..
(part.id and " (" .. part.id .. ")" or ""),
sort_key = part_sort, sort_base = part_sort_base})
end
else
whole_words = whole_words + 1
if whole_words == 2 then
is_affix_or_compound = true
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
end
end
end
if not is_affix_or_compound and not data.allow_no_affixes_or_compounds then
error("Parameter tidak menyertakan sebarang imbuhan, dan istilah tersebut bukanlah kata majmuk. Sila berikan sekurang-kurangnya satu imbuhan.")
end
end
return text_sections, categories, borrowing_type
end
function export.show_affix(data)
local text_sections, categories, _ = generate_affix_categories(data)
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if data.surface_analysis then
local text = "dengan " .. glossary_link("surface analysis", "analisis permukaan") .. ", "
if not data.nocap then
text = ucfirst(text)
end
table.insert(text_sections, 1, text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.get_affix_categories_only(data)
local _, categories, _ = generate_affix_categories(data)
return categories
end
function export.show_surface_analysis(data)
data.surface_analysis = true
data.allow_no_affixes_or_compounds = true
return export.show_affix(data)
end
function export.show_compound(data)
data.pos = get_normalized_pos(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.nocap, data.notext, #data.parts > 0, data.lang)
data.borrowing_type = borrowing_type
local parts_formatted = {}
table.insert(categories, ucfirst(data.pos) .. " majmuk bahasa " .. data.lang:getFullName())
local whole_words = 0
for i, part in ipairs(data.parts) do
canonicalize_part(part, data.lang, data.sc)
local affix_type, link_term, display_term = export.parse_term_for_affixes(part.term, part.lang, part.sc,
part.type, not part.alt, nil, part.id)
if affix_type == "jalinan" or (part.type and part.type ~= "non-affix") then
if link_term and link_term ~= "" and not part.part_lang then
table.insert(categories, {cat = ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " ber" .. affix_type .. " dengan " ..
strip_diacritics_no_links(part.lang, link_term), sort_key = part.sort or data.sort_key})
end
part.term = link_term ~= "" and link_term or nil
part.alt = part.alt or (display_term ~= link_term and display_term) or nil
else
if affix_type ~= "non-affix" then
local langcode = data.lang:getCode()
track { affix_type, affix_type .. "/lang/" .. langcode }
local full_langcode = data.lang:getFullCode()
if langcode ~= full_langcode then
track(affix_type .. "/lang/" .. full_langcode)
end
else
whole_words = whole_words + 1
end
end
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if whole_words == 1 then
track("one whole word")
elseif whole_words == 0 then
track("looks like confix")
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
function export.show_compound_like(data)
data.allow_no_affixes_or_compounds = true
local text_sections, categories, _ = generate_affix_categories(data)
if data.cat then
table.insert(categories, data.cat .. " bahasa " .. data.lang:getFullName())
end
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if #data.parts > 0 and data.oftext then
table.insert(text_sections, 1, " " .. data.oftext .. " ")
end
if data.text then
table.insert(text_sections, 1, data.text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
local function make_part_into_affix(part, lang, sc, affix_type)
canonicalize_part(part, lang, sc)
local link_term, display_term = export.make_affix(part.term, part.lang, part.sc, affix_type, not part.alt, nil, part.id)
part.term = link_term
part.alt = part.alt and export.make_affix(part.alt, part.lang, part.sc, affix_type) or (display_term ~= link_term and display_term) or nil
local Latn = require(scripts_module).getByCode("Latn")
part.tr = export.make_affix(part.tr, part.lang, Latn, affix_type)
part.ts = export.make_affix(part.ts, part.lang, Latn, affix_type)
end
local function track_wrong_affix_type(template, part, expected_affix_type)
if part and not part.type then
local affix_type = export.parse_term_for_affixes(part.term, part.lang, part.sc)
if affix_type ~= expected_affix_type then
local part_name = expected_affix_type or "base"
local langcode = part.lang:getCode()
local full_langcode = part.lang:getFullCode()
require("Module:debug/track") {
template,
template .. "/" .. part_name,
template .. "/" .. part_name .. "/" .. (affix_type or "none"),
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. langcode
}
if full_langcode ~= langcode then
require("Module:debug/track")(
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. full_langcode
)
end
end
end
end
local function insert_affix_category(categories, pos, affix_type, part, sort_key, sort_base, lang)
if part.term and not part.part_lang then
local cat = ucfirst(pos) .. " bahasa " .. lang:getFullName() .. " ber" .. affix_type .. " dengan " .. strip_diacritics_no_links(part.lang, part.term) ..
(part.id and " (" .. part.id .. ")" or "")
if sort_key or sort_base then
table.insert(categories, {cat = cat, sort_key = sort_key, sort_base = sort_base})
else
table.insert(categories, cat)
end
end
end
function export.show_circumfix(data)
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("apitan", data.prefix, "awalan")
track_wrong_affix_type("apitan", data.base, nil)
track_wrong_affix_type("apitan", data.suffix, "akhiran")
local circumfix = nil
if data.prefix.term and data.suffix.term then
circumfix = data.prefix.term .. " " .. data.suffix.term
data.prefix.alt = data.prefix.alt or data.prefix.term
data.suffix.alt = data.suffix.alt or data.suffix.term
data.prefix.term = circumfix
data.suffix.term = circumfix
end
local parts_formatted = {}
local categories = {}
local sort_base
if data.base.term then
sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
end
table.insert(parts_formatted, export.link_term(data.prefix, data))
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.suffix, data))
if not data.prefix.part_lang then
table.insert(categories, {cat=ucfirst(data.pos) .. " bahasa " .. data.lang:getFullName() .. " dengan apitan " .. strip_diacritics_no_links(data.prefix.lang,
circumfix), sort_key=data.sort_key, sort_base=sort_base})
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_confix(data)
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.prefix, data.lang, data.sc, "awalan")
make_part_into_affix(data.suffix, data.lang, data.sc, "akhiran")
track_wrong_affix_type("confix", data.prefix, "awalan")
track_wrong_affix_type("confix", data.base, nil)
track_wrong_affix_type("confix", data.suffix, "akhiran")
local parts_formatted = {}
local prefix_sort_base
if data.base and data.base.term then
prefix_sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
elseif data.suffix.term then
prefix_sort_base = strip_diacritics_no_links(data.suffix.lang, data.suffix.term)
end
local categories = {}
table.insert(parts_formatted, export.link_term(data.prefix, data))
insert_affix_category(categories, data.pos, "awalan", data.prefix, data.sort_key, prefix_sort_base, data.lang)
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
end
table.insert(parts_formatted, export.link_term(data.suffix, data))
insert_affix_category(categories, data.pos, "akhiran", data.suffix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_infix(data)
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
make_part_into_affix(data.infix, data.lang, data.sc, "sisipan")
track_wrong_affix_type("sisipan", data.base, nil)
track_wrong_affix_type("sisipan", data.infix, "sisipan")
local parts_formatted = {}
local categories = {}
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.infix, data))
insert_affix_category(categories, data.pos, "sisipan", data.infix, nil, nil, data.lang)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_prefix(data)
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, prefix in ipairs(data.prefixes) do
make_part_into_affix(prefix, data.lang, data.sc, "awalan")
end
for i, prefix in ipairs(data.prefixes) do
track_wrong_affix_type("awalan", prefix, "awalan")
end
track_wrong_affix_type("awalan", data.base, nil)
local parts_formatted = {}
local first_sort_base = nil
local categories = {}
if data.prefixes[2] then
first_sort_base = ine(data.prefixes[2].term) or ine(data.prefixes[2].alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.prefixes[2].lang, first_sort_base)
end
elseif data.base then
first_sort_base = ine(data.base.term) or ine(data.base.alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.base.lang, first_sort_base)
end
end
for i, prefix in ipairs(data.prefixes) do
table.insert(parts_formatted, export.link_term(prefix, data))
insert_affix_category(categories, data.pos, "awalan", prefix, data.sort_key, i == 1 and first_sort_base or nil, data.lang)
end
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
function export.show_suffix(data)
local categories = {}
data.pos = get_normalized_pos(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
for i, suffix in ipairs(data.suffixes) do
make_part_into_affix(suffix, data.lang, data.sc, "akhiran")
end
track_wrong_affix_type("akhiran", data.base, nil)
for i, suffix in ipairs(data.suffixes) do
track_wrong_affix_type("akhiran", suffix, "akhiran")
end
local parts_formatted = {}
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
for i, suffix in ipairs(data.suffixes) do
table.insert(parts_formatted, export.link_term(suffix, data))
end
for i, suffix in ipairs(data.suffixes) do
insert_affix_category(categories, data.pos, "akhiran", suffix, nil, nil, data.lang)
if suffix.pos and rfind(suffix.pos, "patronym") then
table.insert(categories, "Patronim bahasa " .. data.lang:getFullName())
end
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
return export
phk8pm6fsslngsc8rykmmj4ssqc0ku4
Modul:affix/templates/ujian
828
144627
373571
2026-09-11T18:12:25Z
SNN95
2113
Mencipta laman baru dengan kandungan 'local export = {} local m_affix = require("Module:/ujian") local m_utilities = require("Module:utilities") local en_utilities_module = "Module:en-utilities" local parameter_utilities_module = "Module:parameter utilities" local pseudo_loan_module = "Module:affix/pseudo-loan" local insert = table.insert local boolean_param = {type = "boolean"} local function is_property_key(k) return require(parameter_utilities_module).item_key_is_property(k) end...'
373571
Scribunto
text/plain
local export = {}
local m_affix = require("Module:/ujian")
local m_utilities = require("Module:utilities")
local en_utilities_module = "Module:en-utilities"
local parameter_utilities_module = "Module:parameter utilities"
local pseudo_loan_module = "Module:affix/pseudo-loan"
local insert = table.insert
local boolean_param = {type = "boolean"}
local function is_property_key(k)
return require(parameter_utilities_module).item_key_is_property(k)
end
local recognized_affix_types = {
prefix = "awalan",
pre = "awalan",
suffix = "akhiran",
suf = "akhiran",
interfix = "jalinan",
inter = "jalinan",
infix = "sisipan",
["in"] = "sisipan",
circumfix = "apitan",
circum = "apitan",
["non-affix"] = "non-affix",
naf = "non-affix",
root = "non-affix",
}
local function pre_normalize_affix_type(data)
local modtext = data.modtext
modtext = modtext:match("^<(.*)>$")
if not modtext then
error(("Internal error: Passed-in modifier isn't surrounded by angle brackets: %s"):format(data.modtext))
end
if recognized_affix_types[modtext] then
modtext = "type:" .. modtext
end
return "<" .. modtext .. ">"
end
-- Parse raw arguments. A single parameter `data` is passed in, with the following fields:
-- * `raw_args`: The raw arguments to parse, normally taken from `frame:getParent().args`.
-- * `extra_params`: An optional function of one argument that is called on the `params` structure before parsing; its
-- purpose is to specify additional allowed parameters or possibly disable parameters.
-- * `has_source`: There is a source-language parameter following 1= (which becomes the "destination" language
-- parameter) and preceding the terms. This is currently used for {{pseudo-loan}}.
-- * `ilang`: If given, it is a language object that serves as the default for the language. If specified, there is no
-- language code specified in 1=; instead the term parameters start directly at 1= (or at 2= if `has_source` is
-- given).
-- * `require_index_for_pos`: There is no separate |pos= parameter distinct from |pos1=, |pos2=, etc. Instead,
-- specifying |pos= results in an error.
-- * `dont_require_index`: Allow |foo= to be specified as a synonym for |foo1= (except for |lit=, which remains
-- distinct).
-- * `allow_type`: Allow |type1=, |type2=, etc. or inline <type:...> for the affix type, and allow a separate |type=
-- parameter for the etymology type (FIXME: this may be confusing; consider changing the etymology type to |etype=).
-- * `allow_semicolon_separator`: Allow semicolon as a separator, displaying as " or ". This requires changes in the
-- display of the output, to not always put a + between the items.
--
-- Note that all language parameters are allowed to be etymology-only languages.
--
-- Return five values ARGS, ITEMS, LANG_OBJ, SCRIPT_OBJ, SOURCE_LANG_OBJ where ARGS is a table of the parsed arguments;
-- ITEMS is the list of parsed items; LANG_OBJ is the language object corresponding to the language code specified in 1=
-- (or taken from `ilang` if given); SCRIPT_OBJ is the script object corresponding to sc= (if given, otherwise nil); and
-- SOURCE_LANG_OBJ is the language object corresponding to the source-language code specified in 2= (or 1= if `ilang` is
-- given) if `has_source` is specified (otherwise nil).
local function parse_args(data)
local raw_args = data.raw_args
local has_source = data.has_source
local ilang = data.ilang
if raw_args.lang then
error("The |lang= parameter is not used by this template. Place the language code in parameter 1 instead.")
end
local term_index = (ilang and 1 or 2) + (has_source and 1 or 0)
local params = {
[term_index] = {list = true, allow_holes = true},
["sort"] = {},
["nocap"] = boolean_param, -- always allow this even if not used, for use with {{surf}}, which adds it
}
if not ilang then
params[1] = {required = true, type = "language", default = "und"}
end
local source_index
if has_source then
source_index = term_index - 1
params[source_index] = {required = true, type = "language", default = "und"}
end
local m_param_utils = require(parameter_utilities_module)
local param_mod_source = {}
if not data.dont_require_index then
insert(param_mod_source,
-- We want to require an index for all params (or use separate_no_index, which also requires an index for the
-- param corresponding to the first item).
{default = true, require_index = true}
)
end
insert(param_mod_source, {group = {"link", "ref", "lang", "q", "l", "infl"}})
-- Override lit= to be separate from lit1=.
insert(param_mod_source, {param = "lit", separate_no_index = true})
if not data.dont_require_index and not data.require_index_for_pos then
-- Override pos= to be separate from pos1=.
insert(param_mod_source, {param = "pos", separate_no_index = true})
end
if data.allow_type then
insert(param_mod_source, {param = "type", separate_no_index = true})
end
local param_mods = m_param_utils.construct_param_mods(param_mod_source)
if data.extra_params then
data.extra_params(params)
end
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = raw_args,
termarg = term_index,
parse_lang_prefix = true,
track_module = "homophones",
-- the inclusion of ‎ is what [[Module:affix]] has always done
default_separator = data.allow_semicolon_separator and " +‎ " or nil,
special_separators = data.allow_semicolon_separator and {[";"] = " or "} or nil,
disallow_custom_separators = not data.allow_semicolon_separator,
-- For compatibility, we need to not skip completely unspecified items. It is common, for example, to do
-- {{suffix|lang||foo}} to generate "+ -foo".
dont_skip_items = true,
-- Allow e.g. <infix> to be specified in place of <type:infix>.
pre_normalize_modifiers = pre_normalize_affix_type,
-- Don't pass in `lang` or `sc`, as they will be used as defaults to initialize the items, which we don't want
-- (particularly for `lang`), as the code in [[Module:affix]] uses the presence of `lang` as an indicator that
-- a part-specific language was explicitly given.
}
local lang = ilang or args[1]
local source
if has_source then
source = args[source_index]
end
-- For compatibility with the prior code, we need to convert items without term or properties to nil.
for i = 1, #items do
local item = items[i]
local saw_item_property = item.term
if not saw_item_property then
for k, v in pairs(item) do
if is_property_key(k) then
saw_item_property = true
break
end
end
end
if not saw_item_property then
items[i] = nil
elseif item.type then
-- Validate and canonicalize affix types.
if not recognized_affix_types[item.type] then
local valid_types = {}
for k in pairs(recognized_affix_types) do
insert(valid_types, ("'%s'"):format(k))
end
table.sort(recognized_affix_types)
error(("Unrecognized affix type '%s' in item %s; valid values are %s"):format(
item.type, item.itemno, table.concat(valid_types, ", ")))
else
item.type = recognized_affix_types[item.type]
end
end
end
if args.type and args.type.default and not m_affix.etymology_types[args.type.default] then
error("Unrecognized etymology type: '" .. args.type.default .. "'")
end
return args, items, lang, args.sc.default, source
end
local function augment_affix_data(data, args, lang, sc)
data.lang = lang
data.sc = sc
data.pos = args.pos and args.pos.default
data.lit = args.lit and args.lit.default
data.sort_key = args.sort
data.type = args.type and args.type.default
data.nocap = args.nocap
data.notext = args.notext
data.nocat = args.nocat
data.force_cat = args.force_cat
data.l = args.l.default
data.ll = args.ll.default
data.q = args.q.default
data.qq = args.qq.default
data.infl = args.infl.default
return data
end
function export.affix(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) and not args.type.default then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "awalan-"}, {term = "kata dasar"}, {term = "-akhiran"} }
else
error("You must provide at least one part.")
end
end
return m_affix.show_affix(augment_affix_data({ parts = parts }, args, lang, sc))
end
function export.compound(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) and not args.type.default then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "pertama"}, {separator = " +‎ ", term = "kedua"} }
else
error("You must provide at least one part of a compound.")
end
end
return m_affix.show_compound(augment_affix_data({ parts = parts }, args, lang, sc))
end
-- FIXME: Temporary for check in compound_like() below for old-style {{contraction}} parameters. Remove eventually.
local function ine(arg)
if arg == "" then
return nil
else
return arg
end
end
function export.compound_like(frame)
local iparams = {
["lang"] = {type = "language"},
["template"] = {},
["text"] = {},
["oftext"] = {},
["cat"] = {},
["noaffixcat"] = boolean_param,
["dont_require_index"] = boolean_param,
}
local iargs = require("Module:parameters").process(frame.args, iparams)
local parent_args = frame:getParent().args
-- Error to catch most uses of old-style parameters for {{contraction}}. (FIXME: Remove eventually.)
local term_param = iargs.lang and 1 or 2
if ine(parent_args[term_param + 2]) and not ine(parent_args[term_param + 1]) and not ine(parent_args.tr2) and not ine(parent_args.ts2)
and not ine(parent_args.t2) and not ine(parent_args.gloss2) and not ine(parent_args.g2)
and not ine(parent_args.alt2) then
error(("You specified a term in %s= and not one in %s=. You probably meant to use t= to specify a gloss instead. "
.. "If you intended to specify two terms, put the second term in %s=."):format(term_param + 2, term_param + 1,
term_param + 1))
end
if not ine(parent_args[term_param + 1]) and not ine(parent_args.alt2) and not ine(parent_args.tr2) and not ine(parent_args.ts2)
and ine(parent_args.g2) then
error(("You specified a gender in g2= but no term in %s=. You were probably trying to specify two genders for "
.. "a single term. To do that, put both genders in g=, comma-separated."):format(term_param + 1))
end
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = parent_args,
extra_params = extra_params,
ilang = iargs.lang,
dont_require_index = iargs.dont_require_index,
-- FIXME, why are we doing this? Formerly we had 'params.pos = nil' whose intention was to disable the overall
-- pos= while preserving posN=, which is equivalent to the following using the new syntax. But why is this
-- necessary?
require_index_for_pos = not iargs.dont_require_index,
allow_semicolon_separator = true,
}
local template = iargs.template
local nocat = args.nocat
local notext = args.notext
local text = not notext and iargs.text
local oftext = not notext and (iargs.oftext or text and "bagi")
local cat = not nocat and iargs.cat
local noaffixcat = nocat or iargs.noaffixcat
if not next(parts) then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "pertama"}, {separator = " +‎ ", term = "kedua"} }
end
end
return m_affix.show_compound_like(augment_affix_data({ parts = parts, text = text, oftext = oftext, cat = cat, noaffixcat = noaffixcat },
args, lang, sc))
end
function export.surface_analysis(frame)
local function ine(arg)
-- Since we're operating before calling [[Module:parameters]], we need to imitate how that module processes
-- arguments, including trimming since numbered arguments don't have automatic whitespace trimming.
if not arg then
return arg
end
arg = mw.text.trim(arg)
if arg == "" then
arg = nil
end
return arg
end
local parent_args = frame:getParent().args
local etymtext
local arg1 = ine(parent_args[1])
if not arg1 then
-- Allow omitted first argument to just display "By surface analysis".
etymtext = ""
elseif arg1:find("^%+") then
-- If the first argument (normally a language code) is prefixed with a +, it's a template name.
local template_name = arg1:sub(2)
local new_args = {}
for i, v in pairs(parent_args) do
if type(i) == "number" then
if i > 1 then
new_args[i - 1] = v
end
else
new_args[i] = v
end
end
new_args.nocap = true
etymtext = ", " .. frame:expandTemplate { title = template_name, args = new_args }
end
if etymtext then
return (ine(parent_args.nocap) and "m" or "M") .. "elalui [[Lampiran:Glosari#analisis dasar|analisis dasar]]" ..
etymtext
end
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = parent_args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "pertama"}, {separator = " +‎ ", term = "kedua"} }
else
error("You must provide at least one part.")
end
end
return m_affix.show_surface_analysis(augment_affix_data({ parts = parts }, args, lang, sc))
end
local function check_max_items(items, max_allowed)
if #items > max_allowed then
local bad_item = items[max_allowed + 1]
if bad_item.term then
error(("At most %s terms can be specified but saw a term specified for term #%s")
:format(max_allowed, max_allowed + 1))
else
for k, v in pairs(bad_item) do
if is_property_key(k) then
error(("At most %s terms can be specified but saw a value for property '%s' of term #%s")
:format(max_allowed, k, max_allowed + 1))
end
end
end
error(("Internal error: Something wrong, %s items generated when there should be at most %s, but item #%s doesn't have a term or any properties")
:format(#items, max_allowed, max_allowed + 1))
end
end
function export.circumfix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local prefix = parts[1]
local base = parts[2]
local suffix = parts[3]
-- Just to make sure someone didn't use the template in a silly way
if not (prefix and base and suffix) then
if mw.title.getCurrentTitle().nsText == "Template" then
prefix = {term = "apitan", alt = "awalan"}
base = {term = "kata dasar"}
suffix = {term = "apitan", alt = "akhiran"}
else
error("You must specify a prefix part, a base term and a suffix part.")
end
end
return m_affix.show_circumfix(augment_affix_data({ prefix = prefix, base = base, suffix = suffix }, args, lang, sc))
end
function export.confix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local prefix = parts[1]
local base = parts[3] and parts[2] or nil
local suffix = parts[3] or parts[2]
-- Just to make sure someone didn't use the template in a silly way
if not (prefix and suffix) then
if mw.title.getCurrentTitle().nsText == "Template" then
prefix = {term = "awalan"}
suffix = {term = "akhiran"}
else
error("You must specify a prefix part, an optional base term and a suffix part.")
end
end
return m_affix.show_confix(augment_affix_data({ prefix = prefix, base = base, suffix = suffix }, args, lang, sc))
end
function export.pseudo_loan(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc, source = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
has_source = true,
-- FIXME, why are we doing this? Formerly we had 'params.pos = nil' whose intention was to disable the overall
-- pos= while preserving posN=, which is equivalent to the following using the new syntax. But why is this
-- necessary?
require_index_for_pos = true,
allow_semicolon_separator = true,
}
return require(pseudo_loan_module).show_pseudo_loan(
augment_affix_data({ source = source, parts = parts }, args, lang, sc))
end
function export.infix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local base = parts[1]
local infix = parts[2]
-- Just to make sure someone didn't use the template in a silly way
if not (base and infix) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "kata dasar"}
infix = {term = "sisipan"}
else
error("You must provide a base term and an infix.")
end
end
return m_affix.show_infix(augment_affix_data({ base = base, infix = infix }, args, lang, sc))
end
function export.prefix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
local prefixes = parts
local base = nil
local max_prefix = 0
for k, v in pairs(prefixes) do
max_prefix = math.max(k, max_prefix)
end
if max_prefix >= 2 then
base = prefixes[max_prefix]
prefixes[max_prefix] = nil
end
-- Just to make sure someone didn't use the template in a silly way
if not next(prefixes) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "kata dasar"}
prefixes = { {term = "awalan"} }
else
error("You must provide at least one prefix.")
end
end
return m_affix.show_prefix(augment_affix_data({ prefixes = prefixes, base = base }, args, lang, sc))
end
function export.suffix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
local base = parts[1]
local suffixes = {}
for k, v in pairs(parts) do
suffixes[k - 1] = v
end
-- Just to make sure someone didn't use the template in a silly way
if not next(suffixes) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "kata dasar"}
suffixes = { {term = "akhiran"} }
else
error("You must provide at least one suffix.")
end
end
return m_affix.show_suffix(augment_affix_data({ base = base, suffixes = suffixes }, args, lang, sc))
end
function export.derivsee(frame)
local iargs = frame.args
local iparams = {
["derivtype"] = {},
}
local iargs = require("Module:parameters").process(frame.args, iparams)
local params = {
["head"] = {},
["id"] = {},
["sc"] = {type = "script"},
["pos"] = {},
}
local derivtype = iargs.derivtype
params[1] = {required = "true", type = "language", default = "und"}
params[2] = {}
local args = require("Module:parameters").process(frame:getParent().args, params)
local lang = args[1]
local term = args[2] or args.head
local id = args.id
local sc = args.sc
local pos = require(en_utilities_module).pluralize(args.pos or "Istilah")
if not term then
local SUBPAGE = mw.loadData("Module:headword/data").pagename
if lang:hasType("reconstructed") or mw.title.getCurrentTitle().nsText == "Rekonstruksi" then
term = "*" .. SUBPAGE
elseif lang:hasType("appendix-constructed") then
term = SUBPAGE
else
term = SUBPAGE
end
end
local category = nil
local langname = lang:getFullName()
if (derivtype == "compound" and pos == nil) then
category = "Kata majmuk dengan " .. term .. " bahasa " .. langname
elseif derivtype == "compound" and pos == "verbs" then
category = "Kata majmuk terbentuk dengan " .. term .. " bahasa " .. langname
elseif derivtype == "compound" then
category = "Kata majmuk dengan " .. term .. " bahasa " .. langname
else
category = pos .. " dengan " .. derivtype .. " " .. term .. (id and " (" .. id .. ")" or "") .. " bahasa " .. langname
end
return require('Module:collapsible category tree').make{
lang = lang,
sc = sc,
category = category,
}
end
return export
re50l36ir47af93yr2ps74pm0lvcd6z
373573
373571
2026-09-11T18:20:56Z
SNN95
2113
373573
Scribunto
text/plain
local export = {}
local m_affix = require("Module:affix/ujian")
local m_utilities = require("Module:utilities")
local en_utilities_module = "Module:en-utilities"
local parameter_utilities_module = "Module:parameter utilities"
local pseudo_loan_module = "Module:affix/pseudo-loan"
local insert = table.insert
local boolean_param = {type = "boolean"}
local function is_property_key(k)
return require(parameter_utilities_module).item_key_is_property(k)
end
local recognized_affix_types = {
prefix = "awalan",
pre = "awalan",
suffix = "akhiran",
suf = "akhiran",
interfix = "jalinan",
inter = "jalinan",
infix = "sisipan",
["in"] = "sisipan",
circumfix = "apitan",
circum = "apitan",
["non-affix"] = "non-affix",
naf = "non-affix",
root = "non-affix",
}
local function pre_normalize_affix_type(data)
local modtext = data.modtext
modtext = modtext:match("^<(.*)>$")
if not modtext then
error(("Internal error: Passed-in modifier isn't surrounded by angle brackets: %s"):format(data.modtext))
end
if recognized_affix_types[modtext] then
modtext = "type:" .. modtext
end
return "<" .. modtext .. ">"
end
-- Parse raw arguments. A single parameter `data` is passed in, with the following fields:
-- * `raw_args`: The raw arguments to parse, normally taken from `frame:getParent().args`.
-- * `extra_params`: An optional function of one argument that is called on the `params` structure before parsing; its
-- purpose is to specify additional allowed parameters or possibly disable parameters.
-- * `has_source`: There is a source-language parameter following 1= (which becomes the "destination" language
-- parameter) and preceding the terms. This is currently used for {{pseudo-loan}}.
-- * `ilang`: If given, it is a language object that serves as the default for the language. If specified, there is no
-- language code specified in 1=; instead the term parameters start directly at 1= (or at 2= if `has_source` is
-- given).
-- * `require_index_for_pos`: There is no separate |pos= parameter distinct from |pos1=, |pos2=, etc. Instead,
-- specifying |pos= results in an error.
-- * `dont_require_index`: Allow |foo= to be specified as a synonym for |foo1= (except for |lit=, which remains
-- distinct).
-- * `allow_type`: Allow |type1=, |type2=, etc. or inline <type:...> for the affix type, and allow a separate |type=
-- parameter for the etymology type (FIXME: this may be confusing; consider changing the etymology type to |etype=).
-- * `allow_semicolon_separator`: Allow semicolon as a separator, displaying as " or ". This requires changes in the
-- display of the output, to not always put a + between the items.
--
-- Note that all language parameters are allowed to be etymology-only languages.
--
-- Return five values ARGS, ITEMS, LANG_OBJ, SCRIPT_OBJ, SOURCE_LANG_OBJ where ARGS is a table of the parsed arguments;
-- ITEMS is the list of parsed items; LANG_OBJ is the language object corresponding to the language code specified in 1=
-- (or taken from `ilang` if given); SCRIPT_OBJ is the script object corresponding to sc= (if given, otherwise nil); and
-- SOURCE_LANG_OBJ is the language object corresponding to the source-language code specified in 2= (or 1= if `ilang` is
-- given) if `has_source` is specified (otherwise nil).
local function parse_args(data)
local raw_args = data.raw_args
local has_source = data.has_source
local ilang = data.ilang
if raw_args.lang then
error("The |lang= parameter is not used by this template. Place the language code in parameter 1 instead.")
end
local term_index = (ilang and 1 or 2) + (has_source and 1 or 0)
local params = {
[term_index] = {list = true, allow_holes = true},
["sort"] = {},
["nocap"] = boolean_param, -- always allow this even if not used, for use with {{surf}}, which adds it
}
if not ilang then
params[1] = {required = true, type = "language", default = "und"}
end
local source_index
if has_source then
source_index = term_index - 1
params[source_index] = {required = true, type = "language", default = "und"}
end
local m_param_utils = require(parameter_utilities_module)
local param_mod_source = {}
if not data.dont_require_index then
insert(param_mod_source,
-- We want to require an index for all params (or use separate_no_index, which also requires an index for the
-- param corresponding to the first item).
{default = true, require_index = true}
)
end
insert(param_mod_source, {group = {"link", "ref", "lang", "q", "l", "infl"}})
-- Override lit= to be separate from lit1=.
insert(param_mod_source, {param = "lit", separate_no_index = true})
if not data.dont_require_index and not data.require_index_for_pos then
-- Override pos= to be separate from pos1=.
insert(param_mod_source, {param = "pos", separate_no_index = true})
end
if data.allow_type then
insert(param_mod_source, {param = "type", separate_no_index = true})
end
local param_mods = m_param_utils.construct_param_mods(param_mod_source)
if data.extra_params then
data.extra_params(params)
end
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = raw_args,
termarg = term_index,
parse_lang_prefix = true,
track_module = "homophones",
-- the inclusion of ‎ is what [[Module:affix]] has always done
default_separator = data.allow_semicolon_separator and " +‎ " or nil,
special_separators = data.allow_semicolon_separator and {[";"] = " or "} or nil,
disallow_custom_separators = not data.allow_semicolon_separator,
-- For compatibility, we need to not skip completely unspecified items. It is common, for example, to do
-- {{suffix|lang||foo}} to generate "+ -foo".
dont_skip_items = true,
-- Allow e.g. <infix> to be specified in place of <type:infix>.
pre_normalize_modifiers = pre_normalize_affix_type,
-- Don't pass in `lang` or `sc`, as they will be used as defaults to initialize the items, which we don't want
-- (particularly for `lang`), as the code in [[Module:affix]] uses the presence of `lang` as an indicator that
-- a part-specific language was explicitly given.
}
local lang = ilang or args[1]
local source
if has_source then
source = args[source_index]
end
-- For compatibility with the prior code, we need to convert items without term or properties to nil.
for i = 1, #items do
local item = items[i]
local saw_item_property = item.term
if not saw_item_property then
for k, v in pairs(item) do
if is_property_key(k) then
saw_item_property = true
break
end
end
end
if not saw_item_property then
items[i] = nil
elseif item.type then
-- Validate and canonicalize affix types.
if not recognized_affix_types[item.type] then
local valid_types = {}
for k in pairs(recognized_affix_types) do
insert(valid_types, ("'%s'"):format(k))
end
table.sort(recognized_affix_types)
error(("Unrecognized affix type '%s' in item %s; valid values are %s"):format(
item.type, item.itemno, table.concat(valid_types, ", ")))
else
item.type = recognized_affix_types[item.type]
end
end
end
if args.type and args.type.default and not m_affix.etymology_types[args.type.default] then
error("Unrecognized etymology type: '" .. args.type.default .. "'")
end
return args, items, lang, args.sc.default, source
end
local function augment_affix_data(data, args, lang, sc)
data.lang = lang
data.sc = sc
data.pos = args.pos and args.pos.default
data.lit = args.lit and args.lit.default
data.sort_key = args.sort
data.type = args.type and args.type.default
data.nocap = args.nocap
data.notext = args.notext
data.nocat = args.nocat
data.force_cat = args.force_cat
data.l = args.l.default
data.ll = args.ll.default
data.q = args.q.default
data.qq = args.qq.default
data.infl = args.infl.default
return data
end
function export.affix(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) and not args.type.default then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "awalan-"}, {term = "kata dasar"}, {term = "-akhiran"} }
else
error("You must provide at least one part.")
end
end
return m_affix.show_affix(augment_affix_data({ parts = parts }, args, lang, sc))
end
function export.compound(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) and not args.type.default then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "pertama"}, {separator = " +‎ ", term = "kedua"} }
else
error("You must provide at least one part of a compound.")
end
end
return m_affix.show_compound(augment_affix_data({ parts = parts }, args, lang, sc))
end
-- FIXME: Temporary for check in compound_like() below for old-style {{contraction}} parameters. Remove eventually.
local function ine(arg)
if arg == "" then
return nil
else
return arg
end
end
function export.compound_like(frame)
local iparams = {
["lang"] = {type = "language"},
["template"] = {},
["text"] = {},
["oftext"] = {},
["cat"] = {},
["noaffixcat"] = boolean_param,
["dont_require_index"] = boolean_param,
}
local iargs = require("Module:parameters").process(frame.args, iparams)
local parent_args = frame:getParent().args
-- Error to catch most uses of old-style parameters for {{contraction}}. (FIXME: Remove eventually.)
local term_param = iargs.lang and 1 or 2
if ine(parent_args[term_param + 2]) and not ine(parent_args[term_param + 1]) and not ine(parent_args.tr2) and not ine(parent_args.ts2)
and not ine(parent_args.t2) and not ine(parent_args.gloss2) and not ine(parent_args.g2)
and not ine(parent_args.alt2) then
error(("You specified a term in %s= and not one in %s=. You probably meant to use t= to specify a gloss instead. "
.. "If you intended to specify two terms, put the second term in %s=."):format(term_param + 2, term_param + 1,
term_param + 1))
end
if not ine(parent_args[term_param + 1]) and not ine(parent_args.alt2) and not ine(parent_args.tr2) and not ine(parent_args.ts2)
and ine(parent_args.g2) then
error(("You specified a gender in g2= but no term in %s=. You were probably trying to specify two genders for "
.. "a single term. To do that, put both genders in g=, comma-separated."):format(term_param + 1))
end
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = parent_args,
extra_params = extra_params,
ilang = iargs.lang,
dont_require_index = iargs.dont_require_index,
-- FIXME, why are we doing this? Formerly we had 'params.pos = nil' whose intention was to disable the overall
-- pos= while preserving posN=, which is equivalent to the following using the new syntax. But why is this
-- necessary?
require_index_for_pos = not iargs.dont_require_index,
allow_semicolon_separator = true,
}
local template = iargs.template
local nocat = args.nocat
local notext = args.notext
local text = not notext and iargs.text
local oftext = not notext and (iargs.oftext or text and "bagi")
local cat = not nocat and iargs.cat
local noaffixcat = nocat or iargs.noaffixcat
if not next(parts) then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "pertama"}, {separator = " +‎ ", term = "kedua"} }
end
end
return m_affix.show_compound_like(augment_affix_data({ parts = parts, text = text, oftext = oftext, cat = cat, noaffixcat = noaffixcat },
args, lang, sc))
end
function export.surface_analysis(frame)
local function ine(arg)
-- Since we're operating before calling [[Module:parameters]], we need to imitate how that module processes
-- arguments, including trimming since numbered arguments don't have automatic whitespace trimming.
if not arg then
return arg
end
arg = mw.text.trim(arg)
if arg == "" then
arg = nil
end
return arg
end
local parent_args = frame:getParent().args
local etymtext
local arg1 = ine(parent_args[1])
if not arg1 then
-- Allow omitted first argument to just display "By surface analysis".
etymtext = ""
elseif arg1:find("^%+") then
-- If the first argument (normally a language code) is prefixed with a +, it's a template name.
local template_name = arg1:sub(2)
local new_args = {}
for i, v in pairs(parent_args) do
if type(i) == "number" then
if i > 1 then
new_args[i - 1] = v
end
else
new_args[i] = v
end
end
new_args.nocap = true
etymtext = ", " .. frame:expandTemplate { title = template_name, args = new_args }
end
if etymtext then
return (ine(parent_args.nocap) and "m" or "M") .. "elalui [[Lampiran:Glosari#analisis dasar|analisis dasar]]" ..
etymtext
end
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = parent_args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "pertama"}, {separator = " +‎ ", term = "kedua"} }
else
error("You must provide at least one part.")
end
end
return m_affix.show_surface_analysis(augment_affix_data({ parts = parts }, args, lang, sc))
end
local function check_max_items(items, max_allowed)
if #items > max_allowed then
local bad_item = items[max_allowed + 1]
if bad_item.term then
error(("At most %s terms can be specified but saw a term specified for term #%s")
:format(max_allowed, max_allowed + 1))
else
for k, v in pairs(bad_item) do
if is_property_key(k) then
error(("At most %s terms can be specified but saw a value for property '%s' of term #%s")
:format(max_allowed, k, max_allowed + 1))
end
end
end
error(("Internal error: Something wrong, %s items generated when there should be at most %s, but item #%s doesn't have a term or any properties")
:format(#items, max_allowed, max_allowed + 1))
end
end
function export.circumfix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local prefix = parts[1]
local base = parts[2]
local suffix = parts[3]
-- Just to make sure someone didn't use the template in a silly way
if not (prefix and base and suffix) then
if mw.title.getCurrentTitle().nsText == "Template" then
prefix = {term = "apitan", alt = "awalan"}
base = {term = "kata dasar"}
suffix = {term = "apitan", alt = "akhiran"}
else
error("You must specify a prefix part, a base term and a suffix part.")
end
end
return m_affix.show_circumfix(augment_affix_data({ prefix = prefix, base = base, suffix = suffix }, args, lang, sc))
end
function export.confix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local prefix = parts[1]
local base = parts[3] and parts[2] or nil
local suffix = parts[3] or parts[2]
-- Just to make sure someone didn't use the template in a silly way
if not (prefix and suffix) then
if mw.title.getCurrentTitle().nsText == "Template" then
prefix = {term = "awalan"}
suffix = {term = "akhiran"}
else
error("You must specify a prefix part, an optional base term and a suffix part.")
end
end
return m_affix.show_confix(augment_affix_data({ prefix = prefix, base = base, suffix = suffix }, args, lang, sc))
end
function export.pseudo_loan(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc, source = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
has_source = true,
-- FIXME, why are we doing this? Formerly we had 'params.pos = nil' whose intention was to disable the overall
-- pos= while preserving posN=, which is equivalent to the following using the new syntax. But why is this
-- necessary?
require_index_for_pos = true,
allow_semicolon_separator = true,
}
return require(pseudo_loan_module).show_pseudo_loan(
augment_affix_data({ source = source, parts = parts }, args, lang, sc))
end
function export.infix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local base = parts[1]
local infix = parts[2]
-- Just to make sure someone didn't use the template in a silly way
if not (base and infix) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "kata dasar"}
infix = {term = "sisipan"}
else
error("You must provide a base term and an infix.")
end
end
return m_affix.show_infix(augment_affix_data({ base = base, infix = infix }, args, lang, sc))
end
function export.prefix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
local prefixes = parts
local base = nil
local max_prefix = 0
for k, v in pairs(prefixes) do
max_prefix = math.max(k, max_prefix)
end
if max_prefix >= 2 then
base = prefixes[max_prefix]
prefixes[max_prefix] = nil
end
-- Just to make sure someone didn't use the template in a silly way
if not next(prefixes) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "kata dasar"}
prefixes = { {term = "awalan"} }
else
error("You must provide at least one prefix.")
end
end
return m_affix.show_prefix(augment_affix_data({ prefixes = prefixes, base = base }, args, lang, sc))
end
function export.suffix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
local base = parts[1]
local suffixes = {}
for k, v in pairs(parts) do
suffixes[k - 1] = v
end
-- Just to make sure someone didn't use the template in a silly way
if not next(suffixes) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "kata dasar"}
suffixes = { {term = "akhiran"} }
else
error("You must provide at least one suffix.")
end
end
return m_affix.show_suffix(augment_affix_data({ base = base, suffixes = suffixes }, args, lang, sc))
end
function export.derivsee(frame)
local iargs = frame.args
local iparams = {
["derivtype"] = {},
}
local iargs = require("Module:parameters").process(frame.args, iparams)
local params = {
["head"] = {},
["id"] = {},
["sc"] = {type = "script"},
["pos"] = {},
}
local derivtype = iargs.derivtype
params[1] = {required = "true", type = "language", default = "und"}
params[2] = {}
local args = require("Module:parameters").process(frame:getParent().args, params)
local lang = args[1]
local term = args[2] or args.head
local id = args.id
local sc = args.sc
local pos = require(en_utilities_module).pluralize(args.pos or "Istilah")
if not term then
local SUBPAGE = mw.loadData("Module:headword/data").pagename
if lang:hasType("reconstructed") or mw.title.getCurrentTitle().nsText == "Rekonstruksi" then
term = "*" .. SUBPAGE
elseif lang:hasType("appendix-constructed") then
term = SUBPAGE
else
term = SUBPAGE
end
end
local category = nil
local langname = lang:getFullName()
if (derivtype == "compound" and pos == nil) then
category = "Kata majmuk dengan " .. term .. " bahasa " .. langname
elseif derivtype == "compound" and pos == "verbs" then
category = "Kata majmuk terbentuk dengan " .. term .. " bahasa " .. langname
elseif derivtype == "compound" then
category = "Kata majmuk dengan " .. term .. " bahasa " .. langname
else
category = pos .. " dengan " .. derivtype .. " " .. term .. (id and " (" .. id .. ")" or "") .. " bahasa " .. langname
end
return require('Module:collapsible category tree').make{
lang = lang,
sc = sc,
category = category,
}
end
return export
pkjq769tm4pc31rrv2bv949q1xs5ql1
Templat:akhiran/ujian
10
144628
373572
2026-09-11T18:18:09Z
SNN95
2113
Mencipta laman baru dengan kandungan '{{#invoke:affix/templates/ujian|suffix}}<noinclude>{{pendokumenan}}</noinclude>'
373572
wikitext
text/x-wiki
{{#invoke:affix/templates/ujian|suffix}}<noinclude>{{pendokumenan}}</noinclude>
i81svs0j644d09nyh6wc9i4d1pw8ko9
373575
373572
2026-09-11T18:25:18Z
SNN95
2113
373575
wikitext
text/x-wiki
<includeonly>{{#invoke:affix/templates/ujian|suffix}}</includeonly><noinclude>{{pendokumenan}}</noinclude>
e0d89g4bf4f0xn8f15plqgbg2eyo6gn
Templat:etymon/ujian
10
144629
373578
2026-09-11T18:39:20Z
SNN95
2113
Mencipta laman baru dengan kandungan '<includeonly>{{#invoke:etymon/ujian|main}}</includeonly><noinclude>{{documentation}}</noinclude>'
373578
wikitext
text/x-wiki
<includeonly>{{#invoke:etymon/ujian|main}}</includeonly><noinclude>{{documentation}}</noinclude>
7talzq2m77kaetel72sh3bdsqvkntrm
Modul:etymon/ujian
828
144630
373579
2026-09-11T18:39:45Z
SNN95
2113
Mencipta laman baru dengan kandungan '--[=[ This module implements the {{etymon}} template for structured etymology data on Wiktionary. It enables the creation of etymology trees and text by parsing etymon chains, scraping linked pages for their own {{etymon}} data, and recursively building a tree of derivational relationships. Authors: - Original implementation: [[User:Ioaxxere]] - Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]]) Modules: - [[Module:etymon]...'
373579
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Authors:
- Original implementation: [[User:Ioaxxere]]
- Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local function reset_invocation_state()
__state.current_page_has_inline_etymology = false
__state.current_page_has_redundant_etymology = false
__state.used_idless_etymon = false
__state.toplevel_has_inline_etymology = false
__state.toplevel_redundant_etymology = false
__state.toplevel_idless_etymon = false
__state.has_mismatched_id = false
__state.linked_page_multiple_etymons_idless = false
__state.linked_page_partial_etymology_sections = false
__state.max_depth_reached = 0
__state.total_nodes = 0
__state.language_count = {}
__state.toplevel_keyword_stats = {}
__state.warnings = {}
end
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data",
tree = "Module:etymon/tree",
text = "Module:etymon/text",
categories = "Module:etymon/categories",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data",
text_allowed = "Module:etymon/data/text_allowed",
},
})
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
function Util.resolve_context_lang(lang, node_args)
if type(node_args) ~= "table" then return lang end
if node_args.status == M.data.STATUS.INLINE then return lang end
if not (lang.hasType and lang:hasType("etymology-only")) then return lang end
local full = lang.getFull and lang:getFull()
if not full or full:getCode() == lang:getCode() then return lang end
if full.hasAncestor and full:hasAncestor(lang) then return lang end
return full
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
if opts.gloss ~= "suppress" then
link_params.gloss = term.t
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
link_params.infl = term.infl
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
return M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "from" and (base.text == "From" or base.text == "from"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "By [[Appendix:Glossary#surface_analysis|surface analysis]],"
local surf_phrase = "by surface analysis,"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and #code == 2 then
local gender_adj = codes[code:sub(1, 1)]
local number_adj = codes[code:sub(2, 2)]
if gender_adj and number_adj then
adj = gender_adj .. " " .. number_adj
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Appendix:Glossary#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Appendix:Glossary#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
infl = { type = "form of tags" },
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
}
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. ".")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\".")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
return M.links.full_link({
term = page,
lang = norm_lang,
no_generate_forms = true,
}, "term")
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local current_etymology_has_nonlemma = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon or current_etymology_has_nonlemma then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
current_etymology_has_nonlemma = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find("^Etymology") then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if template_name == "etymon" then
local template_args = node:get_arguments()
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code then
if is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_nonlemma = true
end
else
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
term.id = etymon_data.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.infl = etymon_data.infl
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
local parse_context_lang = Util.resolve_context_lang(lang, args)
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
infl = node.infl,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == 118 then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:stripDiacritics(M.links.remove_links(tree_title)) ~= lang:stripDiacritics(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local is_nonlemma = M.yesno(args.nl, false)
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == "Reconstruction" then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == "Reconstruction" then
entry_pagename = "*" .. entry_pagename
end
if lang:stripDiacritics(M.links.remove_links(title)) ~= lang:stripDiacritics(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = norm_lang:getCanonicalName()
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").")
end
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = is_nonlemma,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if is_nonlemma then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
d0thspkud5zawi6og8iirurr2pt34q1
373583
373579
2026-09-11T19:17:43Z
SNN95
2113
kemaskini
373583
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Authors:
- Original implementation: [[User:Ioaxxere]]
- Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local function reset_invocation_state()
__state.current_page_has_inline_etymology = false
__state.current_page_has_redundant_etymology = false
__state.used_idless_etymon = false
__state.toplevel_has_inline_etymology = false
__state.toplevel_redundant_etymology = false
__state.toplevel_idless_etymon = false
__state.has_mismatched_id = false
__state.linked_page_multiple_etymons_idless = false
__state.linked_page_partial_etymology_sections = false
__state.max_depth_reached = 0
__state.total_nodes = 0
__state.language_count = {}
__state.toplevel_keyword_stats = {}
__state.warnings = {}
end
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data",
tree = "Module:etymon/tree",
text = "Module:etymon/text",
categories = "Module:etymon/categories/ujian",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data",
text_allowed = "Module:etymon/data/text_allowed",
},
})
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
function Util.resolve_context_lang(lang, node_args)
if type(node_args) ~= "table" then return lang end
if node_args.status == M.data.STATUS.INLINE then return lang end
if not (lang.hasType and lang:hasType("etymology-only")) then return lang end
local full = lang.getFull and lang:getFull()
if not full or full:getCode() == lang:getCode() then return lang end
if full.hasAncestor and full:hasAncestor(lang) then return lang end
return full
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
if opts.gloss ~= "suppress" then
link_params.gloss = term.t
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
link_params.infl = term.infl
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
return M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "from" and (base.text == "From" or base.text == "from"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "By [[Appendix:Glossary#surface_analysis|surface analysis]],"
local surf_phrase = "by surface analysis,"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and #code == 2 then
local gender_adj = codes[code:sub(1, 1)]
local number_adj = codes[code:sub(2, 2)]
if gender_adj and number_adj then
adj = gender_adj .. " " .. number_adj
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Appendix:Glossary#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Appendix:Glossary#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
infl = { type = "form of tags" },
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
}
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. ".")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\".")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
return M.links.full_link({
term = page,
lang = norm_lang,
no_generate_forms = true,
}, "term")
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local current_etymology_has_nonlemma = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon or current_etymology_has_nonlemma then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
current_etymology_has_nonlemma = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find("^Etymology") then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if template_name == "etymon" then
local template_args = node:get_arguments()
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code then
if is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_nonlemma = true
end
else
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
term.id = etymon_data.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.infl = etymon_data.infl
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
local parse_context_lang = Util.resolve_context_lang(lang, args)
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
infl = node.infl,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == 118 then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:stripDiacritics(M.links.remove_links(tree_title)) ~= lang:stripDiacritics(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local is_nonlemma = M.yesno(args.nl, false)
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == "Reconstruction" then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == "Reconstruction" then
entry_pagename = "*" .. entry_pagename
end
if lang:stripDiacritics(M.links.remove_links(title)) ~= lang:stripDiacritics(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = norm_lang:getCanonicalName()
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").")
end
end
reset_invocation_state()
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = is_nonlemma,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if is_nonlemma then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
4lgwmlz86hdjgdyzba75tt5f5cam94w
Modul:etymon/categories/ujian
828
144631
373582
2026-09-11T19:14:25Z
SNN95
2113
Mencipta laman baru dengan kandungan 'local export = {} local M = require("Module:module loader").init({ require = { etymology = "Module:etymology", affix = "Module:affix", etymology_specialized = "Module:etymology/specialized", utilities = "Module:utilities", roots = "Module:roots", }, loadData = { data = "Module:etymon/data", }, }) -- Fungsi utiliti untuk huruf besar local function ucfirst(text) if not text then return text end return mw.ustring.upper(mw.ustring.sub(t...'
373582
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
etymology = "Module:etymology",
affix = "Module:affix",
etymology_specialized = "Module:etymology/specialized",
utilities = "Module:utilities",
roots = "Module:roots",
},
loadData = {
data = "Module:etymon/data",
},
})
-- Fungsi utiliti untuk huruf besar
local function ucfirst(text)
if not text then return text end
return mw.ustring.upper(mw.ustring.sub(text, 1, 1)) .. mw.ustring.sub(text, 2)
end
-- Nilaikan sama ada kata kunci adalah transitif bagi sesuatu istilah
local function is_transitive(transitive_mode, page_lang, term_lang)
if transitive_mode == M.data.TRANSITIVE.ALWAYS then
return true
elseif transitive_mode == M.data.TRANSITIVE.NEVER then
return false
elseif transitive_mode == M.data.TRANSITIVE.CROSS_LANG then
return page_lang:getCode() ~= term_lang:getCode()
elseif transitive_mode == M.data.TRANSITIVE.CROSS_LANG_NO_INTERNAL_SOURCE then
return page_lang:getCode() ~= term_lang:getCode()
end
error("Mod transitif tidak diketahui: " .. tostring(transitive_mode))
end
-- Dapatkan konfigurasi kata kunci dengan pengesampingan khusus bahasa
local function get_keyword_config(keyword, lang_exc)
local base_config = M.data.keywords[keyword]
if not base_config then
return nil -- Kata kunci tidak sah
end
local overrides = lang_exc and lang_exc.keyword_overrides and lang_exc.keyword_overrides[keyword]
if not overrides then
return base_config
end
-- Gabungkan pengesampingan ke dalam konfigurasi asas
local merged = {}
for k, v in pairs(base_config) do
merged[k] = v
end
for k, v in pairs(overrides) do
merged[k] = v
end
return merged
end
function export.get_cat_name(source)
local _, cat_name = M.etymology.get_display_and_cat_name(source, true)
return cat_name
end
-- Normalkan alias jenis imbuhan
local aftype_aliases = {
["pre"] = "awalan",
["suf"] = "akhiran",
["in"] = "infix",
["inter"] = "interfix",
["circum"] = "circumfix",
["naf"] = "non-affix",
["root"] = "non-affix",
}
local function add_category(categories, cat_name, sort_key, sort_base)
if categories[cat_name] == nil then
categories[cat_name] = {
sort_key = sort_key,
sort_base = sort_base,
}
return
end
local existing = categories[cat_name]
if existing.sort_key == nil and sort_key ~= nil then
existing.sort_key = sort_key
end
if existing.sort_base == nil and sort_base ~= nil then
existing.sort_base = sort_base
end
end
-- Kumpulkan kategori imbuhan daripada bekas kumpulan peringkat atas
local function collect_affix_categories(node, page_lang, available_etymon_ids, senseid_parent_etymon, lang_exc)
local parts = {}
local part_index = 1
for _, container in ipairs(node.children or {}) do
local config = container.keyword_info
if config and config.affix_categories then
for _, term in ipairs(container.terms or {}) do
if not term.unknown_term then
local part_data = {
term = term.title,
tr = term.tr,
ts = term.ts,
alt = term.alt,
itemno = part_index,
orig_index = part_index
}
-- Tentukan jenis imbuhan: aftype tersurat > pos=root > auto-kesan
local aftype = term.aftype
if aftype then
aftype = aftype_aliases[aftype] or aftype
part_data.type = aftype
elseif term.args and term.args.pos and term.args.pos == "root" then
part_data.type = "non-affix"
end
if term.lang:getCode() ~= page_lang:getCode() then
part_data.lang = term.lang
end
local target_ids = available_etymon_ids[term.target_key]
local has_multiple_ids = target_ids and #target_ids > 1
local id_exists_in_disambiguation = false
local matched_id = nil
-- Hitung senseid yang tersedia untuk halaman sasaran
local senseid_count = 0
local target_prefix = term.target_key .. ":"
if senseid_parent_etymon then
for key, _ in pairs(senseid_parent_etymon) do
if key:sub(1, #target_prefix) == target_prefix then
senseid_count = senseid_count + 1
end
end
end
local has_multiple_senseids = senseid_count > 1
if term.id then
-- Periksa jika pengguna menyediakan senseid yang sah
local senseid_key = term.target_key .. ":" .. term.id
if senseid_parent_etymon and senseid_parent_etymon[senseid_key] then
if has_multiple_senseids then
-- senseid kabur: gunakan senseid
matched_id = term.id
id_exists_in_disambiguation = true
elseif has_multiple_ids then
-- senseid unik tetapi etimon kabur: gunakan ID etimon
matched_id = term.etymon_id or term.id
id_exists_in_disambiguation = true
end
else
-- Periksa jika pengguna menyediakan ID etimon yang sah
if has_multiple_ids and target_ids then
for _, id_data in ipairs(target_ids) do
local stored_id = type(id_data) == "table" and id_data.id or id_data
if stored_id == term.id then
-- Etimon kabur: gunakan ID etimon
id_exists_in_disambiguation = true
matched_id = term.id
break
end
end
end
-- Sandaran: periksa etymon_id yang diselesaikan (cth. daripada langkah-langkah sebelumnya)
if not id_exists_in_disambiguation and has_multiple_ids and term.etymon_id and target_ids then
for _, id_data in ipairs(target_ids) do
local stored_id = type(id_data) == "table" and id_data.id or id_data
if stored_id == term.etymon_id then
id_exists_in_disambiguation = true
matched_id = term.etymon_id
break
end
end
end
end
end
-- Gunakan ID yang sepadan jika dijumpai
if term.override or id_exists_in_disambiguation then
part_data.id = matched_id or term.id
end
table.insert(parts, part_data)
part_index = part_index + 1
end
end
end
end
if #parts == 0 then return {} end
local affix_data = {
lang = page_lang,
parts = parts,
pos = "perkataan",
sort_key = nil,
}
if #parts == 1 then
affix_data.allow_no_affixes_or_compounds = true
end
local affix_categories = M.affix.get_affix_categories_only(affix_data)
local result = {}
for _, cat in ipairs(affix_categories) do
if type(cat) == "table" then
table.insert(result, { cat = cat.cat, sort_key = cat.sort_key, sort_base = cat.sort_base })
else
table.insert(result, { cat = cat })
end
end
return result
end
local function lang_is_source(page_lang, source)
return page_lang:getCode() == source:getCode() or page_lang:hasParent(source)
end
local function is_borrowing_keyword_config(config)
return config and (config.borrowing_type or config.specialized_borrowing)
end
local function add_reborrow_category(categories, page_lang)
local lang_name = page_lang:getFullName()
add_category(categories, "Perkataan " .. lang_name .. " yang dipinjam kembali ke dalam " .. lang_name)
end
local function borrow_returns_to_page_lang(page_lang, source, in_foreign_branch)
if not in_foreign_branch then
return false
end
if source:getFullCode() == page_lang:getFullCode() then
return true
end
return page_lang:hasParent(source)
end
local function node_borrows_from_lang(node, page_lang, visited, in_foreign_branch)
visited = visited or {}
if not node or visited[node] then
return false
end
visited[node] = true
if node.is_duplicate then
if node.duplicate_of then
return node_borrows_from_lang(node.duplicate_of, page_lang, visited, in_foreign_branch)
end
return false
end
local node_is_foreign = in_foreign_branch
or (node.lang and node.lang:getFullCode() ~= page_lang:getFullCode())
for _, container in ipairs(node.children or {}) do
if is_borrowing_keyword_config(container.keyword_info) then
for _, child_term in ipairs(container.terms or {}) do
if borrow_returns_to_page_lang(page_lang, child_term.lang, node_is_foreign) then
return true
end
end
end
for _, child_term in ipairs(container.terms or {}) do
if child_term.status == M.data.STATUS.OK or child_term.status == M.data.STATUS.INLINE then
if node_borrows_from_lang(child_term, page_lang, visited, node_is_foreign) then
return true
end
end
end
end
return false
end
local function should_add_reborrow_category(page_lang, term)
if page_lang:getCode() == term.lang:getCode() then
return false
end
if term.status ~= M.data.STATUS.OK and term.status ~= M.data.STATUS.INLINE then
return false
end
return node_borrows_from_lang(term, page_lang, {}, false)
end
-- Tambah kategori berkaitan peminjaman (peringkat atas sahaja)
local function collect_borrowing_categories(categories, page_lang, term, config, check_reborrow_path)
if check_reborrow_path and should_add_reborrow_category(page_lang, term) then
add_reborrow_category(categories, page_lang)
end
if config.borrowing_type == "borrowed" and not lang_is_source(page_lang, term.lang) then
local temp_categories = {}
M.etymology.insert_borrowed_cat(temp_categories, page_lang, term.lang)
for _, cat in ipairs(temp_categories) do
add_category(categories, cat)
end
end
if config.specialized_borrowing and not lang_is_source(page_lang, term.lang) then
local result = M.etymology_specialized.specialized_borrowing {
bortype = config.specialized_borrowing,
lang = page_lang,
sources = { term.lang },
terms = { { lang = term.lang, term = "-" } },
notext = true,
nocat = false,
}
for cat_name in result:gmatch("%[%[Category:([^%]]+)%]%]") do
add_category(categories, cat_name)
end
end
end
-- Tambah kategori terbitan berasaskan sumber (peringkat atas sahaja)
local function collect_source_derivation_categories(categories, page_lang, term, config)
if not config.source_category_type then
return
end
local temp_categories = {}
M.etymology.insert_source_cat_get_display {
lang = page_lang,
source = term.lang,
categories = temp_categories,
borrowing_type = config.source_category_type,
nocat = false,
}
for _, cat in ipairs(temp_categories) do
add_category(categories, cat)
end
end
-- Tambah kategori bahasa sumber
local function collect_source_categories(categories, page_lang, term, chain, get_norm_lang_func)
if page_lang:getCode() == get_norm_lang_func(term.lang):getCode() then
return
end
local temp_categories = {}
M.etymology.insert_source_cat_get_display {
lang = page_lang,
source = term.lang,
categories = temp_categories,
nocat = false,
}
for _, cat in ipairs(temp_categories) do
add_category(categories, cat)
end
if chain.inherited then
temp_categories = {}
M.etymology.insert_source_cat_get_display {
lang = page_lang,
source = term.lang,
categories = temp_categories,
borrowing_type = "terms inherited",
nocat = false,
}
for _, cat in ipairs(temp_categories) do
add_category(categories, cat)
end
end
end
-- Tambah kategori akar/perkataan
local function collect_pos_categories(categories, page_lang, root_title, term, available_etymon_ids, chain,
get_norm_lang_func, lang_exc, keyword)
local pos_types = { root = "akar", word = "perkataan" }
-- Tentukan pos: daripada postype istilah, pos_override kata kunci, atau args.pos
local pos
local config = get_keyword_config(keyword, lang_exc)
if term.postype then
-- Pengubahsuai postype peringkat istilah mengambil keutamaan tertinggi
pos = term.postype
elseif config and config.pos_override then
pos = config.pos_override
elseif type(term.args) == "table" and term.args.pos then
pos = term.args.pos
end
local pos_type = pos_types[pos]
if not pos_type or term.unknown_term then
return
end
-- Langkau kategori akar/perkataan untuk keturunan kumpulan imbuhan
-- if pos_type then
-- return
-- end
local same_language = get_norm_lang_func(page_lang):getFullCode() == get_norm_lang_func(term.lang):getFullCode()
-- Langkau rujukan kendiri
if same_language and root_title == term.title then
return
end
local entry_name
if pos_type == "akar" then
entry_name = term.title
M.roots.assert_root(term.lang, entry_name)
else
entry_name = term.lang:makeEntryName(term.title)
end
local lang_name = page_lang:getCanonicalName()
local cat_name
if chain.passed_through then
local etymon_lang_name = export.get_cat_name(term.lang)
cat_name = "Perkataan " .. lang_name .. " yang diterbitkan daripada " .. pos_type .. " " .. etymon_lang_name .. " " .. entry_name
else
cat_name = "Perkataan " .. lang_name .. " yang tergolong dalam " .. pos_type .. " " .. entry_name
end
-- Tambah penyahkaburan ID jika perlu (untuk akar/perkataan: gunakan etymon_id jika diselesaikan melalui senseid, jika tidak gunakan id)
local target_ids = available_etymon_ids[term.target_key]
local effective_id = term.etymon_id or term.id -- etymon_id jika senseid, jika tidak id sudah pun merupakan id etimon
if target_ids and effective_id then
local same_pos_count = 0
for _, id_data in ipairs(target_ids) do
if type(id_data) == "table" and id_data.pos == pos then
same_pos_count = same_pos_count + 1
end
end
if same_pos_count > 1 then
cat_name = cat_name .. " (" .. effective_id .. ")"
end
end
add_category(categories, cat_name)
end
-- Hitung keadaan rantaian untuk suatu istilah berdasarkan rantaian induk dan konfigurasi kata kunci
-- Corak sengkang untuk pengesanan imbuhan (sengkang biasa + khusus skrip)
local AFFIX_HYPHEN_PATTERN = "[%-%־ـ᠊]" -- sengkang biasa, maqqef Ibrani, tatweel Arab, sengkang Mongolia
-- Periksa jika suatu istilah merupakan imbuhan sebenar (bukan ahli bukan imbuhan dalam kumpulan imbuhan)
local function is_actual_affix(term)
-- Periksa pengubahsuai aftype tersurat
if term.aftype then
local normalized = aftype_aliases[term.aftype] or term.aftype
return normalized ~= "non-affix"
end
-- Periksa jika pos=root (dilayan sebagai bukan imbuhan)
if term.args and term.args.pos and term.args.pos == "root" then
return false
end
-- Auto-kesan menggunakan sengkang: awalan berakhir dengan -, akhiran bermula dengan -, dsb.
if term.title then
local title = term.title
-- Tanggalkan * di hadapan untuk istilah yang direkonstruksi sebelum memeriksa sengkang
title = title:gsub("^%*", "")
-- Periksa sengkang di awal atau akhir (mengendalikan sengkang khusus skrip juga)
if title:match("^" .. AFFIX_HYPHEN_PATTERN) or title:match(AFFIX_HYPHEN_PATTERN .. "$") then
return true
end
end
-- Lalai: bukan imbuhan
return false
end
local function compute_category_chain(parent_chain, config, page_lang, term_lang, get_norm_lang_func, parent_term_lang, term)
-- Jejak jika kita berada di dalam imbuhan sebenar (untuk menindas kategori akar pada keturunan)
-- Hanya tetapkan jika istilah tersebut merupakan imbuhan sebenar (awalan, akhiran, dsb.), bukan ahli bukan imbuhan
local inside_affix = parent_chain.inside_affix
if config.affix_categories and term and is_actual_affix(term) then
inside_affix = true
end
-- Jika no_child_categories ditetapkan, lumpuhkan semuanya
if config.no_child_categories then
return {
passed_through = parent_chain.passed_through or page_lang:getCode() ~= get_norm_lang_func(term_lang):getCode(),
inherited = false,
source = false,
pos = false,
recurse = false,
inside_affix = inside_affix,
}
end
local term_is_transitive = is_transitive(config.transitive, page_lang, term_lang)
local new_source = parent_chain.source and term_is_transitive
-- Untuk CROSS_LANG_NO_INTERNAL_SOURCE: jejak konteks bahasa terbitan dalaman
-- Periksa jika istilah ini adalah dalaman secara relatif terhadap bahasa istilah induk (jika parent_term_lang disediakan)
-- atau secara relatif terhadap bahasa halaman (jika tiada parent_term_lang)
local internal_lang = parent_chain.internal_lang
local is_internal_in_context = false
if config.transitive == M.data.TRANSITIVE.CROSS_LANG_NO_INTERNAL_SOURCE then
local check_lang = parent_term_lang or page_lang
local term_lang_code = get_norm_lang_func(term_lang):getCode()
local check_lang_code = get_norm_lang_func(check_lang):getCode()
if internal_lang then
-- Sudah berada dalam konteks terbitan dalaman: periksa jika istilah ini juga dalaman
is_internal_in_context = term_lang_code == internal_lang
else
-- Periksa jika istilah ini adalah dalaman secara relatif terhadap istilah induk (atau halaman jika tiada induk)
is_internal_in_context = term_lang_code == check_lang_code
end
end
-- Tingkah laku rantaian sumber untuk CROSS_LANG_NO_INTERNAL_SOURCE
if config.transitive == M.data.TRANSITIVE.CROSS_LANG_NO_INTERNAL_SOURCE then
if is_internal_in_context then
-- Terbitan dalaman
new_source = false
internal_lang = get_norm_lang_func(term_lang):getCode()
else
-- Merentas bahasa
new_source = parent_chain.source and term_is_transitive
internal_lang = nil
end
end
local new_pos = parent_chain.pos
return {
passed_through = parent_chain.passed_through or page_lang:getCode() ~= get_norm_lang_func(term_lang):getCode(),
inherited = parent_chain.inherited and config.inherited_chain,
source = new_source,
pos = new_pos,
internal_lang = internal_lang,
recurse = new_source or new_pos,
inside_affix = inside_affix,
}
end
function export.render(opts)
opts = opts or {}
local data_tree = opts.data_tree
local page_lang = opts.page_lang
local available_etymon_ids = opts.available_etymon_ids
local senseid_parent_etymon = opts.senseid_parent_etymon
local get_norm_lang_func = opts.get_norm_lang_func
local lang_exc = opts.lang_exc
local categories = {}
local seen = {}
local lang_name = page_lang:getCanonicalName()
local root_title = data_tree.title
-- Kumpulkan pepohon secara rekursif
local function collect(node, parent_chain, is_toplevel)
-- Elakkan memproses nod yang sama dua kali
if not node.unknown_term and node.title then
local key = node.lang:getFullCode() .. ":" .. (node.title or "") .. ":" .. (node.id or "")
if seen[key] then return end
seen[key] = true
end
-- Kumpulkan kategori imbuhan pada peringkat atas sahaja
if is_toplevel then
local affix_cats = collect_affix_categories(node, page_lang, available_etymon_ids, senseid_parent_etymon, lang_exc)
for _, cat in ipairs(affix_cats) do
-- Buang cantuman "lang_name" dari sini kerana Modul:affix sudah menjana nama bahasa yang lengkap
add_category(categories, cat.cat, cat.sort_key, cat.sort_base)
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
local config = supplement.config
if config and config.toplevel_category then
add_category(categories, ucfirst(config.toplevel_category) .. " bahasa " .. lang_name)
end
end
end
end
-- Proses setiap bekas
for _, container in ipairs(node.children or {}) do
local keyword = container.keyword
local config = get_keyword_config(keyword, lang_exc)
-- Langkau kata kunci yang tidak sah
if config then
-- Proses setiap istilah dalam bekas
for _, term in ipairs(container.terms or {}) do
local term_chain = compute_category_chain(parent_chain, config, page_lang, term.lang, get_norm_lang_func, node.lang, term)
local no_child_categories = config.no_child_categories == true
local term_is_transitive = is_transitive(config.transitive, page_lang, term.lang)
-- Pemprosesan peringkat atas sahaja
if is_toplevel then
-- Penjejakan etimon yang hilang/kabur
if not term.unknown_term and (term.status == M.data.STATUS.MISSING or term.status == M.data.STATUS.REDLINK) then
add_category(categories, "Lema " .. lang_name .. " yang merujuk etimon yang hilang")
end
if not term.unknown_term and term.status == M.data.STATUS.AMBIGUOUS then
add_category(categories, "Lema " .. lang_name .. " yang merujuk etimon yang kabur")
end
if term.missing_descendants_header then
add_category(categories, "Lema " .. lang_name .. " yang merujuk etimon tanpa bahagian Keturunan")
end
if term.missing_descendants_entry then
add_category(categories, "Lema " .. lang_name .. " yang merujuk etimon tanpa istilah ini dalam bahagian Keturunan")
end
-- Kategori peringkat atas (cth., "undefined derivations")
if config.toplevel_category then
add_category(categories, ucfirst(config.toplevel_category) .. " bahasa " .. lang_name)
end
-- Kategori peminjaman (bor, lbor, slbor, ubor, obor)
if config.borrowing_type or config.specialized_borrowing then
collect_borrowing_categories(categories, page_lang, term, config, true)
end
-- Kategori peminjaman daripada pengubahsuai <bor>, <lbor>, atau <slbor> pada istilah kumpulan imbuhan
local kw_config = M.data.keywords[keyword]
if kw_config and kw_config.affix_categories then
if term.bor then
local bor_config = { borrowing_type = "borrowed" }
collect_borrowing_categories(categories, page_lang, term, bor_config, true)
elseif term.lbor then
local bor_config = { specialized_borrowing = "learned" }
collect_borrowing_categories(categories, page_lang, term, bor_config, true)
elseif term.slbor then
local bor_config = { specialized_borrowing = "semi-learned" }
collect_borrowing_categories(categories, page_lang, term, bor_config, true)
end
end
-- Kategori terbitan berasaskan sumber (sl, calque, pcal)
if config.source_category_type then
collect_source_derivation_categories(categories, page_lang, term, config)
end
-- Langkau semua pengkategorian anak jika no_child_categories ditetapkan
if not no_child_categories then
-- Kategori sumber hanya jika transitif
if term_is_transitive then
collect_source_categories(categories, page_lang, term, term_chain, get_norm_lang_func)
end
-- Kategori pos sentiasa (melainkan no_child_categories)
collect_pos_categories(categories, page_lang, root_title, term, available_etymon_ids, term_chain,
get_norm_lang_func, lang_exc, keyword)
end
else
-- Di bawah peringkat atas, patuhi rantaian induk
if parent_chain.source then
collect_source_categories(categories, page_lang, term, term_chain, get_norm_lang_func)
end
if parent_chain.pos then
collect_pos_categories(categories, page_lang, root_title, term, available_etymon_ids, term_chain,
get_norm_lang_func, lang_exc, keyword)
end
end
-- Rekursi ke dalam anak istilah jika perlu dan status membenarkan
if term_chain.recurse and (term.status == M.data.STATUS.OK or term.status == M.data.STATUS.INLINE) then
collect(term, term_chain, false)
end
end
end
end
end
-- Keadaan rantaian awal
local initial_chain = {
passed_through = false,
inherited = true,
source = true,
pos = true,
internal_lang = nil,
recurse = true,
inside_affix = false,
}
collect(data_tree, initial_chain, true)
local cat_list = {}
for cat_name, sort_data in pairs(categories) do
if sort_data.sort_key ~= nil or sort_data.sort_base ~= nil then
table.insert(cat_list, {
name = cat_name,
sort_key = sort_data.sort_key,
sort_base = sort_data.sort_base,
})
else
table.insert(cat_list, cat_name)
end
end
return cat_list
end
function export.build(opts)
opts = opts or {}
local categories = {}
if not opts.suppress_categories and not opts.nocat then
categories = export.render({
data_tree = opts.data_tree,
page_lang = opts.page_lang,
available_etymon_ids = opts.available_etymon_ids,
senseid_parent_etymon = opts.senseid_parent_etymon,
get_norm_lang_func = opts.get_norm_lang_func,
lang_exc = opts.lang_exc,
})
end
local page_lang = opts.page_lang
if not page_lang then
return categories
end
local lang_name = page_lang:getCanonicalName()
table.insert(categories, "Halaman dengan etimon")
table.insert(categories, "Lema " .. lang_name .. " dengan etimon")
if opts.tree then
table.insert(categories, "Halaman dengan pepohon etimologi")
table.insert(categories, "Lema " .. lang_name .. " dengan pepohon etimologi")
end
if opts.text then
table.insert(categories, "Lema " .. lang_name .. " dengan teks etimologi")
end
if opts.exnihilo then
table.insert(categories, "Perkataan " .. lang_name .. " yang dicipta ex nihilo")
end
if opts.toplevel_has_inline_etymology then
table.insert(categories, "Halaman dengan etimon sebaris untuk pautan merah")
end
if opts.toplevel_redundant_etymology then
table.insert(categories, "Halaman dengan etimon sebaris lewah")
end
if opts.toplevel_idless_etymon then
table.insert(categories, "Halaman yang menggunakan etimon tanpa ID")
end
if opts.has_mismatched_id then
table.insert(categories, "Lema " .. lang_name .. " yang merujuk etimon dengan ID yang tidak sepadan")
end
if opts.linked_page_multiple_etymons_idless then
table.insert(categories,
"Lema " .. lang_name .. " yang merujuk halaman dengan berbilang etimon yang kehilangan ID")
end
if opts.linked_page_partial_etymology_sections then
table.insert(categories,
"Lema " .. lang_name .. " yang merujuk halaman dengan bahagian etimologi yang kehilangan etimon")
end
if opts.text_stop_lang_missing then
table.insert(categories, "Halaman dengan bahasa henti teks etimologi bukan dalam rantaian")
table.insert(categories, "Lema " .. lang_name .. " dengan bahasa henti teks etimologi bukan dalam rantaian")
end
return categories
end
function export.format(entries, lang)
if type(entries) ~= "table" or #entries == 0 then
return ""
end
local parts = {}
for _, category in ipairs(entries) do
if type(category) == "table" and type(category.name) == "string" then
table.insert(parts, M.utilities.format_categories({ category.name }, lang, category.sort_key, category.sort_base))
elseif type(category) == "string" then
table.insert(parts, M.utilities.format_categories({ category }, lang))
end
end
return table.concat(parts)
end
return export
3s0p5juoi0lfbdk57jfta3d6318mgp2
Wikikamus:mfa/jerik
4
144632
373589
2026-09-11T23:18:34Z
Rulwarih
2287
/* */
373589
wikitext
text/x-wiki
==Bahasa {{bahasa|mfa}}==
===Kata kerja===
{{inti|mfa|kata kerja}}
# menangis
4d1nwlaec9hlv5pn4fbfd1dftn38f51
Wikikamus:bdr/gadung
4
144633
373591
2026-09-12T09:39:47Z
Jainnie
10839
Tambah ayat
373591
wikitext
text/x-wiki
==Bahasa {{bahasa|bdr}}==
===Kata sifat===
{{inti|bdr|kata sifat}}
# {{label|1=bdr|2=|3=sabahan}} hijau {{cp|bdr|Badu kekanak tu '''gadung'''.|Baju budak itu warna '''[[hijau]]'''.}}
rw47e65kmj3tcb3o5udf1pdkbhlb0zu