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 " +&lrm; " 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 " +&lrm; " 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 " +&lrm; " 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 " +&lrm; " 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 " +&lrm; " 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 &lrm; is what [[Module:affix]] has always done default_separator = data.allow_semicolon_separator and " +&lrm; " 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 = " +&lrm; ", 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 = " +&lrm; ", 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 = " +&lrm; ", 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 &lrm; is what [[Module:affix]] has always done default_separator = data.allow_semicolon_separator and " +&lrm; " 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 = " +&lrm; ", 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 = " +&lrm; ", 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 = " +&lrm; ", 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