ဝိက်ရှေန်နရဳ mnwwiktionary https://mnw.wiktionary.org/wiki/%E1%80%9D%E1%80%AD%E1%80%80%E1%80%BA%E1%80%9B%E1%80%BE%E1%80%B1%E1%80%94%E1%80%BA%E1%80%94%E1%80%9B%E1%80%B3:%E1%80%99%E1%80%AF%E1%80%80%E1%80%BA%E1%80%9C%E1%80%AD%E1%80%80%E1%80%BA%E1%80%90%E1%80%99%E1%80%BA MediaWiki 1.47.0-wmf.21 case-sensitive မဳဒဳယာ တၟေင် ဓရီုကျာ ညးလွပ် ညးလွပ် ဓရီုကျာ ဝိက်ရှေန်နရဳ ဝိက်ရှေန်နရဳ ဓရီုကျာ ဝှာင် ဝှာင် ဓရီုကျာ မဳဒဳယာဝဳကဳ မဳဒဳယာဝဳကဳ ဓရီုကျာ ထာမ်ပလိက် ထာမ်ပလိက် ဓရီုကျာ ရီု ရီု ဓရီုကျာ ကဏ္ဍ ကဏ္ဍ ဓရီုကျာ အဆက်လက္ကရဴ အဆက်လက္ကရဴ ဓရီုကျာ ကာရန် ကာရန် ဓရီုကျာ အဘိဓာန် အဘိဓာန် ဓရီုကျာ ဗီုပြၚ်သိုၚ်တၟိ ဗီုပြၚ်သိုၚ်တၟိ ဓရီုကျာ TimedText TimedText talk မဝ်ဂျူ မဝ်ဂျူ ဓရီုကျာ Event Event talk မဝ်ဂျူ:languages/data/3/t 828 661 402099 400482 2026-09-27T16:46:57Z Intobesa.bot 1035 Bot: ပွမကၠာဲစုတ်ယၟုနူဘာသာအၚ်္ဂလိက် 402099 Scribunto text/plain local m_langdata = require("Module:languages/data") -- Loaded on demand, as it may not be needed (depending on the data). local function u(...) u = require("Module:string utilities").char return u(...) end local c = m_langdata.chars local p = m_langdata.puaChars local s = m_langdata.shared local m = {} m["taa"] = { "Lower Tanana", 28565, "ath-nor", "Latn", } m["tab"] = { "တဗါသာရာန်", 34079, "cau-esm", "Cyrl, Latn, Arab", translit = "tab-translit", override_translit = true, display_text = {Cyrl = s["cau-Cyrl-displaytext"]}, entry_name = { Cyrl = s["cau-Cyrl-entryname"], Latn = s["cau-Latn-entryname"], }, sort_key = "tab-sortkey", } m["tac"] = { "Lowland Tarahumara", 15616384, "azc-trc", "Latn", } m["tad"] = { "Tause", 2356440, "paa-lkp", "Latn", } m["tae"] = { "Tariana", 732726, "awd-nwk", "Latn", } m["taf"] = { "ထာပေအ်ရာပဵု", 7684673, "tup-gua", "Latn", } m["tag"] = { "Tagoi", 36537, "nic-ras", "Latn", } m["taj"] = { "တမာန် လ္ပာ်ဖာဗၟံက်", 12953177, "sit-tam", "sit-tam-Tibt, Deva", display_text = {["sit-tam-Tibt"] = s["Tibt-displaytext"]}, entry_name = {["sit-tam-Tibt"] = s["Tibt-entryname"]}, } m["tak"] = { "Tala", 3914494, "cdc-wst", "Latn", } m["tal"] = { "Tal", 3440387, "cdc-wst", "Latn", } m["tan"] = { "Tangale", 529921, "cdc-wst", "Latn", } m["tao"] = { "ယျာမိ", 715760, "phi", "Latn", } m["tap"] = { "Taabwa", 7673650, "bnt-sbi", "Latn", } m["tar"] = { "ထာရာန်ဟူမာရာန် ဗဟဵု", 20090009, "azc-trc", "Latn", sort_key = {remove_diacritics = c.acute .. "ꞌ"}, } m["tas"] = { "Tây Bồi", 2233794, "crp", "Latn", ancestors = "fr", sort_key = s["roa-oil-sortkey"], } m["tau"] = { "Upper Tanana", 28281, "ath-nor", "Latn", } m["tav"] = { "Tatuyo", 2524007, "sai-tuc", "Latn", } m["taw"] = { "Tai", 7675861, "ngf-mad", "Latn", } m["tax"] = { "Tamki", 3449082, "cdc-est", "Latn", } m["tay"] = { "အာတာယော", 715766, "map-ata", "Latn", } m["taz"] = { "Tocho", 36680, "alv-tal", "Latn", } m["tba"] = { "Aikanã", 3409307, "qfa-iso", "Latn", } m["tbb"] = { "Tapeba", 12953908, } m["tbc"] = { "Takia", 3514336, "poz-oce", } m["tbd"] = { "Kaki Ae", 6349417, "poz-ocw", "Latn", } m["tbe"] = { "Tanimbili", 3515188, "poz-tem", "Latn", } m["tbf"] = { "Mandara", 3285424, "poz-ocw", "Latn", } m["tbg"] = { "North Tairora", 20210398, "paa-kag", } m["tbh"] = { "Thurawal", 3537135, "aus-yuk", } m["tbi"] = { "Gaam", 35338, "sdv-eje", "Latn", } m["tbj"] = { "Tiang", 3528020, "poz-ocw", "Latn", } m["tbk"] = { "Calamian Tagbanwa", 3915487, "phi-kal", } m["tbl"] = { "Tboli", 7690594, "phi", "Latn", } m["tbm"] = { "Tagbu", 7675188, "nic-ser", } m["tbn"] = { "Barro Negro Tunebo", 12953943, "cba", } m["tbo"] = { "Tawala", 7689206, "poz-ocw", "Latn", } m["tbp"] = { "Taworta", 7689337, "paa-lkp", "Latn", } m["tbr"] = { "Tumtum", 3407029, "qfa-kad", } m["tbs"] = { "Tanguat", 7683166, "paa", "Latn", } m["tbt"] = { "Kitembo", 13123561, "bnt-shh", "Latn", } m["tbu"] = { "Tubar", 56730, "azc-trc", "Latn", } m["tbv"] = { "Tobo", 7811712, "ngf", } m["tbw"] = { "Tagbanwa", 3915475, "phi", "Latn", } m["tbx"] = { "Kapin", 6366665, "poz-ocw", "Latn", } m["tby"] = { "ထေက်ဗရု", 11732670, "paa-nha", "Latn", } m["tbz"] = { "Ditammari", 35186, "nic-eov", } m["tca"] = { "Ticuna", 1815205, "sai-tyu", "Latn", } m["tcb"] = { "Tanacross", 28268, "ath-nor", "Latn", } m["tcc"] = { "Datooga", 35327, "sdv-nis", "Latn", } m["tcd"] = { "Tafi", 36545, "alv-ktg", } m["tce"] = { "Southern Tutchone", 31091048, "ath-nor", "Latn", } m["tcf"] = { "Malinaltepec Tlapanec", 25559732, "omq", "Latn", } m["tcg"] = { "Tamagario", 7680531, "ngf", } m["tch"] = { "Turks and Caicos Creole English", 7855478, "crp", "Latn", ancestors = "en", } m["tci"] = { "Wára", 20825638, "paa-yam", } m["tck"] = { "Tchitchege", 36595, "bnt-tek", } m["tcl"] = { "တာမာန် (ဍုၚ်ဗၟာ)", 15616518, "sit-jnp", "Latn", } m["tcm"] = { "Tanahmerah", 3514927, "ngf", } m["tco"] = { "Taungyo", 12953186, "tbq-brm", ancestors = "obr", } m["tcp"] = { "Tawr Chin", 7689338, "tbq-kuk", } m["tcq"] = { "Kaiy", 6348709, "paa-lkp", } m["tcs"] = { "ခရဳအဝ်လ် ကလိုဟ်ၜဳ တုဝ်ရေက်သ်", 36648, "crp", "Latn", ancestors = "en", } m["tct"] = { "T'en", 3442330, "qfa-kms", } m["tcu"] = { "Southeastern Tarahumara", 36807, "azc-trc", "Latn", } m["tcw"] = { "Tecpatlán Totonac", 7692795, "nai-ttn", "Latn", } m["tcx"] = { "တဝ်ဒါ", 34042, "dra-tkt", "Taml", translit = {Taml = "Taml-translit"}, } m["tcy"] = { "တူဠူ", 34251, "dra-tlk", "Tutg, Mlym, Knda", -- Tigalari is not available. Mlym is nearer than Knda but both lack ɛ/ɛː. translit = { Mlym = "ml-translit", Tutg = "tcy-Tutg-translit", Knda = "kn-translit", }, } m["tcz"] = { "Thado Chin", 6583558, "tbq-kuk", } m["tda"] = { "Tagdal", 36570, "son", } m["tdb"] = { "Panchpargania", 21946879, "inc-eas", "Deva, as-Beng, Orya, Chis", ancestors = "bh", } m["tdc"] = { "Emberá-Tadó", 3052041, "sai-chc", "Latn", } m["tdd"] = { "သေံတာဲခေါၚ်", 36556, "tai-swe", "Tale", translit = "Tale-translit", entry_name = {remove_diacritics = c.ZWNJ .. c.ZWJ}, } m["tde"] = { "Tiranige Diga Dogon", 5313387, "nic-dgw", } m["tdf"] = { "Talieng", 37525108, "mkh-ban", } m["tdg"] = { "တမာန် လ္ပာ်ဖာပလိုတ်", 12953178, "sit-tam", "sit-tam-Tibt, Deva", display_text = {["sit-tam-Tibt"] = s["Tibt-displaytext"]}, entry_name = {["sit-tam-Tibt"] = s["Tibt-entryname"]}, } m["tdh"] = { "Thulung", 56553, "sit-kiw", } m["tdi"] = { "Tomadino", 7818197, "poz-btk", "Latn", } m["tdj"] = { "တာဂျဳယျဝ်", 7676870, "poz", } m["tdk"] = { "Tambas", 3440392, "cdc-wst", } m["tdl"] = { "Sur", 3914453, "nic-tar", } m["tdm"] = { "Taruma", 5559094, } m["tdn"] = { "Tondano", 3531514, "phi", } m["tdo"] = { "Teme", 3913994, "alv-mye", } m["tdq"] = { "Tita", 3914899, "nic-bco", } m["tdr"] = { "Todrah", 7812881, "mkh", } m["tds"] = { "Doutai", 5302331, "paa-lkp", } m["tdt"] = { "Tetun Dili", 12643484, "poz-tim", "Latn", } m["tdu"] = { "Tempasuk Dusun", 3529155, "poz-san", } m["tdv"] = { "Toro", 3438367, "nic-alu", } m["tdy"] = { "Tadyawan", 7674700, "phi", } m["tea"] = { "Temiar", 3914693, "mkh-asl", } m["teb"] = { "Tetete", 7706087, "sai-tuc", "Latn", } m["tec"] = { "Terik", 3518379, "sdv-nma", } m["ted"] = { "Tepo Krumen", 11152243, "kro-grb", } m["tee"] = { "Huehuetla Tepehua", 56455, "nai-ttn", } m["tef"] = { "Teressa", 3518362, "aav-nic", } m["teg"] = { "Teke-Tege", 36478, "bnt-tek", } m["teh"] = { "ထာယ်ဝေပ်သ်", 33930, "sai-cho", "Latn", } m["tei"] = { "Torricelli", 3450788, "qfa-tor", } m["tek"] = { "Ibali Teke", 2802914, "bnt-tek", } m["tem"] = { "Temne", 36613, "alv-mel", } m["ten"] = { "Tama (Colombia)", 3832969, "sai-tuc", "Latn", } m["teo"] = { "Ateso", 29474, "sdv-ttu", "Latn", } m["tep"] = { "Tepecano", 3915525, "azc", "Latn", } m["teq"] = { "Temein", 7698064, "sdv", } m["ter"] = { "Tereno", 3314742, "awd", "Latn", } m["tes"] = { "Tengger", 12473479, "poz", } m["tet"] = { "တေထီု", 34125, "poz-tim", "Latn", } m["teu"] = { "စူ", 3437607, "ssa-klk", } m["tev"] = { "Teor", 12953198, "poz-cma", } m["tew"] = { "Tewa", 56492, "nai-kta", "Latn", } m["tex"] = { "Tennet", 56346, "sdv", } m["tey"] = { "Tulishi", 12911106, "qfa-kad", "Latn", } m["tez"] = { "ထေတ်သေရေတ်", 7706841, "ber", "Latn", } m["tfi"] = { "Tofin Gbe", 3530330, "alv-pph", } m["tfn"] = { "Dena'ina", 27785, "ath-nor", "Latn", } m["tfo"] = { "Tefaro", 7694618, "paa-egb", "Latn", } m["tfr"] = { "တာယ်ရဳဗာယ်", 36533, "cba", } m["tft"] = { "ဒေနာတ်တေ", 3518492, "paa-nha", "Latn, Arab", } m["tga"] = { "Sagalla", 12953082, "bnt-cht", } m["tgb"] = { "Tobilung", 12953913, "poz-san", } m["tgc"] = { "Tigak", 3528276, "poz-ocw", } m["tgd"] = { "Ciwogai", 3438799, "cdc-wst", } m["tge"] = { "ဂေါ်ခါ တာမာန် လ္ပာ်ဖာဗၟံက်", 12953175, "sit-tam", "sit-tam-Tibt, Deva", display_text = {["sit-tam-Tibt"] = s["Tibt-displaytext"]}, entry_name = {["sit-tam-Tibt"] = s["Tibt-entryname"]}, } m["tgf"] = { "ချာလဳ", 3695197, "sit-ebo", "Tibt, Latn", translit = {Tibt = "Tibt-translit"}, override_translit = true, display_text = {Tibt = s["Tibt-displaytext"]}, entry_name = {Tibt = s["Tibt-entryname"]}, sort_key = {Tibt = "Tibt-sortkey"}, } m["tgh"] = { "Tobagonian Creole English", 7811541, "crp", ancestors = "en", } m["tgi"] = { "Lawunuia", 3219937, "poz-ocw", } m["tgn"] = { "Tandaganon", 63311769, "phi", "Latn", } m["tgo"] = { "Sudest", 7675351, "poz-ocw", } m["tgp"] = { "တာန်ဂဝ်အာ", 2410276, "poz-vnn", "Latn", } m["tgq"] = { "Tring", 7842360, "poz-swa", } m["tgr"] = { "Tareng", 25559541, "mkh", } m["tgs"] = { "Nume", 3346290, "poz-vnn", "Latn", } m["tgt"] = { "တဂ်ဗါန်ဝါ ဗဟဵု", 3915515, "phi", "Tagb", } m["tgu"] = { "Tanggu", 7682930, "paa", "Latn", } m["tgv"] = { "Tingui-Boto", 7808195, "sai-mje", "Latn", } m["tgw"] = { "Tagwana Senoufo", 36514, "alv-tdj", } m["tgx"] = { "Tagish", 28064, "ath-nor", "Latn", } m["tgy"] = { "Togoyo", 36825, "nic-ser", } m["thc"] = { "Tai Hang Tong", 7675753, "tai-nor", } m["thd"] = { "Kuuk Thaayorre", 6448718, "aus-pmn", "Latn", } m["the"] = { "Chitwania Tharu", 22083804, "inc-tha", } m["thf"] = { "Thangmi", 7710314, "sit-new", } m["thh"] = { "Northern Tarahumara", 15616395, "azc-trc", "Latn", } m["thi"] = { "Tai Long", 25559562, "tai-swe", } m["thk"] = { "Tharaka", 15407179, "bnt-kka", } m["thl"] = { "Dangaura Tharu", 22083815, "inc-tha", } m["thm"] = { "ကသၚ်", 34780, "mkh-vie", "Thai", --Laoo is feasible but no evidence yet. sort_key = "Thai-sortkey", } m["thn"] = { "Thachanadan", 7708880, "dra-mal", } m["thp"] = { "တိုဝ်mpson", 1755054, "sal", } m["thq"] = { "Kochila Tharu", 22083826, "inc-tha", } m["thr"] = { "Rana Tharu", 12953920, "inc-tha", } m["ths"] = { "Thakali", 7709348, "sit-tam", } m["tht"] = { "Tahltan", 30125, "ath-nor", "Latn", } m["thu"] = { "Thuri", 7799291, "sdv-lon", } m["thy"] = { "Tha", 3915849, "alv-bwj", } m["tic"] = { "Tira", 36677, "alv-hei", } m["tif"] = { "Tifal", 11732691, "ngf-okk", } m["tig"] = { "တဳဂရာန်", 34129, "sem-eth", "Ethi", translit = "Ethi-translit", } m["tih"] = { "Timugon Murut", 7807680, "poz-san", "Latn", } m["tii"] = { "Tiene", 36469, "bnt-tek", } m["tij"] = { "Tilung", 7803037, "sit-kiw", } m["tik"] = { "Tikar", 36483, "nic-bdn", "Latn", } m["til"] = { "Tillamook", 2109432, "sal", } m["tim"] = { "Timbe", 7804599, "ngf", } m["tin"] = { "ထေန်ဒဳ", 36860, "cau-and", "Cyrl", translit = "cau-nec-translit", override_translit = true, display_text = {Cyrl = s["cau-Cyrl-displaytext"]}, entry_name = {Cyrl = s["cau-Cyrl-entryname"]}, } m["tio"] = { "ထဳအာ်", 3518239, "poz-ocw", } m["tip"] = { "Trimuris", 7842270, "paa-tkw", } m["tiq"] = { "Tiéfo", 3914874, "alv-sav", } m["tis"] = { "Masadiit Itneg", 18748769, "phi", } m["tit"] = { "Tinigua", 3029805, } m["tiu"] = { "Adasen", 11214797, "phi", } m["tiv"] = { "Tiv", 34131, "nic-tvc", "Latn", } m["tiw"] = { "Tiwi", 1656014, "qfa-iso", "Latn", } m["tix"] = { "Southern Tiwa", 7570552, "nai-kta", "Latn", } m["tiy"] = { "တဳရူရာန်", 7809425, "phi", "Latn", } m["tiz"] = { "Tai Hongjin", 3915716, "tai-swe", } m["tja"] = { "Tajuasohn", 3915326, "kro-wkr", } m["tjg"] = { "တုန်ဂျွေန်", 3542117, "poz", } m["tji"] = { "ထူစေၚ်ယျာ လ္ပာ်သၟဝ်ကျာ", 12953229, "sit-tja", } m["tjl"] = { "သေံဍာဲ", 7675773, "tai-swe", "Mymr", translit = "tjl-translit", } m["tjm"] = { "Timucua", 638300, "qfa-iso", } m["tjn"] = { "Tonjon", 3913372, "dmn-jje", } m["tjs"] = { "Southern Tujia", 12633994, "sit-tja", "Latn", } m["tju"] = { "Tjurruru", 3913834, "aus-nga", "Latn", } m["tjw"] = { "Chaap Wuurong", 5285187, "aus-pam", "Latn", } m["tka"] = { "Truká", 7847648, } m["tkb"] = { "Buksa", 20983638, "inc-eas", } m["tkd"] = { "တူခူဒေဒေ", 36863, "poz-tim", "Latn", } m["tke"] = { "Takwane", 11030092, "bnt-mak", ancestors = "vmw", } m["tkf"] = { "Tukumanféd", 42330115, "tup-gua", "Latn", } m["tkl"] = { "တဝ်ကဲလော", 34097, "poz-pnp", "Latn", } m["tkm"] = { "Takelma", 56710, } m["tkn"] = { "တဝ်ကူ-နဝ်-ဃှဳမ", 3530484, "jpx-nry", "Jpan", translit = s["jpx-translit"], display_text = s["jpx-displaytext"], entry_name = s["jpx-entryname"], sort_key = s["jpx-sortkey"], } m["tkp"] = { "Tikopia", 36682, "poz-pnp", "Latn", } m["tkq"] = { "Tee", 3075144, "nic-ogo", "Latn", } m["tkr"] = { "သာတ်ခေါန်", 36853, "cau-wsm", "Cyrl, Latn, Arab", display_text = {Cyrl = s["cau-Cyrl-displaytext"]}, entry_name = { Cyrl = s["cau-Cyrl-entryname"], Latn = s["cau-Latn-entryname"], }, } m["tks"] = { "Ramandi", 25261947, "xme-ttc", ancestors = "xme-ttc-sou", } m["tkt"] = { "Kathoriya Tharu", 22083822, "inc-tha", } m["tku"] = { "Upper Necaxa Totonac", 56343, "nai-ttn", "Latn", } m["tkv"] = { "Mur Pano", 16939373, "poz-ocw", "Latn", } m["tkw"] = { "တဳနူ", 3516731, "poz-tem", "Latn", } m["tkx"] = { "Tangko", 7682993, "ngf-okk", } m["tkz"] = { "Takua", 7678544, "mkh", } m["tla"] = { "Southwestern Tepehuan", 3518245, "azc", "Latn", } m["tlb"] = { "တဝ်ဗါယ်ဋ္ဌဝ်", 1142333, "paa-nha", } m["tlc"] = { "Misantla Totonac", 56460, "nai-ttn", "Latn", } m["tld"] = { "Talaud", 7678964, "phi", } m["tlf"] = { "Telefol", 7696150, "ngf-okk", } m["tlg"] = { "Tofanma", 4461493, "paa-pau", } m["tlh"] = { "ခလေန်ဂွါန်", 10134, "art", "Latn", type = "appendix-constructed", } m["tli"] = { "ထလေန်ကေတ်", 27792, "xnd", "Latn, Cyrl", } m["tlj"] = { "Talinga-Bwisi", 7679530, "bnt-haj", } m["tlk"] = { "Taloki", 3514563, "poz-btk", } m["tll"] = { "Tetela", 2613465, "bnt-tet", } m["tlm"] = { "Tolomako", 3130514, "poz-vnn", "Latn", } m["tln"] = { "Talondo'", 7680293, "poz-ssw", } m["tlo"] = { "Talodi", 36525, "alv-tal", } m["tlp"] = { "Filomena Mata-Coahuitlán Totonac", 5449202, "nai-ttn", "Latn", } m["tlq"] = { "Tai Loi", 7675784, "mkh-pal", } m["tlr"] = { "Talise", 3514510, "poz-sls", } m["tls"] = { "Tambotalo", 7681065, "poz-vnn", "Latn", } m["tlt"] = { "Teluti", 12953194, "poz-cma", } m["tlu"] = { "Tulehu", 7852006, "poz-cma", } m["tlv"] = { "တာလဳၜေအ်", 3514498, "poz-cma", "Latn", } m["tlx"] = { "Khehek", 3196124, "poz-aay", } m["tly"] = { "တာလေတ်", 34318, "xme-ttc", "Latn, Cyrl, fa-Arab", } m["tma"] = { "Tama (Chad)", 57001, "sdv-tmn", } m["tmb"] = { "Avava", 2157461, "poz-vnc", "Latn", } m["tmc"] = { "Tumak", 3121045, "cdc-est", } m["tmd"] = { "Haruai", 12632146, "ngf-mad", } m["tme"] = { "Tremembé", 5246937, } m["tmf"] = { "Toba-Maskoy", 3033544, "sai-mas", "Latn", } m["tmg"] = { "ဒေနာတ်တေño", 7232597, } m["tmh"] = { "ထူအာ်ရေတ်", 34065, "ber", "Latn, Tfng, Arab", entry_name = {remove_diacritics = c.grave .. c.acute .. c.circ}, } m["tmi"] = { "Tutuba", 7857052, "poz-vnn", "Latn", } m["tmj"] = { "Samarokena", 7408865, "paa-tkw", } m["tmk"] = { "တမာန် လ္ပာ်ဖာဒိုဟ်ပလိုတ်သၟဝ်ကျာ", 15616509, "sit-tam", "sit-tam-Tibt, Deva", display_text = {["sit-tam-Tibt"] = s["Tibt-displaytext"]}, entry_name = {["sit-tam-Tibt"] = s["Tibt-entryname"]}, } m["tml"] = { "Tamnim Citak", 12643315, "ngf", } m["tmm"] = { "Tai Thanh", 7675842, "tai-swe", } m["tmn"] = { "တာမာန် (အိန်ဒဝ်နဳယျာ)", 7680671, "poz", "Latn", } m["tmo"] = { "Temoq", 7698205, "mkh-asl", } m["tmq"] = { "Tumleo", 7852641, "poz-ocw", } m["tms"] = { "Tima", 36684, "nic-ktl", } m["tmt"] = { "Tasmate", 7687571, "poz-vnn", "Latn", } m["tmu"] = { "Iau", 56867, "paa-lkp", } m["tmv"] = { "Motembo", 11013108, "bnt-bun", } m["tmy"] = { "Tami", 3514812, "poz-oce", } m["tmz"] = { "Tamanaku", 3441435, "sai-ven", "Latn", } m["tna"] = { "Tacana", 3182551, "sai-tac", "Latn", } m["tnb"] = { "Western Tunebo", 3181238, "cba", } m["tnc"] = { "Tanimuca-Retuarã", 36535, "sai-tuc", "Latn", } m["tnd"] = { "Angosturas Tunebo", 25559604, "cba", } m["tne"] = { "Tinoc Kallahan", 3192219, } m["tng"] = { "Tobanga", 3440501, "cdc-est", } m["tnh"] = { "Maiani", 6735243, "ngf-mad", "Latn", } m["tni"] = { "Tandia", 7682454, "poz-hce", "Latn", } m["tnk"] = { "Kwamera", 3200806, "poz-vns", "Latn", } m["tnl"] = { "Lenakel", 3229429, "poz-vns", "Latn", } m["tnm"] = { "Tabla", 7673105, "paa-sen", } m["tnn"] = { "North Tanna", 957945, "poz-vns", "Latn", } m["tno"] = { "Toromono", 510544, "sai-tac", "Latn", } m["tnp"] = { "Whitesands", 3063761, "poz-vns", "Latn", } m["tnq"] = { "Taíno", 5232952, "awd-taa", "Latn", } m["tnr"] = { "Bedik", 35096, "alv-ten", } m["tns"] = { "Tenis", 7699870, "poz-stm", "Latn", } m["tnt"] = { "Tontemboan", 3531666, "phi", "Latn", } m["tnu"] = { "Tay Khang", 6362363, "tai", } m["tnv"] = { "Tanchangya", 7682361, "inc-bas", "Cakm", ancestors = "inc-obn", } m["tnw"] = { "Tonsawang", 3531660, "phi", } m["tnx"] = { "Tanema", 2106984, "poz-tem", "Latn", } m["tny"] = { "Tongwe", 7821200, "bnt", } m["tnz"] = { "Ten'edn", 3073453, "mkh-asl", "Latn", } m["tob"] = { "Toba", 3113756, "sai-guc", "Latn", } m["toc"] = { "Coyutla Totonac", 15615591, "nai-ttn", "Latn", } m["tod"] = { "Toma", 11055484, "dmn-msw", "Latn, Loma" } m["tof"] = { "Gizrra", 5565941, } m["tog"] = { "Tonga (Malawi)", 3847648, "bnt-nys", "Latn", } m["toh"] = { "Tonga (Mozambique)", 7820988, "bnt-bso", } m["toi"] = { "Tonga (Zambia)", 34101, "bnt-bot", } m["toj"] = { "Tojolabal", 36762, "myn", } m["tok"] = { "တဝ်ကဳ ပဝ်နာ", 36846, "art", "Latn", type = "appendix-constructed", } m["tol"] = { "Tolowa", 20827, "ath-pco", "Latn", } m["tom"] = { "Tombulu", 3531199, "phi", } m["too"] = { "Xicotepec de Juárez Totonac", 8044353, "nai-ttn", "Latn", } m["top"] = { "Papantla Totonac", 56329, "nai-ttn", "Latn", } m["toq"] = { "Toposa", 3033588, "sdv-ttu", } m["tor"] = { "Togbo-Vara Banda", 11002922, "bad-cnt", } m["tos"] = { "Highland Totonac", 13154149, "nai-ttn", "Latn", } m["tou"] = { "တိုဝ်", 22694631, "mkh-vie", } m["tov"] = { "Upper Taromi", 12953183, "xme-ttc", ancestors = "xme-ttc-cen", } m["tow"] = { "Jemez", 3912876, "nai-kta", "Latn", } m["tox"] = { "Tobian", 34022, "poz-mic", } m["toy"] = { "Topoiyo", 7824977, "poz-kal", } m["toz"] = { "To", 7811216, "alv-mbm", } m["tpa"] = { "Taupota", 7688832, "poz-ocw", } m["tpc"] = { "Azoyú Me'phaa", 25559730, "omq", } m["tpe"] = { "Tippera", 16115423, "tbq-bdg", } m["tpf"] = { "Tarpia", 12953185, "poz-ocw", } m["tpg"] = { "Kula", 6442714, "qfa-tap", } m["tpi"] = { "တေဝ်ဖါဲသေၚ်", 34159, "crp", "Latn", ancestors = "en", } m["tpj"] = { "Tapieté", 3121063, } m["tpk"] = { "Tupinikin", 33924, "tup-gua", } m["tpl"] = { "Tlacoapa Me'phaa", 16115511, "omq", } m["tpm"] = { "Tampulma", 36590, "nic-gnw", } m["tpn"] = { "Tupinambá", 31528147, "tup-gua", "Latn", } m["tpo"] = { "Tai Pao", 7675795, "tai-nor", } m["tpp"] = { "Pisaflores Tepehua", 56349, "nai-ttn", } m["tpq"] = { "Tukpa", 12953230, "sit-las", } m["tpr"] = { "Tuparí", 3542217, "tup", "Latn", } m["tpt"] = { "Tlachichilco Tepehua", 56330, "nai-ttn", } m["tpu"] = { "Tampuan", 3514882, "mkh-ban", "Khmr", } m["tpv"] = { "Tanapag", 3397371, "poz-mic", } m["tpw"] = { "တူပဳတြေံ", 56944, "tup-gua", "Latn", } m["tpx"] = { "Acatepec Me'phaa", 31157882, "omq", "Latn", } m["tpy"] = { "Trumai", 12294279, "qfa-iso", } m["tpz"] = { "Tinputz", 3529205, "poz-ocw", } m["tqb"] = { "ထာန်ဗေန်", 10322157, "tup-gua", "Latn", } m["tql"] = { "Lehali", 3229119, "poz-vnn", "Latn", } m["tqm"] = { "Turumsa", 7856508, "paa", } m["tqn"] = { "Tenino", 15699255, "nai-shp", "Latn", ancestors = "nai-spt", } m["tqo"] = { "Toaripi", 7811403, "ngf", } m["tqp"] = { "Tomoip", 3531388, "poz-ocw", } m["tqq"] = { "Tunni", 3514343, "cus-som", } m["tqr"] = { "Torona", 36679, "alv-tal", } m["tqt"] = { "Western Totonac", 7116691, "nai-ttn", "Latn", } m["tqu"] = { "Touo", 56750, } m["tqw"] = { "ထံၚ်ခါဝါ", 2454881, "qfa-iso", } m["tra"] = { "တဳရာဟဳ", 3812406, "inc-koh", } m["trb"] = { "Terebu", 7701797, "poz-ocw", } m["trc"] = { "Copala Triqui", 12953935, "omq-tri", "Latn", } m["trd"] = { "Turi", 7854914, "mun", } m["tre"] = { "East Tarangan", 18609750, "poz", } m["trf"] = { "Trinidadian Creole English", 7842493, "crp", ancestors = "en", } m["trg"] = { "Lishán Didán", 56473, "sem-nna", } m["trh"] = { "Turaka", 12953237, "ngf", } m["tri"] = { "ထရဳအဝ်", 56885, "sai-tar", "Latn", } m["trj"] = { "Toram", 3441225, "cdc-est", } m["trl"] = { "Traveller Scottish", 3915671, "qfa-mix", "Latn", ancestors = "rom, sco", } m["trm"] = { "ထရေဂါမဳ", 34081, "nur-sou", } m["trn"] = { "Trinitario", 3539279, "awd", } m["tro"] = { "Tarao", 3515603, "tbq-kuk", "Latn", } m["trp"] = { "Kokborok", 35947, "tbq-bdg", } m["trq"] = { "San Martín Itunyoso Triqui", 12953934, "omq-tri", "Latn", } m["trr"] = { "Taushiro", 1957508, } m["trs"] = { "Chicahuaxtla Triqui", 3539587, "omq-tri", "Latn", } m["trt"] = { "Tunggare", 615071, "paa-egb", "Latn", } m["tru"] = { "တဝ်ရဝ်ယဝ်", 34040, "sem-cna", "Syrc, Latn", entry_name = "Syrc-entryname", translit = "tru-translit", } m["trv"] = { "တာရုဝ်ကိုအ်", 716686, "map-ata", "Latn", } m["trw"] = { "တောဝ်ဝါလဳ", 2665246, "inc-koh", "ur-Arab", } m["trx"] = { "Tringgus", 7842365, "day", } m["try"] = { "Turung", 7856514, "tai-swe", "as-Beng", } m["trz"] = { "Torá", 7827518, "sai-cpc", } m["tsa"] = { "Tsaangi", 36675, "bnt-nze", } m["tsb"] = { "Tsamai", 2371358, "cus-eas", } m["tsc"] = { "Tswa", 2085051, "bnt-tsr", } m["tsd"] = { "သေပ်ခါဝ်နဳယာန်", 220607, "grk", "Grek", ancestors = "grc-dor", translit = "el-translit", entry_name = {remove_diacritics = c.caron .. c.diaerbelow .. c.brevebelow}, sort_key = s["Grek-sortkey"], } m["tse"] = { "Tunisian Sign Language", 7853191, "sgn", } m["tsf"] = { "Southwestern Tamang", 12953176, "sit-tam", } m["tsg"] = { "ထာဴသု", 34142, "phi", "Latn, Arab", } m["tsh"] = { "Tsuvan", 3502326, "cdc-cbm", } m["tsi"] = { "Tsimshian", 20085721, "nai-tsi", } m["tsj"] = { "ချာန်လာ", 36840, "sit-tsk", "Tibt, Latn, Deva", translit = {Tibt = "Tibt-translit"}, override_translit = true, display_text = {Tibt = s["Tibt-displaytext"]}, entry_name = {Tibt = s["Tibt-entryname"]}, sort_key = {Tibt = "Tibt-sortkey"}, } m["tsl"] = { "Ts'ün-Lao", 3446675, "tai", } m["tsm"] = { "Turkish Sign Language", 36885, "sgn", } m["tsp"] = { "Northern Toussian", 11155635, "alv-sav", } m["tsq"] = { "Thai Sign Language", 7709156, "sgn", "Sgnw", } m["tsr"] = { "Akei", 2828964, "poz-vnn", "Latn", } m["tss"] = { "Taiwan Sign Language", 34019, "sgn-jsl", } m["tsu"] = { "တသျော", 716681, "map", "Latn", } m["tsv"] = { "Tsogo", 36674, "bnt-tso", } m["tsw"] = { "Tsishingini", 13123571, "nic-kam", } m["tsx"] = { "Mubami", 6930815, "ngf", } m["tsy"] = { "Tebul Sign Language", 7692090, "sgn", } m["tta"] = { "Tutelo", 2311602, "sio-ohv", } m["ttb"] = { "Gaa", 3438361, "nic-dak", } m["ttc"] = { "Tektiteko", 36686, "myn", } m["ttd"] = { "Tauade", 7688634, } m["tte"] = { "Bwanabwana", 5003667, "poz-ocw", "Latn", } m["ttf"] = { "Tuotomb", 7853459, "nic-mbw", "Latn", } m["ttg"] = { "Tutong", 3507990, "poz-swa", "Latn", } m["tth"] = { "Upper Ta'oih", 3512660, "mkh-kat", } m["tti"] = { "Tobati", 7811556, "poz-ocw", "Latn", } m["ttj"] = { "တိုဝ်ရုဝ်", 7824218, "bnt-nyg", "Latn", } m["ttk"] = { "Totoro", 3532756, "sai-bar", "Latn", } m["ttl"] = { "Totela", 10962316, "bnt-bot", "Latn", } m["ttm"] = { "Northern Tutchone", 20822, "ath-nor", "Latn", } m["ttn"] = { "Towei", 7829606, "paa-pau", } m["tto"] = { "Lower Ta'oih", 25559539, "mkh-kat", } m["ttp"] = { "Tombelala", 6799663, "poz-kal", } m["ttr"] = { "Tera", 56267, "cdc-cbm", } m["tts"] = { "ဣသၚ်", 33417, "tai-swe", "Thai", sort_key = "Thai-sortkey", } m["ttt"] = { "ထေပ်", 56489, "ira-swi", "Cyrl, Latn, Armn, fa-Arab", ancestors = "fa", } m["ttu"] = { "Torau", 3532208, "poz-ocw", } m["ttv"] = { "Titan", 3445811, "poz-aay", } m["ttw"] = { "Long Wat", 7856961, "poz-swa", } m["tty"] = { "Sikaritai", 7513600, "paa-lkp", } m["ttz"] = { "Tsum", 12953223, "sit-kyk", } m["tua"] = { "Wiarumus", 7998045, "qfa-tor", "Latn", } m["tub"] = { "ထူဗါတူလာဗါန်", 56704, "azc", "Latn", } m["tuc"] = { "Mutu", 3331003, "poz-ocw", "Latn", } m["tud"] = { "Tuxá", 7857217, } m["tue"] = { "Tuyuca", 2520538, "sai-tuc", "Latn", } m["tuf"] = { "Central Tunebo", 12953942, "cba", } m["tug"] = { "Tunia", 863721, "alv-bua", } m["tuh"] = { "Taulil", 3516141, "paa-bng", } m["tui"] = { "Tupuri", 36646, "alv-mbm", "Latn", } m["tuj"] = { "Tugutil", 12953228, "paa-nha" } m["tul"] = { "Tula", 3914907, "alv-wjk", } m["tum"] = { "Tumbuka", 34138, "bnt-nys", "Latn", } m["tun"] = { "Tunica", 56619, "qfa-iso", "Latn", } m["tuo"] = { "တူကာနဝ်", 3541834, "sai-tuc", "Latn", } m["tuq"] = { "Tedaga", 36639, "ssa-sah", } m["tus"] = { "Tuscarora", 36944, "iro-nor", "Latn", } m["tuu"] = { "Tututni", 20627, "ath-pco", "Latn", } m["tuv"] = { "Turkana", 36958, "sdv-ttu", "Latn", } m["tux"] = { "Tuxináwa", 7857204, "sai-pan", "Latn", } m["tuy"] = { "Tugen", 3541935, "sdv-nma", } m["tuz"] = { "Turka", 36643, "nic-gur", "Latn", } m["tva"] = { "Vaghua", 3553248, "poz-ocw", "Latn", } m["tvd"] = { "Tsuvadi", 3914936, "nic-kam", } m["tve"] = { "Te'un", 7690709, "poz-cet", "Latn", } m["tvk"] = { "Southeast Ambrym", 252411, "poz-vnc", "Latn", } m["tvl"] = { "တူဝါဠူအာန်", 34055, "poz-pnp", "Latn", } m["tvm"] = { "Tela-Masbuar", 7695666, "poz-tim", } m["tvn"] = { "ဟဝါဲ", 7689158, "tbq-brm", "Mymr", ancestors = "obr", } m["tvo"] = { "ထဳဒါဝ်ရေ", 3528199, "paa-nha", "Latn, Arab", } m["tvs"] = { "Taveta", 15632387, "bnt-par", "Latn", } m["tvt"] = { "Tutsa Naga", 7856987, "sit-tno", } m["tvu"] = { "Tunen", 36632, "nic-mbw", } m["tvw"] = { "Sedoa", 7445362, "poz-kal", } m["tvx"] = { "ထိုၚ်ဝဲအာန်", 1975271, "map", "Latn", } m["tvy"] = { "Timor Pidgin", 4904029, "crp", ancestors = "pt", } m["twa"] = { "Twana", 7857412, "sal", } m["twb"] = { "Western Tawbuid", 12953912, "phi", } m["twc"] = { "Teshenawa", 3436597, "phi", } m["twe"] = { "Teiwa", 3519302, "ngf", "Latn", } m["twf"] = { "ထောဴ", 7684320, "nai-kta", "Latn", } m["twg"] = { "Tereweng", 12953200, "qfa-tap", } m["twh"] = { "သေံခဴ", 7675751, "tai-swe", "Tavt", translit = "Tavt-translit", sort_key = { from = {"[꪿ꫀ꫁ꫂ]", "([ꪵꪶꪹꪻꪼ])([ꪀ-ꪯ])"}, to = {"", "%2%1"} }, } m["twm"] = { "တဝါန် မန်ပါ", 36586, "sit-ebo", "Tibt", translit = "Tibt-translit", override_translit = true, display_text = s["Tibt-displaytext"], entry_name = s["Tibt-entryname"], sort_key = "Tibt-sortkey", } m["twn"] = { "Twendi", 7857682, "nic-mmb", } m["two"] = { "Tswapong", 3446241, "bnt-sts", } m["twp"] = { "Ere", 3056045, "poz-aay", "Latn", } m["twq"] = { "Tasawaq", 36564, "son", } m["twr"] = { "Southwestern Tarahumara", 12953909, "azc-trc", "Latn", } m["twt"] = { "Turiwára", 3542307, "tup-gua", "Latn", } m["twu"] = { "Termanu", 7702572, "poz-tim", } m["tww"] = { "Tuwari", 7857159, "paa-spk", } m["twy"] = { "တာဝဝ်ယျာန်", 3513542, "poz-bre", } m["txa"] = { "Tombonuo", 7818692, "poz-san", } m["txb"] = { "တဝ်ချာရေဝ်ယာန် ဗဳ", 3199353, "ine-toc", "Latn", wikipedia_article = "Tocharian languages", -- wikidata id has no associated article standardChars = "AaÄäĀāCcEeIiKkLlMmṂṃNnṄṅÑñOoPpRrSsŚśṢṣTtUuWwYy" .. c.punc, } m["txc"] = { "Tsetsaut", 20829, "ath-nor", "Latn", } m["txe"] = { "Totoli", 7828387, "poz-tot", "Latn", } m["txg"] = { "တာန်ဂူ", 2727930, "sit-qia", "Tang", translit = "txg-translit", } m["txj"] = { "Tarjumo", 24906088, "ssa-sah", "Latn, Arab", } m["txh"] = { "တရသဳယာန်", 36793, "ine", "Latn, Grek", translit = "el-translit", } m["txi"] = { "ဣကာပ်ပါပ်", 9344891, "sai-pek", "Latn", } m["txm"] = { "Tomini", 7818911, "poz", } m["txn"] = { "West Tarangan", 3515594, "poz", } m["txo"] = { "တဝ်တဝ်", 36709, "sit-dhi", "Beng, Toto" } m["txq"] = { "Tii", 7801784, "poz-tim", } m["txr"] = { "Tartessian", 36795, } m["txs"] = { "Tonsea", 3531659, "phi", } m["txt"] = { "Citak", 3447279, "ngf", } m["txu"] = { "Kayapó", 3101212, "sai-nje", "Latn", } m["txx"] = { "Tatana", 18643518, "poz-san", } m["tya"] = { "Tauya", 7688978, "ngf-mad", } m["tye"] = { "Kyenga", 3913304, "dmn-bbu", "Latn", } m["tyh"] = { "O'du", 3347428, "mkh", } m["tyi"] = { "Teke-Tsaayi", 33123613, "bnt-nze", } m["tyj"] = { "Tai Do", 7675746, "tai-nor", "Thai, Latn, Tayo", -- Vietnamese alphabet } m["tyl"] = { "Thu Lao", 12953921, "tai-cen", } m["tyn"] = { "Kombai", 6428241, "ngf", } m["typ"] = { "Kuku-Thaypan", 3915693, "aus-pmn", "Latn", } m["tyr"] = { "Tai Daeng", 3915207, "tai-swe", "Tavt", } m["tys"] = { "Sapa", 3446668, "tai-sap", "Latn", } m["tyt"] = { "Tày Tac", 7862029, "tai-swe", } m["tyu"] = { "Kua", 3832933, "khi-kal", } m["tyv"] = { "တူဗါန်", 34119, "trk-ssb", "Cyrl", translit = "tyv-translit", override_translit = true, sort_key = "tyv-sortkey", } m["tyx"] = { "ထေကာအ်-ထျာၚ်", 36634, "bnt-nze", } m["tyz"] = { "ထာၚ်", -- This does not mean its umbrella "Tai" languages. 2511476, "tai-tay", "Latn, Hani", sort_key = {Hani = "Hani-sortkey"}, } m["tza"] = { "Tanzanian Sign Language", 7684177, "sgn", } m["tzh"] = { "တာယ်ဇြာယ်လ်တဴလ်", 36808, "myn", "Latn", } m["tzj"] = { "Tz'utujil", 36941, "myn", "Latn", } m["tzl"] = { "Talossan", 1063911, "art", "Latn", type = "appendix-constructed", sort_key = "tzl-sortkey", } m["tzm"] = { "အာက်လေတ် ထာမာသေတ် ဗဟဵု", 49741, "ber", "Tfng, Arab, Latn", translit = "Tfng-translit", } m["tzn"] = { "Tugun", 12953225, "poz-tim", } m["tzo"] = { "ဇြတ်ဇြဳလ်", 36809, "myn", "Latn", } m["tzx"] = { "Tabriak", 56872, "paa-lsp", "Latn", } return require("Module:languages").finalizeData(m, "language") 4okpaonz1dff8wad576zmycbwbspt0x မဝ်ဂျူ:languages/data/3/b 828 699 402091 402086 2026-09-27T15:36:49Z Intobesa.bot 1035 Bot: ပွမကၠာဲစုတ်ယၟုနူဘာသာအၚ်္ဂလိက် 402091 Scribunto text/plain local m_langdata = require("Module:languages/data") -- Loaded on demand, as it may not be needed (depending on the data). local function u(...) u = require("Module:string utilities").char return u(...) end local c = m_langdata.chars local p = m_langdata.puaChars local s = m_langdata.shared local m = {} m["baa"] = { "ဗါဗါတာနာ", 2877785, "poz-ocw", "Latn", } m["bab"] = { "Bainouk-Gunyuño", 35508, "alv-bny", "Latn", } m["bac"] = { "Badui", 3449885, "poz-msa", "Latn", } m["bae"] = { "Baré", 3504087, "awd", "Latn", } m["baf"] = { "Nubaca", 36270, "nic-ymb", "Latn", } m["bag"] = { "Tuki", 36621, "nic-mba", "Latn", } m["bah"] = { "Bahamian Creole", 2669229, "crp", "Latn", ancestors = "en", } m["baj"] = { "Barakai", 3502030, "poz-cet", "Latn", } m["bal"] = { "ဗဠူချဳ", 33049, "ira-nwi", "fa-Arab", } m["ban"] = { "ပါလဳနဳ", 33070, "poz-mcm", "Latn, Bali", } m["bao"] = { "Waimaha", 2883738, "sai-tuc", "Latn", } m["bap"] = { "Bantawa", 56500, "sit-kic", "Krai, Deva", } m["bar"] = { "ဗာဝါရဳယာန်", 29540, "gmw-hgm", "Latn", ancestors = "gmh", } m["bas"] = { "Basaa", 33093, "bnt-bsa", "Latn", } m["bau"] = { "Badanchi", 11001650, "nic-jrw", "Latn", } m["bav"] = { "Babungo", 34885, "nic-rnn", "Latn", } m["baw"] = { "Bambili-Bambui", 34880, "nic-nge", "Latn", } m["bax"] = { "ဗါမာတ်", 35280, "nic-nun", "Latn, Bamu", } m["bay"] = { "Batuley", 8828787, "poz", "Latn", } m["bba"] = { "Baatonum", 34889, "alv-sav", "Latn", } m["bbb"] = { "Barai", 4858206, "ngf", "Latn", } m["bbc"] = { "တဝ်ဗါ ဗါတာတ်", 33017, "btk", "Latn, Batk", } m["bbd"] = { "Bau", 4873415, "ngf-mad", "Latn", } m["bbe"] = { "Bangba", 34895, "nic-nke", "Latn", } m["bbf"] = { "Baibai", 56902, "paa", "Latn", } m["bbg"] = { "Barama", 34884, "bnt-sir", "Latn", } m["bbh"] = { "Bugan", 3033554, "mkh-pkn", "Latn", } m["bbi"] = { "Barombi", 34985, "bnt-bsa", "Latn", } m["bbj"] = { "ဂါဝ်မာဠာ", 35271, "bai", "Latn", } m["bbk"] = { "Babanki", 34790, "nic-rnc", "Latn", } m["bbl"] = { "ဗီတ်", 33259, "cau-nkh", "Geor", translit = "Geor-translit", override_translit = true, entry_name = { remove_diacritics = c.tilde .. c.macron .. c.breve, from = {"<sup>ნ</sup>"}, to = {"ნ"} }, } m["bbm"] = { -- name includes prefix "Babango", 34819, "bnt-bta", "Latn", } m["bbn"] = { "အာန်နဳပါန်", 7884126, "poz-ocw", "Latn", } m["bbo"] = { "Konabéré", 35371, "dmn-snb", "Latn", } m["bbp"] = { "West Central Banda", 7984377, "bad", "Latn", } m["bbq"] = { "Bamali", 34901, "nic-nun", "Latn", } m["bbr"] = { "ဂဳရာဝါ", 5564185, "ngf-mad", "Latn", } m["bbs"] = { "Bakpinka", 3515061, "nic-ucr", "Latn", } m["bbt"] = { "Mburku", 3441324, "cdc-wst", "Latn", } m["bbu"] = { "Bakulung", 35580, "nic-jrn", "Latn", } m["bbv"] = { "Karnai", 6372803, "poz-ocw", "Latn", } m["bbw"] = { "Baba", 34822, "nic-nun", "Latn", } m["bbx"] = { -- cf bvb "Bubia", 34953, "nic-bds", "Latn", ancestors = "bvb", } m["bby"] = { "Befang", 34960, "nic-bds", "Latn", } m["bca"] = { "ဗါဲ ဗဟဵု", 12628803, "sit-bai", "Hani, Latn", sort_key = {Hani = "Hani-sortkey"}, } m["bcb"] = { "Bainouk-Samik", 36390, "alv-bny", "Latn", } m["bcd"] = { "North Babar", 7054041, "poz-tim", "Latn", } m["bce"] = { "Bamenyam", 34968, "nic-nun", "Latn", } m["bcf"] = { "Bamu", 3503788, "paa-kiw", "Latn", } m["bcg"] = { "Baga Pokur", 31172660, "alv-nal", "Latn", } m["bch"] = { "Bariai", 2884502, "poz-ocw", "Latn", } m["bci"] = { "Baoule", 35107, "alv-ctn", "Latn", } m["bcj"] = { "ဗာဒဳ", 3913852, "aus-nyu", "Latn", } m["bck"] = { "Bunaba", 580923, "aus-bub", "Latn", } m["bcl"] = { "ၜေဲလ်ဂဝ်လဝ်အဒေါဝ်", 33284, "phi", "Latn, Tglg", translit = { Tglg = "bcl-translit", }, override_translit = true, entry_name = { Latn = { remove_diacritics = c.grave .. c.acute .. c.circ, } }, sort_key = { Latn = "tl-sortkey", }, standardChars = { Latn = "AaBbKkDdEeGgHhIiLlMmNnOoPpRrSsTtUuWwYy" .. c.punc, }, } m["bcm"] = { "Banoni", 2882857, "poz-ocw", "Latn", } m["bcn"] = { "Bibaali", 34892, "alv-mye", "Latn", } m["bco"] = { "Kaluli", 6354586, "ngf", "Latn", } m["bcp"] = { "Bali", 3515074, "bnt-kbi", "Latn", } m["bcq"] = { "Bench", 35108, "omv", "Latn", } m["bcr"] = { "Babine-Witsuwit'en", 27864, "ath-nor", "Latn", } m["bcs"] = { "Kohumono", 35590, "nic-ucn", "Latn", } m["bct"] = { "Bendi", 8836662, "csu-mle", "Latn", } m["bcu"] = { "Biliau", 2874658, "poz-ocw", "Latn", } m["bcv"] = { "Shoo-Minda-Nye", 36548, "nic-jkn", "Latn", } m["bcw"] = { "Bana", 56272, "cdc-cbm", "Latn", } m["bcy"] = { "Bacama", 56274, "cdc-cbm", "Latn", } m["bcz"] = { "Bainouk-Gunyaamolo", 35506, "alv-bny", "Latn", } m["bda"] = { "Bayot", 35019, "alv-jol", "Latn", } m["bdb"] = { "ဗေသိပ်", 3504208, "poz-bnn", "Latn", } m["bdc"] = { "Emberá-Baudó", 11173166, "sai-chc", "Latn", } m["bdd"] = { "Bunama", 4997416, "poz-ocw", "Latn", } m["bde"] = { "Bade", 56239, "cdc-wst", "Latn", } m["bdf"] = { "Biage", 48037487, "ngf", "Latn", } m["bdg"] = { "Bonggi", 2910053, "poz-bnn", "Latn", } m["bdh"] = { "Tara Baka", 2880165, "csu-bbk", "Latn", } m["bdi"] = { "Burun", 35040, "sdv-niw", "Latn", } m["bdj"] = { "Bai", 34894, "nic-ser", "Latn", } m["bdk"] = { "Budukh", 35397, "cau-ssm", "Cyrl", translit = "cau-nec-translit", override_translit = true, display_text = {Cyrl = s["cau-Cyrl-displaytext"]}, entry_name = {Cyrl = s["cau-Cyrl-entryname"]}, } m["bdl"] = { "Indonesian Bajau", 2880038, "poz", "Latn", } m["bdm"] = { "Buduma", 56287, "cdc-cbm", "Latn", } m["bdn"] = { "Baldemu", 56280, "cdc-cbm", "Latn", } m["bdo"] = { "Morom", 759770, "csu-bgr", "Latn", } m["bdp"] = { "Bende", 8836490, "bnt", "Latn", } m["bdq"] = { "ဗာနာ", 32924, "mkh-ban", "Latn", } m["bdr"] = { "ဗာဂျဴ လ္ပာ်သၚ်ပလိုတ်", 2880037, "poz-sbj", "Latn", } m["bds"] = { "Burunge", 56617, "cus-sou", "Latn", } m["bdt"] = { "Bokoto", 4938812, "gba-wes", "Latn", } m["bdu"] = { "Oroko", 36278, "bnt-saw", "Latn", } m["bdv"] = { "Bodo Parja", 8845881, "inc-eas", "Orya", } m["bdw"] = { "Baham", 3513309, "paa", "Latn", } m["bdx"] = { "Budong-Budong", 4985158, "poz-ssw", "Latn", } m["bdy"] = { "Bandjalang", 2980386, "aus-pam", "Latn", } m["bdz"] = { "Badeshi", 33028, "iir", } m["bea"] = { "Beaver", 20826, "ath-nor", "Latn", } m["beb"] = { "Bebele", 34976, "bnt-btb", "Latn", } m["bec"] = { "Iceve-Maci", 35449, "nic-tvc", "Latn", } m["bed"] = { "Bedoanas", 4879330, "poz-hce", "Latn", } m["bee"] = { "Byangsi", 56904, "sit-alm", "Deva", } m["bef"] = { "Benabena", 2895638, "paa-kag", "Latn", } m["beg"] = { "ဗလေဝ်", 2894198, "poz-swa", "Latn", } m["beh"] = { "Biali", 34961, "nic-eov", "Latn", } m["bei"] = { "Bekati'", 3441683, "day", "Latn", } m["bej"] = { "ဗဳဂျာ", 33025, "cus", "Arab, Latn", } m["bek"] = { "ဗေဗေလဳ", 4878430, "poz-ocw", "Latn", } m["bem"] = { "Bemba", 33052, "bnt-sbi", "Latn", } m["beo"] = { "Beami", 3504079, "paa", "Latn", } m["bep"] = { "Besoa", 8840465, "poz-kal", "Latn", } m["beq"] = { "Beembe", 3196320, "bnt-kng", "Latn", } m["bes"] = { "Besme", 289832, "alv-kim", "Latn", } m["bet"] = { "Guiberoua Bété", 11019185, "kro-bet", "Latn", } m["beu"] = { "ဗလာဂါ", 4923846, "ngf", "Latn", } m["bev"] = { "Daloa Bété", 11155819, "kro-bet", "Latn", } m["bew"] = { "ဗဳတာဝဳ", 33014, "crp", "Latn", ancestors = "ms", } m["bex"] = { "Jur Modo", 56682, "csu-bbk", "Latn", } m["bey"] = { "Akuwagel", 3504170, "qfa-tor", "Latn", } m["bez"] = { "Kibena", 2502949, "bnt-bki", "Latn", } m["bfa"] = { "Bari", 35042, "sdv-bri", "Latn", } m["bfb"] = { "Pauri Bareli", 7155462, "inc-bhi", "Deva", } m["bfc"] = { "ပါန်ယျဳ ဗါဲ", 12642165, "sit-nba", "Hani, Latn", sort_key = {Hani = "Hani-sortkey"}, } m["bfd"] = { "Bafut", 34888, "nic-nge", "Latn", } m["bfe"] = { "Betaf", 4897329, "paa-tkw", "Latn", } m["bff"] = { "Bofi", 34914, "gba-eas", "Latn", } m["bfg"] = { "Busang Kayan", 9231909, "poz", "Latn", } m["bfh"] = { "Blafe", 12628007, "paa", "Latn", } m["bfi"] = { "British Sign Language", 33000, "sgn", "Latn", -- when documented } m["bfj"] = { "Bafanji", 34890, "nic-nun", "Latn", } m["bfk"] = { "Ban Khor Sign Language", 3441103, "sgn", } m["bfl"] = { "Banda-Ndélé", 34850, "bad-cnt", "Latn", } m["bfm"] = { "Mmen", 36132, "nic-rnc", "Latn", } m["bfn"] = { "ဗူနာတ်", 35101, "ngf", "Latn", } m["bfo"] = { "Malba Birifor", 11150710, "nic-mre", "Latn", } m["bfp"] = { "Beba", 35050, "nic-nge", "Latn", } m["bfq"] = { "ဗဒါဂါ", 33205, "dra-kan", "Taml, Knda, Mlym", translit = { --Taml = "Taml-translit", Knda = "kn-translit", Mlym = "ml-translit", }, } m["bfr"] = { "Bazigar", 8829558, "inc", } m["bfs"] = { "ဗါဲလ္ပာ်ဒိုဟ်သမၠုၚ်ကျာ", 12952250, "sit-bai", "Hani, Latn", sort_key = {Hani = "Hani-sortkey"}, } m["bft"] = { "ဗဝ်လ်တဳ", 33086, "sit-lab", "fa-Arab, Deva, Tibt", translit = { Tibt = "Tibt-translit", }, override_translit = "Tibt", display_text = {Tibt = s["Tibt-displaytext"]}, entry_name = { ["fa-Arab"] = { from = {"هٔ", "ٱ"}, to = {"ه", "ا"}, remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.kashida .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.superalef, }, Tibt = s["Tibt-entryname"] }, sort_key = {Tibt = "Tibt-sortkey"}, } m["bfu"] = { "ဂါဟရဳ", 5516952, "sit-whm", "Takr, Tibt", translit = {Tibt = "Tibt-translit"}, override_translit = true, display_text = {Tibt = s["Tibt-displaytext"]}, entry_name = {Tibt = s["Tibt-entryname"]}, sort_key = {Tibt = "Tibt-sortkey"}, } m["bfw"] = { "Bondo", 2567942, "mun", "Orya", } m["bfx"] = { "Bantayanon", 16837866, "phi", "Latn", } m["bfy"] = { "ဗေက်ဂလဳ", 2356364, "inc-hie", "Deva", ancestors = "inc-oaw", translit = "hi-translit", } m["bfz"] = { "မဟာသု ပဟာရဳ", 6733460, "him", "Deva", translit = "hi-translit", } m["bga"] = { "Gwamhi-Wuri", 6707102, "nic-knn", "Latn", } m["bgb"] = { "Bobongko", 4935896, "poz-slb", "Latn", } m["bgc"] = { "ဟာယျာန်ဝဳ", 33410, "inc-hiw", "Deva", translit = "hi-translit", } m["bgd"] = { "Rathwi Bareli", 7295692, "inc-bhi", "Deva", } m["bge"] = { "Bauria", 4873579, "inc-bhi", "Deva", } m["bgf"] = { "Bangandu", 34938, "gba-sou", "Latn", } m["bgg"] = { "Bugun", 3514220, "sit-khb", "Latn", } m["bgi"] = { "Giangan", 4842057, "phi", "Latn", } m["bgj"] = { "Bangolan", 34862, "nic-nun", "Latn", } m["bgk"] = { "Bit", 2904868, "mkh-pal", "Latn", -- also Hani? } m["bgl"] = { "Bo", 8845514, "mkh-vie", } m["bgo"] = { "Baga Koga", 35695, "alv-bag", "Latn", } m["bgq"] = { "Bagri", 2426319, "raj", "Deva", } m["bgr"] = { "Bawm Chin", 56765, "tbq-kuk", "Latn", } m["bgs"] = { "Tagabawa", 7675121, "mno", "Latn", } m["bgt"] = { "Bughotu", 2927723, "poz-sls", "Latn", } m["bgu"] = { "Mbongno", 36141, "nic-mmb", "Latn", } m["bgv"] = { "Warkay-Bipim", 4915439, "ngf", "Latn", } m["bgw"] = { "Bhatri", 8841054, "inc-eas", "Deva", } m["bgx"] = { "Balkan Gagauz Turkish", 2360396, "trk-ogz", "Latn", ancestors = "trk-oat", } m["bgy"] = { "Benggoi", 4887742, "poz-cma", "Latn", } m["bgz"] = { "Banggai", 3441692, "poz-slb", "Latn", } m["bha"] = { "Bharia", 4901287, "inc", "Deva", } m["bhb"] = { "ဗဳလဳ", 33229, "inc-bhi", "Deva", } m["bhc"] = { "Biga", 2902375, "poz-hce", "Latn", } m["bhd"] = { "ဗါတ်ဒရာဟဳ", 4900565, "him", "Arab, Deva", translit = {Deva = "hi-translit"}, } m["bhe"] = { "Bhaya", 8841168, "raj", } m["bhf"] = { "Odiai", 56690, "paa-kwm", "Latn", } m["bhg"] = { "Binandere", 3503802, "ngf", "Latn", } m["bhh"] = { "Bukhari", 56469, "ira-swi", "Cyrl, Hebr, Latn, fa-Arab", ancestors = "tg", } m["bhi"] = { "ဗဳလာလဳ", 4901729, "inc-bhi", "Deva", } m["bhj"] = { "Bahing", 56442, "sit-kiw", "Deva, Latn", } m["bhl"] = { "Bimin", 4913743, "ngf-okk", "Latn", } m["bhm"] = { "Bathari", 2586893, "sem-sar", "Arab, Latn", } m["bhn"] = { "Bohtan Neo-Aramaic", 33230, "sem-nna", } m["bho"] = { "ဖေဝ်ၜေါအ်ရေဝ်", 33268, "inc-bih", "Deva, Kthi", wikimedia_codes = "bh", translit = { Deva = "bho-translit", Kthi = "bho-Kthi-translit", }, } m["bhp"] = { "Bima", 2796873, "poz-cet", "Latn", } m["bhq"] = { "Tukang Besi South", 12643975, "poz-mun", "Latn", } m["bhs"] = { "Buwal", 3515065, "cdc-cbm", "Latn", } m["bht"] = { "Bhattiyali", 4901452, "him", "Deva", } m["bhu"] = { "Bhunjia", 8841766, "inc-hal", "Deva, Orya", } m["bhv"] = { "Bahau", 3502039, "poz", "Latn", } m["bhw"] = { "ဗောတ်", 1961488, "poz-hce", "Latn", } m["bhx"] = { -- spurious? "Bhalay", 8840773, "inc", } m["bhy"] = { "Bhele", 4901671, "bnt-kbi", "Latn", } m["bhz"] = { "Bada", 4840520, "poz-kal", "Latn", } m["bia"] = { "Badimaya", 3442745, "aus-psw", "Latn", } m["bib"] = { "Bissa", 32934, "dmn-bbu", "Latn", } m["bic"] = { "Bikaru", 56342, "paa-eng", "Latn", } m["bid"] = { "Bidiyo", 56258, "cdc-est", "Latn", } m["bie"] = { "Bepour", 4890914, "ngf-mad", "Latn", } m["bif"] = { "Biafada", 35099, "alv-ten", "Latn", } m["big"] = { "Biangai", 8842027, "paa", "Latn", } m["bij"] = { "Kwanka", 35598, "nic-tar", "Latn", } m["bil"] = { "Bile", 34987, "nic-jrn", "Latn", } m["bim"] = { "Bimoba", 34971, "nic-grm", "Latn", } m["bin"] = { "Edo", 35375, "alv-eeo", "Latn", entry_name = {remove_diacritics = c.acute .. c.grave .. c.macron .. c.dgrave}, sort_key = { from = {"ẹ", "gb", "gh", "kh", "kp", "mw", "nw", "ny", "ọ", "rh", "rr", "vb"}, to = {"e" .. p[1], "g" .. p[1], "g" .. p[2], "k" .. p[1], "k" .. p[2], "m" .. p[1], "n" .. p[1], "n" .. p[2], "o" .. p[1], "r" .. p[1], "r" .. p[1], "v" .. p[1]} }, } m["bio"] = { "Nai", 3508074, "paa-kwm", "Latn", } m["bip"] = { "Bila", 2902626, "bnt-kbi", "Latn", } m["biq"] = { "Bipi", 2904312, "poz-aay", "Latn", } m["bir"] = { "Bisorio", 8844749, "paa-eng", "Latn", } m["bit"] = { "Berinomo", 56447, "paa-spk", "Latn", } m["biu"] = { "Biete", 4904687, "tbq-kuk", "Latn", } m["biv"] = { "Southern Birifor", 32859745, "nic-mre", "Latn", } m["biw"] = { "Kol (Cameroon)", 35582, "bnt-mka", "Latn", } m["bix"] = { "Bijori", 3450686, "mun", "Deva", } m["biy"] = { "Birhor", 3450469, "mun", "Deva", } m["biz"] = { "Baloi", 3450590, "bnt-ngn", "Latn", } m["bja"] = { "Budza", 3046889, "bnt-bun", "Latn", } m["bjb"] = { "ဗာန်ကလာ", 3439071, "aus-pam", "Latn", } m["bjc"] = { "Bariji", 4690919, "ngf", "Latn", } m["bje"] = { "ဖေန်အဝ်-ဂျဝ် မေၚ်", 3503800, "hmx-mie", "Hani, Latn", sort_key = {Hani = "Hani-sortkey"}, } m["bjf"] = { "Barzani Jewish Neo-Aramaic", 33234, "sem-nna", "Hebr", -- maybe others } m["bjg"] = { "Bidyogo", 35365, "alv-bak", "Latn", } m["bjh"] = { "Bahinemo", 56361, "paa-spk", "Latn", } m["bji"] = { "Burji", 34999, "cus-hec", "Latn, Ethi", } m["bjj"] = { "Kannauji", 2726867, "inc-hiw", "Deva", } m["bjk"] = { "Barok", 2884743, "poz-ocw", "Latn", } m["bjl"] = { "ဗူဠူ (ဂေတ်နဳတၟိ)", 4997162, "poz-ocw", "Latn", } m["bjm"] = { "Bajelani", 4848866, "ira-zgr", "Latn, Arab", ancestors = "hac", } m["bjn"] = { "ဗါန်ဂျာရဳသ်", 33151, "poz-mly", "Latn, Arab", } m["bjo"] = { "Mid-Southern Banda", 42303990, "bad-cnt", "Latn", } m["bjp"] = { "Fanamaket", 56704263, "poz-oce", "Latn", } m["bjr"] = { "Binumarien", 538364, "paa-kag", "Latn", } m["bjs"] = { "Bajan", 2524014, "crp", "Latn", ancestors = "en", } m["bjt"] = { "Balanta-Ganja", 19359034, "alv-bak", "Arab, Latn", } m["bju"] = { "Busuu", 35046, "nic-fru", "Latn", } m["bjv"] = { "Bedjond", 8829831, "csu-sar", "Latn", } m["bjw"] = { "Bakwé", 34899, "kro-ekr", "Latn", } m["bjx"] = { "Banao Itneg", 12627559, "phi", "Latn", } m["bjy"] = { "Bayali", 4874263, "aus-pam", "Latn", } m["bjz"] = { "Baruga", 2886189, "ngf", "Latn", } m["bka"] = { "Kyak", 35653, "alv-bwj", "Latn", } m["bkc"] = { "Baka", 34905, "nic-nkb", "Latn", } m["bkd"] = { "ဗေန်နူကာဒ်", 4914553, "mno", "Latn", } m["bkf"] = { "Beeke", 3441375, "bnt-kbi", "Latn", } m["bkg"] = { "Buraka", 35066, "nic-nkg", "Latn", } m["bkh"] = { "Bakoko", 34866, "bnt-bsa", "Latn", } m["bki"] = { "Baki", 11024697, "poz-vnc", "Latn", } m["bkj"] = { "Pande", 36263, "bnt-ngn", "Latn", } m["bkk"] = { -- written in Balti script "Brokskat", 2925988, "inc-shn", } m["bkl"] = { "Berik", 378743, "paa-tkw", "Latn", } m["bkm"] = { "ခေမ် (ကေန်မရွန်)", 1656595, "nic-rnc", "Latn", } m["bkn"] = { "Bukitan", 3446774, "poz-bnn", "Latn", } m["bko"] = { "Kwa'", 35567, "bai", "Latn", } m["bkp"] = { "Iboko", 35089, "bnt-ngn", "Latn", } m["bkq"] = { "ဗါတ်ခါဲရဳ", 56846, "sai-pek", "Latn", } m["bkr"] = { "ဗါခုန်ပါဲ", 3436626, "poz-brw", "Latn", } m["bks"] = { "Masbate Sorsogon", 16113356, "phi", "Latn", } m["bkt"] = { "Boloki", 4144560, "bnt-zbi", "Latn", ancestors = "lse", } m["bku"] = { "ၜေါအ်ဟေက်", 1002956, "phi", "Buhd", } m["bkv"] = { "Bekwarra", 34954, "nic-ben", "Latn", } m["bkw"] = { "Bekwel", 34950, "bnt-bek", "Latn", } m["bkx"] = { "Baikeno", 11200640, "poz-tim", "Latn", } m["bky"] = { "Bokyi", 35087, "nic-ben", "Latn", } m["bkz"] = { "Bungku", 2928207, "poz-btk", "Latn", } m["bla"] = { "ဗလပ်ဖှေက်", 33060, "alg", "Latn, Cans", } m["blb"] = { "Bilua", 35003, "ngf", "Latn", } m["blc"] = { "ဘေတ်လာ ခဝ်လာ", 977808, "sal", "Latn", } m["bld"] = { "Bolango", 3450578, "phi", "Latn", } m["ble"] = { "Balanta-Kentohe", 56789, "alv-bak", "Latn", } m["blf"] = { "Buol", 2928278, "phi", "Latn", } m["blg"] = { "Balau", 4850134, "poz-mly", "Latn", } m["blh"] = { "Kuwaa", 35579, "kro", "Latn", } m["bli"] = { "Bolia", 34910, "bnt-mon", "Latn", } m["blj"] = { "ဗလံၚ်ဂါန်", 9229310, "poz", "Latn", } m["blk"] = { "ပအိုဝ်", 7121294, "kar", "Mymr", translit = "blk-translit", } m["bll"] = { "Biloxi", 2903780, "sio-ohv", "Latn", } m["blm"] = { "Beli", 56821, "csu-bbk", "Latn", } m["bln"] = { "Southern Catanduanes Bicolano", 7569754, "phi", "Latn", } m["blo"] = { "Anii", 34838, "alv-ntg", "Latn", } m["blp"] = { "Blablanga", 2905245, "poz-ocw", "Latn", } m["blq"] = { "ဗဠုအောန်-ဖါန်", 2881675, "poz-aay", "Latn", } m["blr"] = { "ဗလၚ်", 4925096, "mkh-pal", "Latn, Tale, Lana, Thai", sort_key = { -- FIXME: This needs to be converted into the current standardized format. from = {"[%pᪧๆ]", "[᩠ᩳ-᩿]", "ᩔ", "ᩕ", "ᩖ", "ᩘ", "([ᨭ-ᨱ])ᩛ", "([ᨷ-ᨾ])ᩛ", "ᩤ", "[็-๎]", "([เแโใไ])([ก-ฮ])"}, to = {"", "", "ᩈᩈ", "ᩁ", "ᩃ", "ᨦ", "%1ᨮ", "%1ᨻ", "ᩣ", "", "%2%1"} }, } m["bls"] = { "Balaesang", 4849796, "poz", "Latn", } m["blt"] = { "သေံဓီု", 56407, "tai-swe", "Tavt, Latn", translit = "Tavt-translit", sort_key = { Tavt = { from = {"[꪿ꫀ꫁ꫂ]", "([ꪵꪶꪹꪻꪼ])([ꪀ-ꪯ])"}, to = {"", "%2%1"} }, }, } m["blv"] = { "Kibala", 4939959, "bnt-kmb", "Latn", } m["blw"] = { "Balangao", 4850033, "phi", "Latn", } m["blx"] = { "Mag-Indi Ayta", 1931221, "phi", "Latn", } m["bly"] = { "Notre", 11009194, "nic-wov", "Latn", } m["blz"] = { "ဗါလာန်တာတ်", 4850053, "poz-slb", "Latn", } m["bma"] = { "Lame", 3913997, "nic-jrn", "Latn", } m["bmb"] = { "Bembe", 4885023, "bnt-lgb", "Latn", } m["bmc"] = { "Biem", 4904523, "poz-ocw", "Latn", } m["bmd"] = { "Baga Manduri", 35815, "alv-bag", "Latn", } m["bme"] = { "Limassa", 11004666, "nic-nkb", "Latn", } m["bmf"] = { "Bom", 35088, "alv-mel", "Latn", } m["bmg"] = { "Bamwe", 34867, "bnt-bun", "Latn", } m["bmh"] = { "Kein", 6383764, "ngf-mad", "Latn", } m["bmi"] = { "Bagirmi", 34903, "csu-bgr", "Latn", } m["bmj"] = { "Bote-Majhi", 9229570, "inc-eas", "Deva", ancestors = "bh", } m["bmk"] = { "Ghayavi", 5555976, "poz-ocw", "Latn", } m["bml"] = { "Bomboli", 35055, "bnt-ngn", "Latn", } m["bmn"] = { "Bina", 8843664, "poz-ocw", "Latn", } m["bmo"] = { "Bambalang", 34868, "nic-nun", "Latn", } m["bmp"] = { "Bulgebi", 4996380, "ngf-fin", "Latn", } m["bmq"] = { "Bomu", 35065, "nic-bwa", "Latn", } m["bmr"] = { "မူအဳနာန်", 3027894, "sai-bor", "Latn", } m["bmt"] = { "မန်ၜျံၚ်", 8842159, "hmx-mie", } m["bmu"] = { "Somba-Siawari", 5000983, "ngf", "Latn", } m["bmv"] = { "Bum", 35058, "nic-rnc", "Latn", } m["bmw"] = { "Bomwali", 34984, "bnt-ndb", "Latn", } m["bmx"] = { "Baimak", 3450546, "ngf-mad", "Latn", } m["bmz"] = { "Baramu", 4858315, "ngf", "Latn", } m["bna"] = { "Bonerate", 4941729, "poz-mun", "Latn", } m["bnb"] = { "Bookan", 4943150, "poz-san", "Latn", } m["bnd"] = { "Banda", 3504147, "poz-cma", "Latn", } m["bne"] = { "Bintauna", 4914533, "phi", "Latn", } m["bnf"] = { "မာသိဝါန်", 6783305, "poz-cma", "Latn", } m["bng"] = { "Benga", 34952, "bnt-saw", "Latn", } m["bni"] = { "Bangi", 34936, "bnt-bmo", "Latn", } m["bnj"] = { "Eastern Tawbuid", 18757427, "phi", "Latn", } m["bnk"] = { "Bierebo", 2902029, "poz-vnc", "Latn", } m["bnl"] = { "Boon", 56616, "cus-eas", "Latn", } m["bnm"] = { "Batanga", 34979, "bnt-saw", "Latn", } m["bnn"] = { "ဗုန်ရနာန်", 56505, "map", "Latn", } m["bno"] = { "အာသဳ", 29490, "phi", "Latn", } m["bnp"] = { "ဗဝ်လာ", 4938876, "poz-ocw", "Latn", } m["bnq"] = { "ဗါန်တေတ်", 2883521, "poz", "Latn", } m["bnr"] = { "Butmas-Tur", 2928942, "poz-vnn", "Latn", } m["bns"] = { "ဗါန်ဒေလဳ", 56399, "inc-hiw", "Deva", translit = "hi-translit", } m["bnu"] = { "Bentong", 4890644, "poz-ssw", "Latn", } m["bnv"] = { "Beneraf", 4941733, "paa-tkw", "Latn", } m["bnw"] = { "Bisis", 56356, "paa-spk", "Latn", } m["bnx"] = { "Bangubangu", 3438330, "bnt-lbn", "Latn", } m["bny"] = { "ဗေၚ်တူဠူ", 3450775, "poz-swa", "Latn", } m["bnz"] = { "Beezen", 35083, "nic-ykb", "Latn", } m["boa"] = { "Bora", 2375468, "sai-bor", "Latn", } m["bob"] = { "Aweer", 56526, "cus-som", "Latn", } m["boe"] = { "Mundabli", 36127, "nic-beb", "Latn", } m["bof"] = { "Bolon", 3913301, "dmn-emn", "Latn", } m["bog"] = { "Bamako Sign Language", 4853284, "sgn", } m["boh"] = { "North Boma", 35080, "bnt-bdz", "Latn", } m["boi"] = { "Barbareño", 56391, "nai-chu", "Latn", } m["boj"] = { "Anjam", 3504136, "ngf-mad", "Latn", } m["bok"] = { "Bonjo", 34942, "alv", "Latn", } m["bol"] = { "Bole", 3436680, "cdc-wst", "Latn", } m["bom"] = { "Berom", 35013, "nic-beo", "Latn", } m["bon"] = { "Bine", 4914077, "paa", "Latn", } m["boo"] = { "Tiemacèwè Bozo", 12643582, "dmn-snb", "Latn", -- and others? } m["bop"] = { "Bonkiman", 4942134, "ngf-fin", "Latn", } m["boq"] = { "Bogaya", 7207578, "ngf", "Latn", } m["bor"] = { "ဗဝ်ဝေဝ်ရဝ်", 32986, "sai-mje", "Latn", } m["bot"] = { "Bongo", 2910067, "csu-bbk", "Latn", } m["bou"] = { "ဗန်ဒေအိ", 4941378, "bnt-seu", "Latn", } m["bov"] = { "Tuwuli", 36974, "alv-ktg", "Latn", } m["bow"] = { "ရေမာ", 7311502, "paa", "Latn", } m["box"] = { "ဗူအာမူ", 35157, "nic-bwa", "Latn", } m["boy"] = { "Bodo (Central Africa)", 4936715, "bnt-leb", "Latn", } m["boz"] = { "Tiéyaxo Bozo", 32860401, "dmn-snb", "Latn", } m["bpa"] = { "Daakaka", 1157729, "poz-vnc", "Latn", } m["bpd"] = { "Banda-Banda", 3450674, "bad-cnt", "Latn", } m["bpg"] = { "Bonggo", 4941860, "poz-ocw", "Latn", } m["bph"] = { "ဗေဒ်လိခ်", 56560, "cau-and", "Cyrl", translit = "cau-nec-translit", override_translit = true, display_text = {Cyrl = s["cau-Cyrl-displaytext"]}, entry_name = {Cyrl = s["cau-Cyrl-entryname"]}, } m["bpi"] = { "Bagupi", 3450697, "ngf-mad", "Latn", } m["bpj"] = { "Binji", 4914403, "bnt-lbn", "Latn", } m["bpk"] = { "Orowe", 7103905, "poz-cln", "Latn", } m["bpl"] = { "Broome Pearling Lugger Pidgin", 4975277, "crp", "Latn", ancestors = "ms", } m["bpm"] = { "Biyom", 4919327, "ngf-mad", "Latn", } m["bpn"] = { "Dzao Min", 3042189, "hmx-mie", } m["bpo"] = { "Anasi", 11207813, "paa-egb", "Latn", } m["bpp"] = { "Kaure", 20526532, "paa", "Latn", } m["bpq"] = { "Banda Malay", 12473442, "crp", "Latn", ancestors = "ms", } m["bpr"] = { "Koronadal Blaan", 16115430, "phi", "Latn", } m["bps"] = { "Sarangani Blaan", 16117272, "phi", "Latn", } m["bpt"] = { "Barrow Point", 2567916, "aus-pmn", "Latn", } m["bpu"] = { "Bongu", 4941930, "ngf-mad", "Latn", } m["bpv"] = { "Bian Marind", 8841889, "ngf", "Latn", } m["bpx"] = { "ပါလဳယျာ ဗာရေဝ်လဳ", 7128872, "inc-bhi", "Deva", translit = "hi-translit", } m["bpy"] = { "ဗေတ်သနုပရိယျာ မဏဳန်ၜေါအ်ရဳ", 37059, "inc-bas", "Beng", ancestors = "inc-obn", } m["bpz"] = { "Bilba", 8843362, "poz-tim", "Latn", } m["bqa"] = { "Tchumbuli", 11008162, "alv-ctn", "Latn", ancestors = "ak", } m["bqb"] = { "Bagusa", 4842178, "paa-tkw", "Latn", } m["bqc"] = { "Boko", 34983, "dmn-bbu", "Latn", } m["bqd"] = { "Bung", 3436612, "nic-bdn", "Latn", } m["bqf"] = { "Baga Kaloum", 3502293, "alv-bag", "Latn", } m["bqg"] = { "Bago-Kusuntu", 34878, "nic-gne", } m["bqh"] = { "Baima", 674990, "sit-qia", } m["bqi"] = { "ဗါတ်ထဳအာရဳ", 257829, "ira-swi", "fa-Arab", ancestors = "pal", } m["bqj"] = { "Bandial", 34872, "alv-jol", "Latn", } m["bqk"] = { "Banda-Mbrès", 3450724, "bad-cnt", "Latn", } m["bql"] = { "Bilakura", 4907504, "ngf-mad", "Latn", } m["bqm"] = { "Wumboko", 37051, "bnt-kpw", "Latn", } m["bqn"] = { "Bulgarian Sign Language", 3438325, "sgn", } m["bqo"] = { "Balo", 34865, "nic-grs", "Latn", } m["bqp"] = { "Busa", 35185, "dmn-bbu", "Latn", } m["bqq"] = { "Biritai", 56382, "paa-lkp", "Latn", } m["bqr"] = { "Burusu", 5001028, "poz-san", "Latn", } m["bqs"] = { "Bosngun", 56838, "paa", "Latn", } m["bqt"] = { "Bamukumbit", 35078, "nic-nge", "Latn", } m["bqu"] = { "Boguru", 3438444, "bnt-boa", "Latn", } m["bqv"] = { "Begbere-Ejar", 7194098, "nic-plc", "Latn", } m["bqw"] = { "Buru (Nigeria)", 1017152, "nic-bds", "Latn", } m["bqx"] = { "Baangi", 3450648, "nic-kam", "Latn", } m["bqy"] = { "Bengkala Sign Language", 3322119, "sgn", } m["bqz"] = { "Bakaka", 34855, "bnt-mne", "Latn", } m["bra"] = { "ဗြာတ်", 35243, "inc-hiw", "Deva", translit = "hi-translit", } m["brb"] = { "Lave", 4957737, "mkh-ban", } m["brc"] = { "ဒါတ် ဗေဗောတ် ခရေဝ်အဝ်", 35215, "crp", "Latn", ancestors = "nl", } m["brd"] = { "Baraamu", 56804, "sit-new", "Deva", } m["brf"] = { "Bera", 2896850, "bnt-kbi", "Latn", } m["brg"] = { "ဗါတ်ရာတ်", 2839722, "awd", "Latn", } m["brh"] = { "ဗရာဝဳ", 33202, "dra-nor", "ur-Arab, Latn", translit = {["ur-Arab"] = "ur-translit"}, entry_name = { -- character "ۂ" code U+06C2 to "ه" and "هٔ"‎ (U+0647 + U+0654) to "ه"; hamzatu l-waṣli to a regular alif from = {"هٔ", "ۂ", "ٱ"}, to = {"ہ", "ہ", "ا"}, remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef }, } m["bri"] = { "Mokpwe", 36428, "bnt-kpw", "Latn", } m["brj"] = { "Bieria", 4904607, "poz-vnc", "Latn", } m["brk"] = { "ဗြေတ်ဂေါတ်", 56823, "nub", "Latn", } m["brl"] = { "Birwa", 3501019, "bnt-sts", "Latn", } m["brm"] = { "Barambu", 34893, "znd", "Latn", } m["brn"] = { "Boruca", 4946773, "cba", "Latn", } m["bro"] = { "Brokkat", 56605, "sit-tib", "Tibt, Latn", translit = {Tibt = "Tibt-translit"}, override_translit = true, display_text = {Tibt = s["Tibt-displaytext"]}, entry_name = {Tibt = s["Tibt-entryname"]}, sort_key = {Tibt = "Tibt-sortkey"}, } m["brp"] = { "Barapasi", 56995, "paa-egb", "Latn", } m["brq"] = { "Breri", 4961835, "paa", "Latn", } m["brr"] = { "Birao", 2904383, "poz-sls", "Latn", } m["brs"] = { "Baras", 8827053, "poz", "Latn", } m["brt"] = { "Bitare", 34946, "nic-tvn", "Latn", } m["bru"] = { "ဗရု လ္ပာ်ဖာဗၟံက်", 16115463, "mkh-kat", "Latn, Laoo, Thai", sort_key = { Laoo = "Laoo-sortkey", Thai = "Thai-sortkey", }, } m["brv"] = { "ဗရု လ္ပာ်ပလိုတ် ", 13018531, "mkh-kat", "Latn, Laoo, Thai", sort_key = { Laoo = "Laoo-sortkey", Thai = "Thai-sortkey", }, } m["brw"] = { "Bellari", 4883496, "dra-tlk", "Knda, Mlym", translit = { Knda = "kn-translit", Mlym = "ml-translit", }, } m["brx"] = { "ဗဝ်ဒဝ် (အိန္ဒိယ)", 33223, "tbq-bdg", "Deva, Latn", translit = {Deva = "brx-translit"}, } m["bry"] = { "Burui", 5000976, "paa-spk", "Latn", } m["brz"] = { "Bilbil", 4907473, "poz-ocw", "Latn", } m["bsa"] = { "Abinomn", 56648, "qfa-iso", "Latn", } m["bsb"] = { "Brunei Bisaya", 3450611, "poz-san", "Latn", } m["bsc"] = { "Bassari", 35098, "alv-ten", "Latn", } m["bse"] = { "Wushi", 36973, "nic-rnn", "Latn", } m["bsf"] = { "Bauchi", 34974, "nic-shi", "Latn", } m["bsg"] = { "ဗါတ်သကာဒဳ", 33030, "ira-swi", "fa-Arab, Latn", } m["bsh"] = { "ကမ်ကတ-ဝဳရိ", 2605045, "nur-nor", "Latn, Arab", } m["bsi"] = { "Bassossi", 34940, "bnt-mne", "Latn", } m["bsj"] = { "Bangwinji", 3446631, "alv-wjk", "Latn", } m["bsk"] = { "ဗူရုသျှာသကဳ", 216286, "qfa-iso", "Arab", entry_name = { -- character "ۂ" code U+06C2 to "ه" and "هٔ"‎ (U+0647 + U+0654) to "ه"; hamzatu l-waṣli to a regular alif from = {"هٔ", "ۂ", "ٱ"}, to = {"ہ", "ہ", "ا"}, remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef }, } m["bsl"] = { "Basa-Gumna", 4866150, "nic-bas", "Latn", } m["bsm"] = { "Busami", 5001255, "poz-hce", "Latn", } m["bsn"] = { "Barasana", 2883843, "sai-tuc", "Latn", } m["bso"] = { "Buso", 3441370, "cdc-est", "Latn", } m["bsp"] = { "Baga Sitemu", 36466, "alv-bag", "Latn", } m["bsq"] = { "ဗါတ်သာ", 34949, "kro-wkr", "Latn, Bass", } m["bsr"] = { "Bassa-Kontagora", 4866152, "nic-bas", "Latn", } m["bss"] = { "Akoose", 34806, "bnt-mne", "Latn", } m["bst"] = { "Basketo", 56531, "omv-ome", "Ethi", } m["bsu"] = { "Bahonsuai", 2879298, "poz-btk", "Latn", } m["bsv"] = { "Baga Sobané", 3450433, "alv-bag", "Latn", } m["bsw"] = { "Baiso", 56615, "cus-som", "Latn", } m["bsx"] = { "Yangkam", 36922, "nic-tar", "Latn", } m["bsy"] = { "Sabah Bisaya", 12641557, "poz-san", "Latn", } m["bta"] = { "Bata", 56254, "cdc-cbm", "Latn", } m["btc"] = { "Bati (Cameroon)", 34944, "nic-mbw", "Latn", } m["btd"] = { "ဒါ်ရဳ ဗါတာတ်", 2891045, "btk", "Latn, Batk", } m["bte"] = { "Gamo-Ningi", 5520366, "nic-jer", "Latn", } m["btf"] = { "Birgit", 56302, "cdc-est", "Latn", } m["btg"] = { "Gagnoa Bété", 5005069, "kro-bet", "Latn", } m["bth"] = { "Biatah Bidayuh", 2900881, "day", "Latn", } m["bti"] = { "ၜေါအ်ရေတ်", 56900, "paa-egb", "Latn", } m["btj"] = { "မလေဝ် ဗေတ်ခါနေသဳ", 8828608, "poz-mly", "Latn", } m["btm"] = { "ပါတေတ် မာန်ဒါလေန်", 2891049, "btk", "Latn, Batk", } m["btn"] = { "Ratagnon", 13197, "phi", "Latn", } m["bto"] = { "Iriga Bicolano", 12633026, "phi", "Latn", } m["btp"] = { "Budibud", 4985086, "poz-ocw", "Latn", } m["btq"] = { "Batek", 860315, "mkh-asl", "Latn", } m["btr"] = { "Baetora", 2878874, "poz-vnn", "Latn", } m["bts"] = { "သဳမာလောန်ဂါန် ဗါတာတ်", 2891054, "btk", "Latn, Batk", } m["btt"] = { "Bete-Bendi", 4887064, "nic-ben", "Latn", } m["btu"] = { "Batu", 34964, "nic-tvn", "Latn", } m["btv"] = { "Bateri", 3812564, "inc-koh", "Deva", } m["btw"] = { "Butuanon", 5003156, "phi", "Latn", } m["btx"] = { "ခါရုဝ် ဗါတာက်", 33012, "btk", "Latn, Batk", } m["bty"] = { "Bobot", 3446788, "poz-cma", "Latn", } m["btz"] = { "Alas-Kluet Batak", 2891042, "btk", "Latn, Batk", } m["bua"] = { "ၜေါအ်ရာဇ်", 33120, "xgn-cen", "Cyrl, Mong, Latn", wikimedia_codes = "bxr", ancestors = "cmg", translit = { Cyrl = "bua-translit", Mong = "Mong-translit", }, override_translit = true, display_text = {Mong = s["Mong-displaytext"]}, entry_name = { Cyrl = {remove_diacritics = c.grave .. c.acute}, Mong = s["Mong-entryname"], }, sort_key = { Cyrl = { from = {"ё", "ө", "ү", "һ"}, to = {"е" .. p[1], "о" .. p[1], "у" .. p[1], "х" .. p[1]} }, }, } m["bub"] = { "Bua", 32928, "alv-bua", "Latn", } m["bud"] = { "Ntcham", 36266, "nic-grm", "Latn", } m["bue"] = { "Beothuk", 56234, nil, "Latn", } m["buf"] = { "Bushoong", 3449964, "bnt-bsh", "Latn", } m["bug"] = { "ၜေါအ်ဂဳနဳ", 33190, "poz-ssw", "Bugi, Latn", } m["buh"] = { "Younuo Bunu", 56299, "hmn", "Latn", } m["bui"] = { "Bongili", 35084, "bnt-ngn", "Latn", } m["buj"] = { "Basa-Gurmana", 6432515, "nic-bas", "Latn", } m["buk"] = { "Bukawa", 35043, "poz-ocw", "Latn", } m["bum"] = { "Bulu (Cameroon)", 35028, "bnt-btb", "Latn", } m["bun"] = { "Sherbro", 36339, "alv-mel", "Latn", } m["buo"] = { "Terei", 56831, "paa-sbo", "Latn", } m["bup"] = { "Busoa", 5002001, "poz", "Latn", } m["buq"] = { "ဗရာံ", 4960502, "ngf", "Latn", } m["bus"] = { "Bokobaru", 9228931, "dmn-bbu", "Latn", } m["but"] = { "Bungain", 3450623, "qfa-tor", "Latn", } m["buu"] = { "Budu", 3450207, "bnt-nya", "Latn", } m["buv"] = { "Bun", 56351, "paa-yua", "Latn", } m["buw"] = { "Bubi", 35017, "bnt-tso", "Latn", } m["bux"] = { "Boghom", 3440412, "cdc-wst", "Latn", } m["buy"] = { "Mmani", 35061, "alv-mel", "Latn", } m["bva"] = { "Barein", 56285, "cdc-est", "Latn", } m["bvb"] = { "Bube", 35110, "nic-bds", "Latn", } m["bvc"] = { "Baelelea", 2878833, "poz-sls", "Latn", } m["bvd"] = { "Baeggu", 2878850, "poz-sls", "Latn", } m["bve"] = { "မလေဝ် ဗဳရဴ", 3915770, "poz-mly", "Latn", } m["bvf"] = { "Boor", 56250, "cdc-est", "Latn", } m["bvg"] = { "Bonkeng", 34958, "bnt-bbo", "Latn", } m["bvh"] = { "Bure", 56294, "cdc-wst", "Latn", } m["bvi"] = { "Belanda Viri", 35247, "nic-ser", "Latn", } m["bvj"] = { "Baan", 3515067, "nic-ogo", "Latn", } m["bvk"] = { "ဗူကာတ်", 4986814, "poz-bnn", "Latn", } m["bvl"] = { "Bolivian Sign Language", 1783590, "sgn", "Latn", -- when documented } m["bvm"] = { "Bamunka", 34882, "nic-rnn", "Latn", } m["bvn"] = { "Buna", 3450516, "qfa-tor", "Latn", } m["bvo"] = { "Bolgo", 35038, "alv-bua", "Latn", } m["bvp"] = { "Bumang", 4997235, "mkh-pal", } m["bvq"] = { "Birri", 56514, "csu-bkr", "Latn", } m["bvr"] = { "Burarra", 4998124, "aus-arn", "Latn", } m["bvt"] = { "Bati (Indonesia)", 4869253, "poz-cma", "Latn", } m["bvu"] = { "Bukit Malay", 9230148, "poz-mly", "Latn", } m["bvv"] = { "Baniva", 3515198, "awd", "Latn", } m["bvw"] = { "Boga", 56262, "cdc-cbm", "Latn", } m["bvx"] = { "ဗါဗဝ်လေဝ်", 35180, "bnt-ngn", "Latn", } m["bvy"] = { "Baybayanon", 16839275, "phi", "Latn", } m["bvz"] = { "Bauzi", 56360, "paa-egb", "Latn", } m["bwa"] = { "Bwatoo", 9232446, "poz-cln", "Latn", } m["bwb"] = { "Namosi-Naitasiri-Serua", 3130290, "poz-pcc", "Latn", } m["bwc"] = { "Bwile", 3447440, "bnt-sbi", "Latn", } m["bwd"] = { "Bwaidoka", 2929111, "poz-ocw", "Latn", } m["bwe"] = { "ကရေၚ်ပို", 56994, "kar", } m["bwf"] = { "Boselewa", 4947229, "poz-ocw", "Latn", } m["bwg"] = { "Barwe", 8826802, "bnt-sna", "Latn", } m["bwh"] = { "Bishuo", 34973, "nic-fru", "Latn", } m["bwi"] = { "Baniwa", 3501735, "awd-nwk", "Latn", } m["bwj"] = { "Láá Láá Bwamu", 11017275, "nic-bwa", "Latn", } m["bwk"] = { "Bauwaki", 4873607, "ngf", "Latn", } m["bwl"] = { "Bwela", 5003678, "bnt-bun", "Latn", } m["bwm"] = { "Biwat", 56352, "paa-yua", "Latn", } m["bwn"] = { "Wunai Bunu", 56452, "hmn", } m["bwo"] = { "Shinasha", 56260, "omv-gon", "Latn", } m["bwp"] = { "Mandobo Bawah", 12636155, "ngf", "Latn", } m["bwq"] = { "Southern Bobo", 11001714, "dmn-snb", "Latn", } m["bwr"] = { "Bura", 56552, "cdc-cbm", "Latn", } m["bws"] = { "Bomboma", 9229429, "bnt-bun", "Latn", } m["bwt"] = { "Bafaw", 34853, "bnt-bbo", "Latn", } m["bwu"] = { "Buli (Ghana)", 35085, "nic-buk", "Latn", } m["bww"] = { "Bwa", 3515058, "bnt-bta", "Latn", } m["bwx"] = { "Bu-Nao Bunu", 56411, "hmn", "Latn", } m["bwy"] = { "Cwi Bwamu", 11150714, "nic-bwa", "Latn", } m["bwz"] = { "Bwisi", 35067, "bnt-sir", "Latn", } m["bxa"] = { "Bauro", 2892068, "poz-sls", "Latn", } m["bxb"] = { "Belanda Bor", 56678, "sdv-lon", "Latn", } m["bxc"] = { "Molengue", 13345, "bnt-kel", "Latn", } m["bxd"] = { "Pela", 57000, "tbq-brm", } m["bxe"] = { "Ongota", 36344, nil, "Latn", } m["bxf"] = { "Bilur", 2903788, "poz-ocw", "Latn", } m["bxg"] = { "Bangala", 34989, "bnt-bmo", "Latn", } m["bxh"] = { "Buhutu", 4986329, "poz-ocw", "Latn", } m["bxi"] = { "Pirlatapa", 10632195, "aus-kar", "Latn", } m["bxj"] = { "Bayungu", 10427485, "aus-psw", "Latn", } m["bxk"] = { "Bukusu", 32930, "bnt-msl", "Latn", } m["bxl"] = { "Jalkunan", 11009787, "dmn-jje", "Latn", } m["bxn"] = { "Burduna", 4998313, "aus-psw", "Latn", } m["bxo"] = { "Barikanchi", 3450802, "crp", "Latn", ancestors = "ha", } m["bxp"] = { "Bebil", 34941, "bnt-btb", "Latn", } m["bxq"] = { "Beele", 56238, "cdc-wst", "Latn", } m["bxs"] = { "Busam", 35189, "nic-grs", "Latn", } m["bxv"] = { "Berakou", 56796, "csu-bgr", "Latn", } m["bxw"] = { "Banka", 3438402, "dmn-smg", "Latn", } m["bxz"] = { "Binahari", 4913840, "ngf", "Latn", } m["bya"] = { "Palawan Batak", 3450443, "phi", "Tagb", } m["byb"] = { "Bikya", 33257, "nic-fru", "Latn", } m["byc"] = { "Ubaghara", 36625, "nic-ucn", "Latn", } m["byd"] = { "Benyadu'", 11173588, "day", "Latn", } m["bye"] = { "Pouye", 7235814, "paa-spk", "Latn", } m["byf"] = { "Bete", 32932, "nic-ykb", "Latn", } m["byg"] = { "Baygo", 56836, "sdv-daj", "Latn", } m["byh"] = { "Bujhyal", 56317, "sit-gma", "Deva", } m["byi"] = { "Buyu", 5003401, "bnt-nyb", "Latn", } m["byj"] = { "Binawa", 4913807, "nic-kau", "Latn", } m["byk"] = { "Biao", 4902547, "qfa-tak", "Latn", -- also Hani? } m["byl"] = { "Bayono", 3503856, "ngf", "Latn", } m["bym"] = { "Bidyara", 8842355, "aus-pam", "Latn", } m["byn"] = { "ဗလေန်", 56491, "cus-cen", "Ethi, Latn", translit = {Ethi = "Ethi-translit"}, } m["byo"] = { "ဗဳယျဝ်", 56848, "tbq-bka", "Latn, Hani", sort_key = {Hani = "Hani-sortkey"}, } m["byp"] = { "Bumaji", 4997234, "nic-ben", "Latn", } m["byq"] = { "ဗါသျေ", 716647, "map", "Latn", } m["byr"] = { "Baruya", 3450812, "ngf", "Latn", } m["bys"] = { "Burak", 4998097, "alv-bwj", "Latn", } m["byt"] = { "Berti", 35008, "ssa-sah", "Latn", } m["byv"] = { "Medumba", 36019, "bai", "Latn", } m["byw"] = { "Belhariya", 32961, "sit-kie", "Deva", } m["byx"] = { "Qaqet", 3503009, "paa-bng", "Latn", } m["byz"] = { "Banaro", 56858, "paa", "Latn", } m["bza"] = { "Bandi", 34912, "dmn-msw", "Latn", } m["bzb"] = { "Andio", 4754487, "poz-slb", "Latn", } m["bzd"] = { "Bribri", 28400, "cba", "Latn", } m["bze"] = { "Jenaama Bozo", 10950633, "dmn-snb", "Latn", } m["bzf"] = { "Boikin", 56829, "paa-spk", "Latn", } m["bzg"] = { "ဗါၜေအ်ဇြာ", 716615, "map", } m["bzh"] = { "Mapos Buang", 2927370, "poz-ocw", "Latn", } m["bzi"] = { "ဗဳသူ", 56852, "tbq-bis", "Latn, Thai", sort_key = {Thai = "Thai-sortkey"}, } m["bzj"] = { "ဗဳလဳဇေန်ခရဳအဝ်လ် ", 1363055, "crp", "Latn", ancestors = "en", } m["bzk"] = { "Nicaraguan Creole", 3504097, "crp", "Latn", ancestors = "en", } m["bzl"] = { -- supposedly also called "Bolano", but I can find no evidence of that "Boano (Sulawesi)", 4931258, "poz", "Latn", } m["bzm"] = { "Bolondo", 35071, "bnt-bun", "Latn", } m["bzn"] = { "Boano (Maluku)", 4931255, "poz-cma", "Latn", } m["bzo"] = { "Bozaba", 4952785, "bnt-ngn", "Latn", } m["bzp"] = { "Kemberano", 12634399, "ngf-sbh", "Latn", } m["bzq"] = { "ၜူလဳ (အိန်ဒဝ်နဳယျာ)", 2927952, "poz-hce", "Latn", } m["bzr"] = { "Biri", 4087011, "aus-pam", "Latn", } m["bzs"] = { "Brazilian Sign Language", 3436689, "sgn", "Latn", } m["bzu"] = { "Burmeso", 56746, "paa-wpa", "Latn", } m["bzv"] = { "Bebe", 34977, "nic-bbe", "Latn", } m["bzw"] = { "Basa", 34898, "nic-bas", "Latn", } m["bzx"] = { "Hainyaxo Bozo", 11159536, "dmn-snb", "Latn", } m["bzy"] = { "Obanliku", 36276, "nic-ben", "Latn", } m["bzz"] = { "Evant", 35259, "nic-tvc", "Latn", } return require("Module:languages").finalizeData(m, "language") dbgndicedfnso3a69gvn9sefamfnrh4 402092 402091 2026-09-27T16:18:21Z Intobesa.bot 1035 Bot: ပွမကၠာဲစုတ်ယၟုနူဘာသာအၚ်္ဂလိက် 402092 Scribunto text/plain local m_langdata = require("Module:languages/data") -- Loaded on demand, as it may not be needed (depending on the data). local function u(...) u = require("Module:string utilities").char return u(...) end local c = m_langdata.chars local p = m_langdata.puaChars local s = m_langdata.shared local m = {} m["baa"] = { "ဗါဗါတာနာ", 2877785, "poz-ocw", "Latn", } m["bab"] = { "Bainouk-Gunyuño", 35508, "alv-bny", "Latn", } m["bac"] = { "Badui", 3449885, "poz-msa", "Latn", } m["bae"] = { "Baré", 3504087, "awd", "Latn", } m["baf"] = { "Nubaca", 36270, "nic-ymb", "Latn", } m["bag"] = { "Tuki", 36621, "nic-mba", "Latn", } m["bah"] = { "Bahamian Creole", 2669229, "crp", "Latn", ancestors = "en", } m["baj"] = { "Barakai", 3502030, "poz-cet", "Latn", } m["bal"] = { "ဗဠူချဳ", 33049, "ira-nwi", "fa-Arab", } m["ban"] = { "ပါလဳနဳ", 33070, "poz-mcm", "Latn, Bali", } m["bao"] = { "Waimaha", 2883738, "sai-tuc", "Latn", } m["bap"] = { "Bantawa", 56500, "sit-kic", "Krai, Deva", } m["bar"] = { "ဗာဝါရဳယာန်", 29540, "gmw-hgm", "Latn", ancestors = "gmh", } m["bas"] = { "Basaa", 33093, "bnt-bsa", "Latn", } m["bau"] = { "Badanchi", 11001650, "nic-jrw", "Latn", } m["bav"] = { "Babungo", 34885, "nic-rnn", "Latn", } m["baw"] = { "Bambili-Bambui", 34880, "nic-nge", "Latn", } m["bax"] = { "ဗါမာတ်", 35280, "nic-nun", "Latn, Bamu", } m["bay"] = { "Batuley", 8828787, "poz", "Latn", } m["bba"] = { "Baatonum", 34889, "alv-sav", "Latn", } m["bbb"] = { "Barai", 4858206, "ngf", "Latn", } m["bbc"] = { "တဝ်ဗါ ဗါတာတ်", 33017, "btk", "Latn, Batk", } m["bbd"] = { "Bau", 4873415, "ngf-mad", "Latn", } m["bbe"] = { "Bangba", 34895, "nic-nke", "Latn", } m["bbf"] = { "Baibai", 56902, "paa", "Latn", } m["bbg"] = { "Barama", 34884, "bnt-sir", "Latn", } m["bbh"] = { "Bugan", 3033554, "mkh-pkn", "Latn", } m["bbi"] = { "Barombi", 34985, "bnt-bsa", "Latn", } m["bbj"] = { "ဂါဝ်မာဠာ", 35271, "bai", "Latn", } m["bbk"] = { "Babanki", 34790, "nic-rnc", "Latn", } m["bbl"] = { "ဗီတ်", 33259, "cau-nkh", "Geor", translit = "Geor-translit", override_translit = true, entry_name = { remove_diacritics = c.tilde .. c.macron .. c.breve, from = {"<sup>ნ</sup>"}, to = {"ნ"} }, } m["bbm"] = { -- name includes prefix "Babango", 34819, "bnt-bta", "Latn", } m["bbn"] = { "အာန်နဳပါန်", 7884126, "poz-ocw", "Latn", } m["bbo"] = { "Konabéré", 35371, "dmn-snb", "Latn", } m["bbp"] = { "West Central Banda", 7984377, "bad", "Latn", } m["bbq"] = { "Bamali", 34901, "nic-nun", "Latn", } m["bbr"] = { "ဂဳရာဝါ", 5564185, "ngf-mad", "Latn", } m["bbs"] = { "Bakpinka", 3515061, "nic-ucr", "Latn", } m["bbt"] = { "Mburku", 3441324, "cdc-wst", "Latn", } m["bbu"] = { "Bakulung", 35580, "nic-jrn", "Latn", } m["bbv"] = { "Karnai", 6372803, "poz-ocw", "Latn", } m["bbw"] = { "Baba", 34822, "nic-nun", "Latn", } m["bbx"] = { -- cf bvb "Bubia", 34953, "nic-bds", "Latn", ancestors = "bvb", } m["bby"] = { "Befang", 34960, "nic-bds", "Latn", } m["bca"] = { "ဗါဲ ဗဟဵု", 12628803, "sit-bai", "Hani, Latn", sort_key = {Hani = "Hani-sortkey"}, } m["bcb"] = { "Bainouk-Samik", 36390, "alv-bny", "Latn", } m["bcd"] = { "North Babar", 7054041, "poz-tim", "Latn", } m["bce"] = { "Bamenyam", 34968, "nic-nun", "Latn", } m["bcf"] = { "Bamu", 3503788, "paa-kiw", "Latn", } m["bcg"] = { "Baga Pokur", 31172660, "alv-nal", "Latn", } m["bch"] = { "Bariai", 2884502, "poz-ocw", "Latn", } m["bci"] = { "Baoule", 35107, "alv-ctn", "Latn", } m["bcj"] = { "ဗာဒဳ", 3913852, "aus-nyu", "Latn", } m["bck"] = { "Bunaba", 580923, "aus-bub", "Latn", } m["bcl"] = { "ၜေဲလ်ဂဝ်လဝ်အဒေါဝ်", 33284, "phi", "Latn, Tglg", translit = { Tglg = "bcl-translit", }, override_translit = true, entry_name = { Latn = { remove_diacritics = c.grave .. c.acute .. c.circ, } }, sort_key = { Latn = "tl-sortkey", }, standardChars = { Latn = "AaBbKkDdEeGgHhIiLlMmNnOoPpRrSsTtUuWwYy" .. c.punc, }, } m["bcm"] = { "Banoni", 2882857, "poz-ocw", "Latn", } m["bcn"] = { "Bibaali", 34892, "alv-mye", "Latn", } m["bco"] = { "Kaluli", 6354586, "ngf", "Latn", } m["bcp"] = { "Bali", 3515074, "bnt-kbi", "Latn", } m["bcq"] = { "Bench", 35108, "omv", "Latn", } m["bcr"] = { "Babine-Witsuwit'en", 27864, "ath-nor", "Latn", } m["bcs"] = { "Kohumono", 35590, "nic-ucn", "Latn", } m["bct"] = { "Bendi", 8836662, "csu-mle", "Latn", } m["bcu"] = { "Biliau", 2874658, "poz-ocw", "Latn", } m["bcv"] = { "Shoo-Minda-Nye", 36548, "nic-jkn", "Latn", } m["bcw"] = { "Bana", 56272, "cdc-cbm", "Latn", } m["bcy"] = { "Bacama", 56274, "cdc-cbm", "Latn", } m["bcz"] = { "Bainouk-Gunyaamolo", 35506, "alv-bny", "Latn", } m["bda"] = { "Bayot", 35019, "alv-jol", "Latn", } m["bdb"] = { "ဗေသိပ်", 3504208, "poz-bnn", "Latn", } m["bdc"] = { "Emberá-Baudó", 11173166, "sai-chc", "Latn", } m["bdd"] = { "Bunama", 4997416, "poz-ocw", "Latn", } m["bde"] = { "Bade", 56239, "cdc-wst", "Latn", } m["bdf"] = { "Biage", 48037487, "ngf", "Latn", } m["bdg"] = { "Bonggi", 2910053, "poz-bnn", "Latn", } m["bdh"] = { "Tara Baka", 2880165, "csu-bbk", "Latn", } m["bdi"] = { "Burun", 35040, "sdv-niw", "Latn", } m["bdj"] = { "Bai", 34894, "nic-ser", "Latn", } m["bdk"] = { "Budukh", 35397, "cau-ssm", "Cyrl", translit = "cau-nec-translit", override_translit = true, display_text = {Cyrl = s["cau-Cyrl-displaytext"]}, entry_name = {Cyrl = s["cau-Cyrl-entryname"]}, } m["bdl"] = { "Indonesian Bajau", 2880038, "poz", "Latn", } m["bdm"] = { "Buduma", 56287, "cdc-cbm", "Latn", } m["bdn"] = { "Baldemu", 56280, "cdc-cbm", "Latn", } m["bdo"] = { "Morom", 759770, "csu-bgr", "Latn", } m["bdp"] = { "Bende", 8836490, "bnt", "Latn", } m["bdq"] = { "ဗာနာ", 32924, "mkh-ban", "Latn", } m["bdr"] = { "ဗာဂျဴ လ္ပာ်သၚ်ပလိုတ်", 2880037, "poz-sbj", "Latn", } m["bds"] = { "Burunge", 56617, "cus-sou", "Latn", } m["bdt"] = { "Bokoto", 4938812, "gba-wes", "Latn", } m["bdu"] = { "Oroko", 36278, "bnt-saw", "Latn", } m["bdv"] = { "Bodo Parja", 8845881, "inc-eas", "Orya", } m["bdw"] = { "Baham", 3513309, "paa", "Latn", } m["bdx"] = { "Budong-Budong", 4985158, "poz-ssw", "Latn", } m["bdy"] = { "Bandjalang", 2980386, "aus-pam", "Latn", } m["bdz"] = { "Badeshi", 33028, "iir", } m["bea"] = { "Beaver", 20826, "ath-nor", "Latn", } m["beb"] = { "Bebele", 34976, "bnt-btb", "Latn", } m["bec"] = { "Iceve-Maci", 35449, "nic-tvc", "Latn", } m["bed"] = { "Bedoanas", 4879330, "poz-hce", "Latn", } m["bee"] = { "Byangsi", 56904, "sit-alm", "Deva", } m["bef"] = { "Benabena", 2895638, "paa-kag", "Latn", } m["beg"] = { "ဗလေဝ်", 2894198, "poz-swa", "Latn", } m["beh"] = { "Biali", 34961, "nic-eov", "Latn", } m["bei"] = { "Bekati'", 3441683, "day", "Latn", } m["bej"] = { "ဗဳဂျာ", 33025, "cus", "Arab, Latn", } m["bek"] = { "ဗေဗေလဳ", 4878430, "poz-ocw", "Latn", } m["bem"] = { "Bemba", 33052, "bnt-sbi", "Latn", } m["beo"] = { "Beami", 3504079, "paa", "Latn", } m["bep"] = { "Besoa", 8840465, "poz-kal", "Latn", } m["beq"] = { "Beembe", 3196320, "bnt-kng", "Latn", } m["bes"] = { "Besme", 289832, "alv-kim", "Latn", } m["bet"] = { "Guiberoua Bété", 11019185, "kro-bet", "Latn", } m["beu"] = { "ဗလာဂါ", 4923846, "ngf", "Latn", } m["bev"] = { "Daloa Bété", 11155819, "kro-bet", "Latn", } m["bew"] = { "ဗဳတာဝဳ", 33014, "crp", "Latn", ancestors = "ms", } m["bex"] = { "Jur Modo", 56682, "csu-bbk", "Latn", } m["bey"] = { "Akuwagel", 3504170, "qfa-tor", "Latn", } m["bez"] = { "Kibena", 2502949, "bnt-bki", "Latn", } m["bfa"] = { "Bari", 35042, "sdv-bri", "Latn", } m["bfb"] = { "Pauri Bareli", 7155462, "inc-bhi", "Deva", } m["bfc"] = { "ပါန်ယျဳ ဗါဲ", 12642165, "sit-nba", "Hani, Latn", sort_key = {Hani = "Hani-sortkey"}, } m["bfd"] = { "Bafut", 34888, "nic-nge", "Latn", } m["bfe"] = { "Betaf", 4897329, "paa-tkw", "Latn", } m["bff"] = { "Bofi", 34914, "gba-eas", "Latn", } m["bfg"] = { "Busang Kayan", 9231909, "poz", "Latn", } m["bfh"] = { "Blafe", 12628007, "paa", "Latn", } m["bfi"] = { "British Sign Language", 33000, "sgn", "Latn", -- when documented } m["bfj"] = { "Bafanji", 34890, "nic-nun", "Latn", } m["bfk"] = { "Ban Khor Sign Language", 3441103, "sgn", } m["bfl"] = { "Banda-Ndélé", 34850, "bad-cnt", "Latn", } m["bfm"] = { "Mmen", 36132, "nic-rnc", "Latn", } m["bfn"] = { "ဗူနာတ်", 35101, "ngf", "Latn", } m["bfo"] = { "Malba Birifor", 11150710, "nic-mre", "Latn", } m["bfp"] = { "Beba", 35050, "nic-nge", "Latn", } m["bfq"] = { "ဗဒါဂါ", 33205, "dra-kan", "Taml, Knda, Mlym", translit = { --Taml = "Taml-translit", Knda = "kn-translit", Mlym = "ml-translit", }, } m["bfr"] = { "Bazigar", 8829558, "inc", } m["bfs"] = { "ဗါဲလ္ပာ်ဒိုဟ်သမၠုၚ်ကျာ", 12952250, "sit-bai", "Hani, Latn", sort_key = {Hani = "Hani-sortkey"}, } m["bft"] = { "ဗဝ်လ်တဳ", 33086, "sit-lab", "fa-Arab, Deva, Tibt", translit = { Tibt = "Tibt-translit", }, override_translit = "Tibt", display_text = {Tibt = s["Tibt-displaytext"]}, entry_name = { ["fa-Arab"] = { from = {"هٔ", "ٱ"}, to = {"ه", "ا"}, remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.kashida .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.superalef, }, Tibt = s["Tibt-entryname"] }, sort_key = {Tibt = "Tibt-sortkey"}, } m["bfu"] = { "ဂါဟရဳ", 5516952, "sit-whm", "Takr, Tibt", translit = {Tibt = "Tibt-translit"}, override_translit = true, display_text = {Tibt = s["Tibt-displaytext"]}, entry_name = {Tibt = s["Tibt-entryname"]}, sort_key = {Tibt = "Tibt-sortkey"}, } m["bfw"] = { "Bondo", 2567942, "mun", "Orya", } m["bfx"] = { "Bantayanon", 16837866, "phi", "Latn", } m["bfy"] = { "ဗေက်ဂလဳ", 2356364, "inc-hie", "Deva", ancestors = "inc-oaw", translit = "hi-translit", } m["bfz"] = { "မဟာသု ပဟာရဳ", 6733460, "him", "Deva", translit = "hi-translit", } m["bga"] = { "Gwamhi-Wuri", 6707102, "nic-knn", "Latn", } m["bgb"] = { "Bobongko", 4935896, "poz-slb", "Latn", } m["bgc"] = { "ဟာယျာန်ဝဳ", 33410, "inc-hiw", "Deva", translit = "hi-translit", } m["bgd"] = { "Rathwi Bareli", 7295692, "inc-bhi", "Deva", } m["bge"] = { "Bauria", 4873579, "inc-bhi", "Deva", } m["bgf"] = { "Bangandu", 34938, "gba-sou", "Latn", } m["bgg"] = { "Bugun", 3514220, "sit-khb", "Latn", } m["bgi"] = { "Giangan", 4842057, "phi", "Latn", } m["bgj"] = { "Bangolan", 34862, "nic-nun", "Latn", } m["bgk"] = { "Bit", 2904868, "mkh-pal", "Latn", -- also Hani? } m["bgl"] = { "Bo", 8845514, "mkh-vie", } m["bgo"] = { "Baga Koga", 35695, "alv-bag", "Latn", } m["bgq"] = { "Bagri", 2426319, "raj", "Deva", } m["bgr"] = { "Bawm Chin", 56765, "tbq-kuk", "Latn", } m["bgs"] = { "Tagabawa", 7675121, "mno", "Latn", } m["bgt"] = { "Bughotu", 2927723, "poz-sls", "Latn", } m["bgu"] = { "Mbongno", 36141, "nic-mmb", "Latn", } m["bgv"] = { "Warkay-Bipim", 4915439, "ngf", "Latn", } m["bgw"] = { "Bhatri", 8841054, "inc-eas", "Deva", } m["bgx"] = { "Balkan Gagauz Turkish", 2360396, "trk-ogz", "Latn", ancestors = "trk-oat", } m["bgy"] = { "Benggoi", 4887742, "poz-cma", "Latn", } m["bgz"] = { "Banggai", 3441692, "poz-slb", "Latn", } m["bha"] = { "Bharia", 4901287, "inc", "Deva", } m["bhb"] = { "ဗဳလဳ", 33229, "inc-bhi", "Deva", } m["bhc"] = { "Biga", 2902375, "poz-hce", "Latn", } m["bhd"] = { "ဗါတ်ဒရာဟဳ", 4900565, "him", "Arab, Deva", translit = {Deva = "hi-translit"}, } m["bhe"] = { "Bhaya", 8841168, "raj", } m["bhf"] = { "Odiai", 56690, "paa-kwm", "Latn", } m["bhg"] = { "Binandere", 3503802, "ngf", "Latn", } m["bhh"] = { "Bukhari", 56469, "ira-swi", "Cyrl, Hebr, Latn, fa-Arab", ancestors = "tg", } m["bhi"] = { "ဗဳလာလဳ", 4901729, "inc-bhi", "Deva", } m["bhj"] = { "Bahing", 56442, "sit-kiw", "Deva, Latn", } m["bhl"] = { "Bimin", 4913743, "ngf-okk", "Latn", } m["bhm"] = { "Bathari", 2586893, "sem-sar", "Arab, Latn", } m["bhn"] = { "Bohtan Neo-Aramaic", 33230, "sem-nna", } m["bho"] = { "ဖေဝ်ၜေါအ်ရေဝ်", 33268, "inc-bih", "Deva, Kthi", wikimedia_codes = "bh", translit = { Deva = "bho-translit", Kthi = "bho-Kthi-translit", }, } m["bhp"] = { "Bima", 2796873, "poz-cet", "Latn", } m["bhq"] = { "Tukang Besi South", 12643975, "poz-mun", "Latn", } m["bhs"] = { "Buwal", 3515065, "cdc-cbm", "Latn", } m["bht"] = { "Bhattiyali", 4901452, "him", "Deva", } m["bhu"] = { "Bhunjia", 8841766, "inc-hal", "Deva, Orya", } m["bhv"] = { "Bahau", 3502039, "poz", "Latn", } m["bhw"] = { "ဗောတ်", 1961488, "poz-hce", "Latn", } m["bhx"] = { -- spurious? "Bhalay", 8840773, "inc", } m["bhy"] = { "Bhele", 4901671, "bnt-kbi", "Latn", } m["bhz"] = { "Bada", 4840520, "poz-kal", "Latn", } m["bia"] = { "Badimaya", 3442745, "aus-psw", "Latn", } m["bib"] = { "Bissa", 32934, "dmn-bbu", "Latn", } m["bic"] = { "Bikaru", 56342, "paa-eng", "Latn", } m["bid"] = { "Bidiyo", 56258, "cdc-est", "Latn", } m["bie"] = { "Bepour", 4890914, "ngf-mad", "Latn", } m["bif"] = { "Biafada", 35099, "alv-ten", "Latn", } m["big"] = { "Biangai", 8842027, "paa", "Latn", } m["bij"] = { "Kwanka", 35598, "nic-tar", "Latn", } m["bil"] = { "Bile", 34987, "nic-jrn", "Latn", } m["bim"] = { "Bimoba", 34971, "nic-grm", "Latn", } m["bin"] = { "Edo", 35375, "alv-eeo", "Latn", entry_name = {remove_diacritics = c.acute .. c.grave .. c.macron .. c.dgrave}, sort_key = { from = {"ẹ", "gb", "gh", "kh", "kp", "mw", "nw", "ny", "ọ", "rh", "rr", "vb"}, to = {"e" .. p[1], "g" .. p[1], "g" .. p[2], "k" .. p[1], "k" .. p[2], "m" .. p[1], "n" .. p[1], "n" .. p[2], "o" .. p[1], "r" .. p[1], "r" .. p[1], "v" .. p[1]} }, } m["bio"] = { "Nai", 3508074, "paa-kwm", "Latn", } m["bip"] = { "Bila", 2902626, "bnt-kbi", "Latn", } m["biq"] = { "Bipi", 2904312, "poz-aay", "Latn", } m["bir"] = { "Bisorio", 8844749, "paa-eng", "Latn", } m["bit"] = { "Berinomo", 56447, "paa-spk", "Latn", } m["biu"] = { "Biete", 4904687, "tbq-kuk", "Latn", } m["biv"] = { "Southern Birifor", 32859745, "nic-mre", "Latn", } m["biw"] = { "Kol (Cameroon)", 35582, "bnt-mka", "Latn", } m["bix"] = { "Bijori", 3450686, "mun", "Deva", } m["biy"] = { "Birhor", 3450469, "mun", "Deva", } m["biz"] = { "Baloi", 3450590, "bnt-ngn", "Latn", } m["bja"] = { "Budza", 3046889, "bnt-bun", "Latn", } m["bjb"] = { "ဗာန်ကလာ", 3439071, "aus-pam", "Latn", } m["bjc"] = { "Bariji", 4690919, "ngf", "Latn", } m["bje"] = { "ဖေန်အဝ်-ဂျဝ် မေၚ်", 3503800, "hmx-mie", "Hani, Latn", sort_key = {Hani = "Hani-sortkey"}, } m["bjf"] = { "Barzani Jewish Neo-Aramaic", 33234, "sem-nna", "Hebr", -- maybe others } m["bjg"] = { "Bidyogo", 35365, "alv-bak", "Latn", } m["bjh"] = { "Bahinemo", 56361, "paa-spk", "Latn", } m["bji"] = { "Burji", 34999, "cus-hec", "Latn, Ethi", } m["bjj"] = { "Kannauji", 2726867, "inc-hiw", "Deva", } m["bjk"] = { "Barok", 2884743, "poz-ocw", "Latn", } m["bjl"] = { "ဗူဠူ (ဂေတ်နဳတၟိ)", 4997162, "poz-ocw", "Latn", } m["bjm"] = { "Bajelani", 4848866, "ira-zgr", "Latn, Arab", ancestors = "hac", } m["bjn"] = { "ဗါန်ဂျာရဳသ်", 33151, "poz-mly", "Latn, Arab", } m["bjo"] = { "Mid-Southern Banda", 42303990, "bad-cnt", "Latn", } m["bjp"] = { "Fanamaket", 56704263, "poz-oce", "Latn", } m["bjr"] = { "Binumarien", 538364, "paa-kag", "Latn", } m["bjs"] = { "Bajan", 2524014, "crp", "Latn", ancestors = "en", } m["bjt"] = { "Balanta-Ganja", 19359034, "alv-bak", "Arab, Latn", } m["bju"] = { "Busuu", 35046, "nic-fru", "Latn", } m["bjv"] = { "Bedjond", 8829831, "csu-sar", "Latn", } m["bjw"] = { "Bakwé", 34899, "kro-ekr", "Latn", } m["bjx"] = { "Banao Itneg", 12627559, "phi", "Latn", } m["bjy"] = { "Bayali", 4874263, "aus-pam", "Latn", } m["bjz"] = { "Baruga", 2886189, "ngf", "Latn", } m["bka"] = { "Kyak", 35653, "alv-bwj", "Latn", } m["bkc"] = { "Baka", 34905, "nic-nkb", "Latn", } m["bkd"] = { "ဗေန်နူကာဒ်", 4914553, "mno", "Latn", } m["bkf"] = { "Beeke", 3441375, "bnt-kbi", "Latn", } m["bkg"] = { "Buraka", 35066, "nic-nkg", "Latn", } m["bkh"] = { "Bakoko", 34866, "bnt-bsa", "Latn", } m["bki"] = { "Baki", 11024697, "poz-vnc", "Latn", } m["bkj"] = { "Pande", 36263, "bnt-ngn", "Latn", } m["bkk"] = { -- written in Balti script "Brokskat", 2925988, "inc-shn", } m["bkl"] = { "Berik", 378743, "paa-tkw", "Latn", } m["bkm"] = { "ခေမ် (ကေန်မရွန်)", 1656595, "nic-rnc", "Latn", } m["bkn"] = { "Bukitan", 3446774, "poz-bnn", "Latn", } m["bko"] = { "Kwa'", 35567, "bai", "Latn", } m["bkp"] = { "Iboko", 35089, "bnt-ngn", "Latn", } m["bkq"] = { "ဗါတ်ခါဲရဳ", 56846, "sai-pek", "Latn", } m["bkr"] = { "ဗါခုန်ပါဲ", 3436626, "poz-brw", "Latn", } m["bks"] = { "Masbate Sorsogon", 16113356, "phi", "Latn", } m["bkt"] = { "Boloki", 4144560, "bnt-zbi", "Latn", ancestors = "lse", } m["bku"] = { "ၜေါအ်ဟေက်", 1002956, "phi", "Buhd", } m["bkv"] = { "Bekwarra", 34954, "nic-ben", "Latn", } m["bkw"] = { "Bekwel", 34950, "bnt-bek", "Latn", } m["bkx"] = { "Baikeno", 11200640, "poz-tim", "Latn", } m["bky"] = { "Bokyi", 35087, "nic-ben", "Latn", } m["bkz"] = { "Bungku", 2928207, "poz-btk", "Latn", } m["bla"] = { "ဗလပ်ဖှေက်", 33060, "alg", "Latn, Cans", } m["blb"] = { "Bilua", 35003, "ngf", "Latn", } m["blc"] = { "နူဇြေတ်ခ်", 977808, "sal", "Latn", } m["bld"] = { "Bolango", 3450578, "phi", "Latn", } m["ble"] = { "Balanta-Kentohe", 56789, "alv-bak", "Latn", } m["blf"] = { "Buol", 2928278, "phi", "Latn", } m["blg"] = { "Balau", 4850134, "poz-mly", "Latn", } m["blh"] = { "Kuwaa", 35579, "kro", "Latn", } m["bli"] = { "Bolia", 34910, "bnt-mon", "Latn", } m["blj"] = { "ဗလံၚ်ဂါန်", 9229310, "poz", "Latn", } m["blk"] = { "ပအိုဝ်", 7121294, "kar", "Mymr", translit = "blk-translit", } m["bll"] = { "Biloxi", 2903780, "sio-ohv", "Latn", } m["blm"] = { "Beli", 56821, "csu-bbk", "Latn", } m["bln"] = { "Southern Catanduanes Bicolano", 7569754, "phi", "Latn", } m["blo"] = { "Anii", 34838, "alv-ntg", "Latn", } m["blp"] = { "Blablanga", 2905245, "poz-ocw", "Latn", } m["blq"] = { "ဗဠုအောန်-ဖါန်", 2881675, "poz-aay", "Latn", } m["blr"] = { "ဗလၚ်", 4925096, "mkh-pal", "Latn, Tale, Lana, Thai", sort_key = { -- FIXME: This needs to be converted into the current standardized format. from = {"[%pᪧๆ]", "[᩠ᩳ-᩿]", "ᩔ", "ᩕ", "ᩖ", "ᩘ", "([ᨭ-ᨱ])ᩛ", "([ᨷ-ᨾ])ᩛ", "ᩤ", "[็-๎]", "([เแโใไ])([ก-ฮ])"}, to = {"", "", "ᩈᩈ", "ᩁ", "ᩃ", "ᨦ", "%1ᨮ", "%1ᨻ", "ᩣ", "", "%2%1"} }, } m["bls"] = { "Balaesang", 4849796, "poz", "Latn", } m["blt"] = { "သေံဓီု", 56407, "tai-swe", "Tavt, Latn", translit = "Tavt-translit", sort_key = { Tavt = { from = {"[꪿ꫀ꫁ꫂ]", "([ꪵꪶꪹꪻꪼ])([ꪀ-ꪯ])"}, to = {"", "%2%1"} }, }, } m["blv"] = { "Kibala", 4939959, "bnt-kmb", "Latn", } m["blw"] = { "Balangao", 4850033, "phi", "Latn", } m["blx"] = { "Mag-Indi Ayta", 1931221, "phi", "Latn", } m["bly"] = { "Notre", 11009194, "nic-wov", "Latn", } m["blz"] = { "ဗါလာန်တာတ်", 4850053, "poz-slb", "Latn", } m["bma"] = { "Lame", 3913997, "nic-jrn", "Latn", } m["bmb"] = { "Bembe", 4885023, "bnt-lgb", "Latn", } m["bmc"] = { "Biem", 4904523, "poz-ocw", "Latn", } m["bmd"] = { "Baga Manduri", 35815, "alv-bag", "Latn", } m["bme"] = { "Limassa", 11004666, "nic-nkb", "Latn", } m["bmf"] = { "Bom", 35088, "alv-mel", "Latn", } m["bmg"] = { "Bamwe", 34867, "bnt-bun", "Latn", } m["bmh"] = { "Kein", 6383764, "ngf-mad", "Latn", } m["bmi"] = { "Bagirmi", 34903, "csu-bgr", "Latn", } m["bmj"] = { "Bote-Majhi", 9229570, "inc-eas", "Deva", ancestors = "bh", } m["bmk"] = { "Ghayavi", 5555976, "poz-ocw", "Latn", } m["bml"] = { "Bomboli", 35055, "bnt-ngn", "Latn", } m["bmn"] = { "Bina", 8843664, "poz-ocw", "Latn", } m["bmo"] = { "Bambalang", 34868, "nic-nun", "Latn", } m["bmp"] = { "Bulgebi", 4996380, "ngf-fin", "Latn", } m["bmq"] = { "Bomu", 35065, "nic-bwa", "Latn", } m["bmr"] = { "မူအဳနာန်", 3027894, "sai-bor", "Latn", } m["bmt"] = { "မန်ၜျံၚ်", 8842159, "hmx-mie", } m["bmu"] = { "Somba-Siawari", 5000983, "ngf", "Latn", } m["bmv"] = { "Bum", 35058, "nic-rnc", "Latn", } m["bmw"] = { "Bomwali", 34984, "bnt-ndb", "Latn", } m["bmx"] = { "Baimak", 3450546, "ngf-mad", "Latn", } m["bmz"] = { "Baramu", 4858315, "ngf", "Latn", } m["bna"] = { "Bonerate", 4941729, "poz-mun", "Latn", } m["bnb"] = { "Bookan", 4943150, "poz-san", "Latn", } m["bnd"] = { "Banda", 3504147, "poz-cma", "Latn", } m["bne"] = { "Bintauna", 4914533, "phi", "Latn", } m["bnf"] = { "မာသိဝါန်", 6783305, "poz-cma", "Latn", } m["bng"] = { "Benga", 34952, "bnt-saw", "Latn", } m["bni"] = { "Bangi", 34936, "bnt-bmo", "Latn", } m["bnj"] = { "Eastern Tawbuid", 18757427, "phi", "Latn", } m["bnk"] = { "Bierebo", 2902029, "poz-vnc", "Latn", } m["bnl"] = { "Boon", 56616, "cus-eas", "Latn", } m["bnm"] = { "Batanga", 34979, "bnt-saw", "Latn", } m["bnn"] = { "ဗုန်ရနာန်", 56505, "map", "Latn", } m["bno"] = { "အာသဳ", 29490, "phi", "Latn", } m["bnp"] = { "ဗဝ်လာ", 4938876, "poz-ocw", "Latn", } m["bnq"] = { "ဗါန်တေတ်", 2883521, "poz", "Latn", } m["bnr"] = { "Butmas-Tur", 2928942, "poz-vnn", "Latn", } m["bns"] = { "ဗါန်ဒေလဳ", 56399, "inc-hiw", "Deva", translit = "hi-translit", } m["bnu"] = { "Bentong", 4890644, "poz-ssw", "Latn", } m["bnv"] = { "Beneraf", 4941733, "paa-tkw", "Latn", } m["bnw"] = { "Bisis", 56356, "paa-spk", "Latn", } m["bnx"] = { "Bangubangu", 3438330, "bnt-lbn", "Latn", } m["bny"] = { "ဗေၚ်တူဠူ", 3450775, "poz-swa", "Latn", } m["bnz"] = { "Beezen", 35083, "nic-ykb", "Latn", } m["boa"] = { "Bora", 2375468, "sai-bor", "Latn", } m["bob"] = { "Aweer", 56526, "cus-som", "Latn", } m["boe"] = { "Mundabli", 36127, "nic-beb", "Latn", } m["bof"] = { "Bolon", 3913301, "dmn-emn", "Latn", } m["bog"] = { "Bamako Sign Language", 4853284, "sgn", } m["boh"] = { "North Boma", 35080, "bnt-bdz", "Latn", } m["boi"] = { "Barbareño", 56391, "nai-chu", "Latn", } m["boj"] = { "Anjam", 3504136, "ngf-mad", "Latn", } m["bok"] = { "Bonjo", 34942, "alv", "Latn", } m["bol"] = { "Bole", 3436680, "cdc-wst", "Latn", } m["bom"] = { "Berom", 35013, "nic-beo", "Latn", } m["bon"] = { "Bine", 4914077, "paa", "Latn", } m["boo"] = { "Tiemacèwè Bozo", 12643582, "dmn-snb", "Latn", -- and others? } m["bop"] = { "Bonkiman", 4942134, "ngf-fin", "Latn", } m["boq"] = { "Bogaya", 7207578, "ngf", "Latn", } m["bor"] = { "ဗဝ်ဝေဝ်ရဝ်", 32986, "sai-mje", "Latn", } m["bot"] = { "Bongo", 2910067, "csu-bbk", "Latn", } m["bou"] = { "ဗန်ဒေအိ", 4941378, "bnt-seu", "Latn", } m["bov"] = { "Tuwuli", 36974, "alv-ktg", "Latn", } m["bow"] = { "ရေမာ", 7311502, "paa", "Latn", } m["box"] = { "ဗူအာမူ", 35157, "nic-bwa", "Latn", } m["boy"] = { "Bodo (Central Africa)", 4936715, "bnt-leb", "Latn", } m["boz"] = { "Tiéyaxo Bozo", 32860401, "dmn-snb", "Latn", } m["bpa"] = { "Daakaka", 1157729, "poz-vnc", "Latn", } m["bpd"] = { "Banda-Banda", 3450674, "bad-cnt", "Latn", } m["bpg"] = { "Bonggo", 4941860, "poz-ocw", "Latn", } m["bph"] = { "ဗေဒ်လိခ်", 56560, "cau-and", "Cyrl", translit = "cau-nec-translit", override_translit = true, display_text = {Cyrl = s["cau-Cyrl-displaytext"]}, entry_name = {Cyrl = s["cau-Cyrl-entryname"]}, } m["bpi"] = { "Bagupi", 3450697, "ngf-mad", "Latn", } m["bpj"] = { "Binji", 4914403, "bnt-lbn", "Latn", } m["bpk"] = { "Orowe", 7103905, "poz-cln", "Latn", } m["bpl"] = { "Broome Pearling Lugger Pidgin", 4975277, "crp", "Latn", ancestors = "ms", } m["bpm"] = { "Biyom", 4919327, "ngf-mad", "Latn", } m["bpn"] = { "Dzao Min", 3042189, "hmx-mie", } m["bpo"] = { "Anasi", 11207813, "paa-egb", "Latn", } m["bpp"] = { "Kaure", 20526532, "paa", "Latn", } m["bpq"] = { "Banda Malay", 12473442, "crp", "Latn", ancestors = "ms", } m["bpr"] = { "Koronadal Blaan", 16115430, "phi", "Latn", } m["bps"] = { "Sarangani Blaan", 16117272, "phi", "Latn", } m["bpt"] = { "Barrow Point", 2567916, "aus-pmn", "Latn", } m["bpu"] = { "Bongu", 4941930, "ngf-mad", "Latn", } m["bpv"] = { "Bian Marind", 8841889, "ngf", "Latn", } m["bpx"] = { "ပါလဳယျာ ဗာရေဝ်လဳ", 7128872, "inc-bhi", "Deva", translit = "hi-translit", } m["bpy"] = { "ဗေတ်သနုပရိယျာ မဏဳန်ၜေါအ်ရဳ", 37059, "inc-bas", "Beng", ancestors = "inc-obn", } m["bpz"] = { "Bilba", 8843362, "poz-tim", "Latn", } m["bqa"] = { "Tchumbuli", 11008162, "alv-ctn", "Latn", ancestors = "ak", } m["bqb"] = { "Bagusa", 4842178, "paa-tkw", "Latn", } m["bqc"] = { "Boko", 34983, "dmn-bbu", "Latn", } m["bqd"] = { "Bung", 3436612, "nic-bdn", "Latn", } m["bqf"] = { "Baga Kaloum", 3502293, "alv-bag", "Latn", } m["bqg"] = { "Bago-Kusuntu", 34878, "nic-gne", } m["bqh"] = { "Baima", 674990, "sit-qia", } m["bqi"] = { "ဗါတ်ထဳအာရဳ", 257829, "ira-swi", "fa-Arab", ancestors = "pal", } m["bqj"] = { "Bandial", 34872, "alv-jol", "Latn", } m["bqk"] = { "Banda-Mbrès", 3450724, "bad-cnt", "Latn", } m["bql"] = { "Bilakura", 4907504, "ngf-mad", "Latn", } m["bqm"] = { "Wumboko", 37051, "bnt-kpw", "Latn", } m["bqn"] = { "Bulgarian Sign Language", 3438325, "sgn", } m["bqo"] = { "Balo", 34865, "nic-grs", "Latn", } m["bqp"] = { "Busa", 35185, "dmn-bbu", "Latn", } m["bqq"] = { "Biritai", 56382, "paa-lkp", "Latn", } m["bqr"] = { "Burusu", 5001028, "poz-san", "Latn", } m["bqs"] = { "Bosngun", 56838, "paa", "Latn", } m["bqt"] = { "Bamukumbit", 35078, "nic-nge", "Latn", } m["bqu"] = { "Boguru", 3438444, "bnt-boa", "Latn", } m["bqv"] = { "Begbere-Ejar", 7194098, "nic-plc", "Latn", } m["bqw"] = { "Buru (Nigeria)", 1017152, "nic-bds", "Latn", } m["bqx"] = { "Baangi", 3450648, "nic-kam", "Latn", } m["bqy"] = { "Bengkala Sign Language", 3322119, "sgn", } m["bqz"] = { "Bakaka", 34855, "bnt-mne", "Latn", } m["bra"] = { "ဗြာတ်", 35243, "inc-hiw", "Deva", translit = "hi-translit", } m["brb"] = { "Lave", 4957737, "mkh-ban", } m["brc"] = { "ဒါတ် ဗေဗောတ် ခရေဝ်အဝ်", 35215, "crp", "Latn", ancestors = "nl", } m["brd"] = { "Baraamu", 56804, "sit-new", "Deva", } m["brf"] = { "Bera", 2896850, "bnt-kbi", "Latn", } m["brg"] = { "ဗါတ်ရာတ်", 2839722, "awd", "Latn", } m["brh"] = { "ဗရာဝဳ", 33202, "dra-nor", "ur-Arab, Latn", translit = {["ur-Arab"] = "ur-translit"}, entry_name = { -- character "ۂ" code U+06C2 to "ه" and "هٔ"‎ (U+0647 + U+0654) to "ه"; hamzatu l-waṣli to a regular alif from = {"هٔ", "ۂ", "ٱ"}, to = {"ہ", "ہ", "ا"}, remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef }, } m["bri"] = { "Mokpwe", 36428, "bnt-kpw", "Latn", } m["brj"] = { "Bieria", 4904607, "poz-vnc", "Latn", } m["brk"] = { "ဗြေတ်ဂေါတ်", 56823, "nub", "Latn", } m["brl"] = { "Birwa", 3501019, "bnt-sts", "Latn", } m["brm"] = { "Barambu", 34893, "znd", "Latn", } m["brn"] = { "Boruca", 4946773, "cba", "Latn", } m["bro"] = { "Brokkat", 56605, "sit-tib", "Tibt, Latn", translit = {Tibt = "Tibt-translit"}, override_translit = true, display_text = {Tibt = s["Tibt-displaytext"]}, entry_name = {Tibt = s["Tibt-entryname"]}, sort_key = {Tibt = "Tibt-sortkey"}, } m["brp"] = { "Barapasi", 56995, "paa-egb", "Latn", } m["brq"] = { "Breri", 4961835, "paa", "Latn", } m["brr"] = { "Birao", 2904383, "poz-sls", "Latn", } m["brs"] = { "Baras", 8827053, "poz", "Latn", } m["brt"] = { "Bitare", 34946, "nic-tvn", "Latn", } m["bru"] = { "ဗရု လ္ပာ်ဖာဗၟံက်", 16115463, "mkh-kat", "Latn, Laoo, Thai", sort_key = { Laoo = "Laoo-sortkey", Thai = "Thai-sortkey", }, } m["brv"] = { "ဗရု လ္ပာ်ပလိုတ် ", 13018531, "mkh-kat", "Latn, Laoo, Thai", sort_key = { Laoo = "Laoo-sortkey", Thai = "Thai-sortkey", }, } m["brw"] = { "Bellari", 4883496, "dra-tlk", "Knda, Mlym", translit = { Knda = "kn-translit", Mlym = "ml-translit", }, } m["brx"] = { "ဗဝ်ဒဝ် (အိန္ဒိယ)", 33223, "tbq-bdg", "Deva, Latn", translit = {Deva = "brx-translit"}, } m["bry"] = { "Burui", 5000976, "paa-spk", "Latn", } m["brz"] = { "Bilbil", 4907473, "poz-ocw", "Latn", } m["bsa"] = { "Abinomn", 56648, "qfa-iso", "Latn", } m["bsb"] = { "Brunei Bisaya", 3450611, "poz-san", "Latn", } m["bsc"] = { "Bassari", 35098, "alv-ten", "Latn", } m["bse"] = { "Wushi", 36973, "nic-rnn", "Latn", } m["bsf"] = { "Bauchi", 34974, "nic-shi", "Latn", } m["bsg"] = { "ဗါတ်သကာဒဳ", 33030, "ira-swi", "fa-Arab, Latn", } m["bsh"] = { "ကမ်ကတ-ဝဳရိ", 2605045, "nur-nor", "Latn, Arab", } m["bsi"] = { "Bassossi", 34940, "bnt-mne", "Latn", } m["bsj"] = { "Bangwinji", 3446631, "alv-wjk", "Latn", } m["bsk"] = { "ဗူရုသျှာသကဳ", 216286, "qfa-iso", "Arab", entry_name = { -- character "ۂ" code U+06C2 to "ه" and "هٔ"‎ (U+0647 + U+0654) to "ه"; hamzatu l-waṣli to a regular alif from = {"هٔ", "ۂ", "ٱ"}, to = {"ہ", "ہ", "ا"}, remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef }, } m["bsl"] = { "Basa-Gumna", 4866150, "nic-bas", "Latn", } m["bsm"] = { "Busami", 5001255, "poz-hce", "Latn", } m["bsn"] = { "Barasana", 2883843, "sai-tuc", "Latn", } m["bso"] = { "Buso", 3441370, "cdc-est", "Latn", } m["bsp"] = { "Baga Sitemu", 36466, "alv-bag", "Latn", } m["bsq"] = { "ဗါတ်သာ", 34949, "kro-wkr", "Latn, Bass", } m["bsr"] = { "Bassa-Kontagora", 4866152, "nic-bas", "Latn", } m["bss"] = { "Akoose", 34806, "bnt-mne", "Latn", } m["bst"] = { "Basketo", 56531, "omv-ome", "Ethi", } m["bsu"] = { "Bahonsuai", 2879298, "poz-btk", "Latn", } m["bsv"] = { "Baga Sobané", 3450433, "alv-bag", "Latn", } m["bsw"] = { "Baiso", 56615, "cus-som", "Latn", } m["bsx"] = { "Yangkam", 36922, "nic-tar", "Latn", } m["bsy"] = { "Sabah Bisaya", 12641557, "poz-san", "Latn", } m["bta"] = { "Bata", 56254, "cdc-cbm", "Latn", } m["btc"] = { "Bati (Cameroon)", 34944, "nic-mbw", "Latn", } m["btd"] = { "ဒါ်ရဳ ဗါတာတ်", 2891045, "btk", "Latn, Batk", } m["bte"] = { "Gamo-Ningi", 5520366, "nic-jer", "Latn", } m["btf"] = { "Birgit", 56302, "cdc-est", "Latn", } m["btg"] = { "Gagnoa Bété", 5005069, "kro-bet", "Latn", } m["bth"] = { "Biatah Bidayuh", 2900881, "day", "Latn", } m["bti"] = { "ၜေါအ်ရေတ်", 56900, "paa-egb", "Latn", } m["btj"] = { "မလေဝ် ဗေတ်ခါနေသဳ", 8828608, "poz-mly", "Latn", } m["btm"] = { "ပါတေတ် မာန်ဒါလေန်", 2891049, "btk", "Latn, Batk", } m["btn"] = { "Ratagnon", 13197, "phi", "Latn", } m["bto"] = { "Iriga Bicolano", 12633026, "phi", "Latn", } m["btp"] = { "Budibud", 4985086, "poz-ocw", "Latn", } m["btq"] = { "Batek", 860315, "mkh-asl", "Latn", } m["btr"] = { "Baetora", 2878874, "poz-vnn", "Latn", } m["bts"] = { "သဳမာလောန်ဂါန် ဗါတာတ်", 2891054, "btk", "Latn, Batk", } m["btt"] = { "Bete-Bendi", 4887064, "nic-ben", "Latn", } m["btu"] = { "Batu", 34964, "nic-tvn", "Latn", } m["btv"] = { "Bateri", 3812564, "inc-koh", "Deva", } m["btw"] = { "Butuanon", 5003156, "phi", "Latn", } m["btx"] = { "ခါရုဝ် ဗါတာက်", 33012, "btk", "Latn, Batk", } m["bty"] = { "Bobot", 3446788, "poz-cma", "Latn", } m["btz"] = { "Alas-Kluet Batak", 2891042, "btk", "Latn, Batk", } m["bua"] = { "ၜေါအ်ရာဇ်", 33120, "xgn-cen", "Cyrl, Mong, Latn", wikimedia_codes = "bxr", ancestors = "cmg", translit = { Cyrl = "bua-translit", Mong = "Mong-translit", }, override_translit = true, display_text = {Mong = s["Mong-displaytext"]}, entry_name = { Cyrl = {remove_diacritics = c.grave .. c.acute}, Mong = s["Mong-entryname"], }, sort_key = { Cyrl = { from = {"ё", "ө", "ү", "һ"}, to = {"е" .. p[1], "о" .. p[1], "у" .. p[1], "х" .. p[1]} }, }, } m["bub"] = { "Bua", 32928, "alv-bua", "Latn", } m["bud"] = { "Ntcham", 36266, "nic-grm", "Latn", } m["bue"] = { "Beothuk", 56234, nil, "Latn", } m["buf"] = { "Bushoong", 3449964, "bnt-bsh", "Latn", } m["bug"] = { "ၜေါအ်ဂဳနဳ", 33190, "poz-ssw", "Bugi, Latn", } m["buh"] = { "Younuo Bunu", 56299, "hmn", "Latn", } m["bui"] = { "Bongili", 35084, "bnt-ngn", "Latn", } m["buj"] = { "Basa-Gurmana", 6432515, "nic-bas", "Latn", } m["buk"] = { "Bukawa", 35043, "poz-ocw", "Latn", } m["bum"] = { "Bulu (Cameroon)", 35028, "bnt-btb", "Latn", } m["bun"] = { "Sherbro", 36339, "alv-mel", "Latn", } m["buo"] = { "Terei", 56831, "paa-sbo", "Latn", } m["bup"] = { "Busoa", 5002001, "poz", "Latn", } m["buq"] = { "ဗရာံ", 4960502, "ngf", "Latn", } m["bus"] = { "Bokobaru", 9228931, "dmn-bbu", "Latn", } m["but"] = { "Bungain", 3450623, "qfa-tor", "Latn", } m["buu"] = { "Budu", 3450207, "bnt-nya", "Latn", } m["buv"] = { "Bun", 56351, "paa-yua", "Latn", } m["buw"] = { "Bubi", 35017, "bnt-tso", "Latn", } m["bux"] = { "Boghom", 3440412, "cdc-wst", "Latn", } m["buy"] = { "Mmani", 35061, "alv-mel", "Latn", } m["bva"] = { "Barein", 56285, "cdc-est", "Latn", } m["bvb"] = { "Bube", 35110, "nic-bds", "Latn", } m["bvc"] = { "Baelelea", 2878833, "poz-sls", "Latn", } m["bvd"] = { "Baeggu", 2878850, "poz-sls", "Latn", } m["bve"] = { "မလေဝ် ဗဳရဴ", 3915770, "poz-mly", "Latn", } m["bvf"] = { "Boor", 56250, "cdc-est", "Latn", } m["bvg"] = { "Bonkeng", 34958, "bnt-bbo", "Latn", } m["bvh"] = { "Bure", 56294, "cdc-wst", "Latn", } m["bvi"] = { "Belanda Viri", 35247, "nic-ser", "Latn", } m["bvj"] = { "Baan", 3515067, "nic-ogo", "Latn", } m["bvk"] = { "ဗူကာတ်", 4986814, "poz-bnn", "Latn", } m["bvl"] = { "Bolivian Sign Language", 1783590, "sgn", "Latn", -- when documented } m["bvm"] = { "Bamunka", 34882, "nic-rnn", "Latn", } m["bvn"] = { "Buna", 3450516, "qfa-tor", "Latn", } m["bvo"] = { "Bolgo", 35038, "alv-bua", "Latn", } m["bvp"] = { "Bumang", 4997235, "mkh-pal", } m["bvq"] = { "Birri", 56514, "csu-bkr", "Latn", } m["bvr"] = { "Burarra", 4998124, "aus-arn", "Latn", } m["bvt"] = { "Bati (Indonesia)", 4869253, "poz-cma", "Latn", } m["bvu"] = { "Bukit Malay", 9230148, "poz-mly", "Latn", } m["bvv"] = { "Baniva", 3515198, "awd", "Latn", } m["bvw"] = { "Boga", 56262, "cdc-cbm", "Latn", } m["bvx"] = { "ဗါဗဝ်လေဝ်", 35180, "bnt-ngn", "Latn", } m["bvy"] = { "Baybayanon", 16839275, "phi", "Latn", } m["bvz"] = { "Bauzi", 56360, "paa-egb", "Latn", } m["bwa"] = { "Bwatoo", 9232446, "poz-cln", "Latn", } m["bwb"] = { "Namosi-Naitasiri-Serua", 3130290, "poz-pcc", "Latn", } m["bwc"] = { "Bwile", 3447440, "bnt-sbi", "Latn", } m["bwd"] = { "Bwaidoka", 2929111, "poz-ocw", "Latn", } m["bwe"] = { "ကရေၚ်ပို", 56994, "kar", } m["bwf"] = { "Boselewa", 4947229, "poz-ocw", "Latn", } m["bwg"] = { "Barwe", 8826802, "bnt-sna", "Latn", } m["bwh"] = { "Bishuo", 34973, "nic-fru", "Latn", } m["bwi"] = { "Baniwa", 3501735, "awd-nwk", "Latn", } m["bwj"] = { "Láá Láá Bwamu", 11017275, "nic-bwa", "Latn", } m["bwk"] = { "Bauwaki", 4873607, "ngf", "Latn", } m["bwl"] = { "Bwela", 5003678, "bnt-bun", "Latn", } m["bwm"] = { "Biwat", 56352, "paa-yua", "Latn", } m["bwn"] = { "Wunai Bunu", 56452, "hmn", } m["bwo"] = { "Shinasha", 56260, "omv-gon", "Latn", } m["bwp"] = { "Mandobo Bawah", 12636155, "ngf", "Latn", } m["bwq"] = { "Southern Bobo", 11001714, "dmn-snb", "Latn", } m["bwr"] = { "Bura", 56552, "cdc-cbm", "Latn", } m["bws"] = { "Bomboma", 9229429, "bnt-bun", "Latn", } m["bwt"] = { "Bafaw", 34853, "bnt-bbo", "Latn", } m["bwu"] = { "Buli (Ghana)", 35085, "nic-buk", "Latn", } m["bww"] = { "Bwa", 3515058, "bnt-bta", "Latn", } m["bwx"] = { "Bu-Nao Bunu", 56411, "hmn", "Latn", } m["bwy"] = { "Cwi Bwamu", 11150714, "nic-bwa", "Latn", } m["bwz"] = { "Bwisi", 35067, "bnt-sir", "Latn", } m["bxa"] = { "Bauro", 2892068, "poz-sls", "Latn", } m["bxb"] = { "Belanda Bor", 56678, "sdv-lon", "Latn", } m["bxc"] = { "Molengue", 13345, "bnt-kel", "Latn", } m["bxd"] = { "Pela", 57000, "tbq-brm", } m["bxe"] = { "Ongota", 36344, nil, "Latn", } m["bxf"] = { "Bilur", 2903788, "poz-ocw", "Latn", } m["bxg"] = { "Bangala", 34989, "bnt-bmo", "Latn", } m["bxh"] = { "Buhutu", 4986329, "poz-ocw", "Latn", } m["bxi"] = { "Pirlatapa", 10632195, "aus-kar", "Latn", } m["bxj"] = { "Bayungu", 10427485, "aus-psw", "Latn", } m["bxk"] = { "Bukusu", 32930, "bnt-msl", "Latn", } m["bxl"] = { "Jalkunan", 11009787, "dmn-jje", "Latn", } m["bxn"] = { "Burduna", 4998313, "aus-psw", "Latn", } m["bxo"] = { "Barikanchi", 3450802, "crp", "Latn", ancestors = "ha", } m["bxp"] = { "Bebil", 34941, "bnt-btb", "Latn", } m["bxq"] = { "Beele", 56238, "cdc-wst", "Latn", } m["bxs"] = { "Busam", 35189, "nic-grs", "Latn", } m["bxv"] = { "Berakou", 56796, "csu-bgr", "Latn", } m["bxw"] = { "Banka", 3438402, "dmn-smg", "Latn", } m["bxz"] = { "Binahari", 4913840, "ngf", "Latn", } m["bya"] = { "Palawan Batak", 3450443, "phi", "Tagb", } m["byb"] = { "Bikya", 33257, "nic-fru", "Latn", } m["byc"] = { "Ubaghara", 36625, "nic-ucn", "Latn", } m["byd"] = { "Benyadu'", 11173588, "day", "Latn", } m["bye"] = { "Pouye", 7235814, "paa-spk", "Latn", } m["byf"] = { "Bete", 32932, "nic-ykb", "Latn", } m["byg"] = { "Baygo", 56836, "sdv-daj", "Latn", } m["byh"] = { "Bujhyal", 56317, "sit-gma", "Deva", } m["byi"] = { "Buyu", 5003401, "bnt-nyb", "Latn", } m["byj"] = { "Binawa", 4913807, "nic-kau", "Latn", } m["byk"] = { "Biao", 4902547, "qfa-tak", "Latn", -- also Hani? } m["byl"] = { "Bayono", 3503856, "ngf", "Latn", } m["bym"] = { "Bidyara", 8842355, "aus-pam", "Latn", } m["byn"] = { "ဗလေန်", 56491, "cus-cen", "Ethi, Latn", translit = {Ethi = "Ethi-translit"}, } m["byo"] = { "ဗဳယျဝ်", 56848, "tbq-bka", "Latn, Hani", sort_key = {Hani = "Hani-sortkey"}, } m["byp"] = { "Bumaji", 4997234, "nic-ben", "Latn", } m["byq"] = { "ဗါသျေ", 716647, "map", "Latn", } m["byr"] = { "Baruya", 3450812, "ngf", "Latn", } m["bys"] = { "Burak", 4998097, "alv-bwj", "Latn", } m["byt"] = { "Berti", 35008, "ssa-sah", "Latn", } m["byv"] = { "Medumba", 36019, "bai", "Latn", } m["byw"] = { "Belhariya", 32961, "sit-kie", "Deva", } m["byx"] = { "Qaqet", 3503009, "paa-bng", "Latn", } m["byz"] = { "Banaro", 56858, "paa", "Latn", } m["bza"] = { "Bandi", 34912, "dmn-msw", "Latn", } m["bzb"] = { "Andio", 4754487, "poz-slb", "Latn", } m["bzd"] = { "Bribri", 28400, "cba", "Latn", } m["bze"] = { "Jenaama Bozo", 10950633, "dmn-snb", "Latn", } m["bzf"] = { "Boikin", 56829, "paa-spk", "Latn", } m["bzg"] = { "ဗါၜေအ်ဇြာ", 716615, "map", } m["bzh"] = { "Mapos Buang", 2927370, "poz-ocw", "Latn", } m["bzi"] = { "ဗဳသူ", 56852, "tbq-bis", "Latn, Thai", sort_key = {Thai = "Thai-sortkey"}, } m["bzj"] = { "ဗဳလဳဇေန်ခရဳအဝ်လ် ", 1363055, "crp", "Latn", ancestors = "en", } m["bzk"] = { "Nicaraguan Creole", 3504097, "crp", "Latn", ancestors = "en", } m["bzl"] = { -- supposedly also called "Bolano", but I can find no evidence of that "Boano (Sulawesi)", 4931258, "poz", "Latn", } m["bzm"] = { "Bolondo", 35071, "bnt-bun", "Latn", } m["bzn"] = { "Boano (Maluku)", 4931255, "poz-cma", "Latn", } m["bzo"] = { "Bozaba", 4952785, "bnt-ngn", "Latn", } m["bzp"] = { "Kemberano", 12634399, "ngf-sbh", "Latn", } m["bzq"] = { "ၜူလဳ (အိန်ဒဝ်နဳယျာ)", 2927952, "poz-hce", "Latn", } m["bzr"] = { "Biri", 4087011, "aus-pam", "Latn", } m["bzs"] = { "Brazilian Sign Language", 3436689, "sgn", "Latn", } m["bzu"] = { "Burmeso", 56746, "paa-wpa", "Latn", } m["bzv"] = { "Bebe", 34977, "nic-bbe", "Latn", } m["bzw"] = { "Basa", 34898, "nic-bas", "Latn", } m["bzx"] = { "Hainyaxo Bozo", 11159536, "dmn-snb", "Latn", } m["bzy"] = { "Obanliku", 36276, "nic-ben", "Latn", } m["bzz"] = { "Evant", 35259, "nic-tvc", "Latn", } return require("Module:languages").finalizeData(m, "language") hbmp2n3iaaknadvuw7uvre6i4ef1f5o ထာမ်ပလိက်:alt of 10 1059 402150 158569 2026-09-28T11:15:44Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ထာမ်ပလိက်:alt form of]] ဇရေင် [[ထာမ်ပလိက်:alt of]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 158569 wikitext text/x-wiki {{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|<!-- -->{{#invoke:form of/templates|form_of_t|{{#invoke:labels/templates/show_from|show_from|default=ဗီုဝေါဟာတၞဟ်}}မဆေၚ်ကဵု|withcap=1|ignore=from:list,nocat}}<!-- -->}}<!-- --><noinclude>{{documentation}}</noinclude> 066ex95el0x0m5h3lcsh3eekn8hewdf 402151 402150 2026-09-28T11:16:20Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ထာမ်ပလိက်:alt of]] ဇရေင် [[ထာမ်ပလိက်:alt form of]]: Revert 158569 wikitext text/x-wiki {{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|<!-- -->{{#invoke:form of/templates|form_of_t|{{#invoke:labels/templates/show_from|show_from|default=ဗီုဝေါဟာတၞဟ်}}မဆေၚ်ကဵု|withcap=1|ignore=from:list,nocat}}<!-- -->}}<!-- --><noinclude>{{documentation}}</noinclude> 066ex95el0x0m5h3lcsh3eekn8hewdf 402153 402151 2026-09-28T11:16:41Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ထာမ်ပလိက်:alt form of]] ဇရေင် [[ထာမ်ပလိက်:alt of]] နကု မကလေင်ပညုင် 158569 wikitext text/x-wiki {{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|<!-- -->{{#invoke:form of/templates|form_of_t|{{#invoke:labels/templates/show_from|show_from|default=ဗီုဝေါဟာတၞဟ်}}မဆေၚ်ကဵု|withcap=1|ignore=from:list,nocat}}<!-- -->}}<!-- --><noinclude>{{documentation}}</noinclude> 066ex95el0x0m5h3lcsh3eekn8hewdf ထာမ်ပလိက်:apoc of 10 30499 402145 383864 2026-09-28T11:05:40Z 咽頭べさ 33 402145 wikitext text/x-wiki {{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|<!-- -->{{#invoke:form of/templates|form_of_t|ဗီုပြၚ်ကုတ်ထပိုတ်မအရေဝ်လက္ကရဴနကဵုဝေါဟာ |withencap=1|cat=}}<!-- -->}}<!-- --><noinclude>{{documentation}}</noinclude> pqrijfzxjzlq8scuj9ix9g2owyftsx6 ထာမ်ပလိက်:ga-mut-link/documentation 10 70074 402141 92138 2026-09-28T10:57:06Z 咽頭べさ 33 402141 wikitext text/x-wiki {{documentation subpage}} <!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --> ===Usage=== This template creates a shortcut to the various sections of [[Appendix:Irish mutations]]. Use: <nowiki>{{ga-mut-link|l}}</nowiki> to link to the Lenition section <nowiki>{{ga-mut-link|e}}</nowiki> to link to the Eclipsis section <nowiki>{{ga-mut-link|t}}</nowiki> to link to the T-prothesis section <nowiki>{{ga-mut-link|h}}</nowiki> to link to the H-prothesis section <includeonly> <!-- CATEGORIES AND INTERWIKIS HERE, THANKS --> [[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်ပရေၚ်ပြံၚ်လှာဲဗဳဇဂကူဂမၠိုၚ်]] </includeonly> jsf4nlh80u2s3bkp3dy8aujtk7qi5lu ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်ပရေၚ်ပြံၚ်လှာဲဗဳဇဂကူဂမၠိုၚ် 14 70075 402142 163077 2026-09-28T10:58:01Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်ပရေၚ်မပြံၚ်သၠာဲမာန်ဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်ပရေၚ်ပြံၚ်လှာဲဗဳဇဂကူဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 163077 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်ဂမၠိုၚ်]] qy3ztpqtroxi43enzmc8ppj1epwpgkw 402143 402142 2026-09-28T10:58:27Z 咽頭べさ 33 402143 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်ဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်ပရေၚ်ပြံၚ်လှာဲဗဳဇဂကူဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]] ojc33lcp4lldo0hwwdot52ntk0r2uvl ကဏ္ဍ:ကြိယာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်ဂမၠိုၚ် 14 70755 402089 290770 2026-09-27T15:32:44Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:ကြိယာ အေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်]] ဇရေင် [[ကဏ္ဍ:ကြိယာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်ဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 290770 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်|အေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်]] » [[:ကဏ္ဍ:ဝေါဟာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်နွံပ္ဍဲအဘိဓာန်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''ကြိယာဂမၠိုၚ်''' :ဝေါဟာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်ပွမယဵုဒုၚ်မစၞောန်ထ္ၜးအတေံ၊ မက္တဵုဒှ်ပရောဟိုတ် ဝါ ကဆံၚ်ဒတန်ဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်]][[ကဏ္ဍ:ကြိယာဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]] 7l845yyhw5jusi2uc5y8frukqg4lu9c ကဏ္ဍ:ဝေါဟာအဓိကအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်ဂမၠိုၚ် 14 70757 402090 275787 2026-09-27T15:33:36Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:ဝေါဟာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်နွံပ္ဍဲအဘိဓာန်ဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:ဝေါဟာအဓိကအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်ဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 275787 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်|အေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်]] » '''ဝေါဟာတံသ္ဇိုၚ်ဂမၠိုၚ်''' :ဝေါဟာတံသ္ဇိုၚ်ဘာသာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်၊ ကဏ္ဍနူကဵုမပါ်ပရံဒကုတ်မဆေၚ်စပ်ကဵုမအရေဝ်ဝေါဟာ။ [[ကဏ္ဍ:ဘာသာအေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်]][[ကဏ္ဍ:ဝေါဟာအဓိကဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]] br2id64td8rza0f2qyvm07xmo8t3be5 ကဏ္ဍ:နာမ်နူဇြေတ်ခ်ဂမၠိုၚ် 14 70762 402093 167024 2026-09-27T16:18:47Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:နာမ်ဘေတ်လာ ခဝ်လာဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:နာမ်နူဇြေတ်ခ်ဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 163792 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဘေတ်လာ ခဝ်လာ|ဘေတ်လာ ခဝ်လာ]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကဘေတ်လာ ခဝ်လာဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''နာမ်ဂမၠိုၚ်''' :ဝေါဟာဘေတ်လာ ခဝ်လာပွမစၞောန်ထ္ၜးပူဂဵုအတေံ၊ မက္တဵုဒှ်ဂမၠိုၚ်၊ ဌာန်ဒတန်ဂမၠိုၚ်၊ ဥပပါတ်ဂမၠိုၚ်၊ ကဆံၚ်ဂုန်သတ္တိ ဝါ ကိုန်စဳရေၚ်ဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာဘေတ်လာ ခဝ်လာ]][[ကဏ္ဍ:နာမ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဘ]] 68wuwqps6vmc6lsxrz81j4fc94n9ab5 402094 402093 2026-09-27T16:19:34Z 咽頭べさ 33 402094 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာနူဇြေတ်ခ်|နူဇြေတ်ခ်]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကနူဇြေတ်ခ်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''နာမ်ဂမၠိုၚ်''' :ဝေါဟာဘေတ်လာ ခဝ်လာပွမစၞောန်ထ္ၜးပူဂဵုအတေံ၊ မက္တဵုဒှ်ဂမၠိုၚ်၊ ဌာန်ဒတန်ဂမၠိုၚ်၊ ဥပပါတ်ဂမၠိုၚ်၊ ကဆံၚ်ဂုန်သတ္တိ ဝါ ကိုန်စဳရေၚ်ဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာနူဇြေတ်ခ်]][[ကဏ္ဍ:နာမ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|န]] fz3vhwgwlt6doc6lqyw76s7xd6e8u80 ကဏ္ဍ:ဘာသာနူဇြေတ်ခ် 14 70763 402097 93173 2026-09-27T16:21:17Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:ဘာသာဘေတ်လာ ခဝ်လာ]] ဇရေင် [[ကဏ္ဍ:ဘာသာနူဇြေတ်ခ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 93173 wikitext text/x-wiki [[ကဏ္ဍ:အရေဝ်ဘာသာ|ဘ]] 2rmqwtt3rwf8n2r0fp4hn5rwpkagzzr 402098 402097 2026-09-27T16:22:02Z 咽頭べさ 33 402098 wikitext text/x-wiki [[ကဏ္ဍ:အရေဝ်ဘာသာ|န]][[ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|န]] afxekbu9mku1p9pv3yuwj0w8rjiwoh5 ကဏ္ဍ:ဝေါဟာအဓိကနူဇြေတ်ခ်ဂမၠိုၚ် 14 70765 402095 275506 2026-09-27T16:20:08Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:ဝေါဟာအဓိကဘေတ်လာ ခဝ်လာဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:ဝေါဟာအဓိကနူဇြေတ်ခ်ဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 275506 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဘေတ်လာ ခဝ်လာ|ဘေတ်လာ ခဝ်လာ]] » '''ဝေါဟာတံသ္ဇိုၚ်ဂမၠိုၚ်''' :ဝေါဟာတံသ္ဇိုၚ်ဘာသာဘေတ်လာ ခဝ်လာ၊ ကဏ္ဍနူကဵုမပါ်ပရံဒကုတ်မဆေၚ်စပ်ကဵုမအရေဝ်ဝေါဟာ။ [[ကဏ္ဍ:ဘာသာဘေတ်လာ ခဝ်လာ]][[ကဏ္ဍ:ဝေါဟာအဓိကဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဘ]] pf9p0i9cg4jsop46sldi5h8yde4apeb 402096 402095 2026-09-27T16:20:50Z 咽頭べさ 33 402096 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာနူဇြေတ်ခ်|နူဇြေတ်ခ်]] » '''ဝေါဟာတံသ္ဇိုၚ်ဂမၠိုၚ်''' :ဝေါဟာတံသ္ဇိုၚ်ဘာသာနူဇြေတ်ခ်၊ ကဏ္ဍနူကဵုမပါ်ပရံဒကုတ်မဆေၚ်စပ်ကဵုမအရေဝ်ဝေါဟာ။ [[ကဏ္ဍ:ဘာသာနူဇြေတ်ခ်]][[ကဏ္ဍ:ဝေါဟာအဓိကဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|န]] 7hrowefv765i0sdtmgm7qq74ei3glhi ကဏ္ဍ:နာမ်ဇြတ်ဇြဳလ်ဂမၠိုၚ် 14 75681 402104 385345 2026-09-27T16:50:19Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:နာမ်သအ်သေန်ဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:နာမ်ဇြတ်ဇြဳလ်ဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 385345 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာသအ်သေန်|သအ်သေန်]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကသအ်သေန်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''နာမ်ဂမၠိုၚ်''' :ဝေါဟာသအ်သေန်ပွမစၞောန်ထ္ၜးပူဂဵုအတေံ၊ မက္တဵုဒှ်ဂမၠိုၚ်၊ ဌာန်ဒတန်ဂမၠိုၚ်၊ ဥပပါတ်ဂမၠိုၚ်၊ ကဆံၚ်ဂုန်သတ္တိ ဝါ ကိုန်စဳရေၚ်ဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာသအ်သေန်]][[ကဏ္ဍ:နာမ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|သ]] fb2hn3msjnpqzizhzuqe18v5p8l3wtp 402105 402104 2026-09-27T16:50:59Z 咽頭べさ 33 402105 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာသဇြတ်ဇြဳလ်|ဇြတ်ဇြဳလ်]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကဇြတ်ဇြဳလ်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''နာမ်ဂမၠိုၚ်''' :ဝေါဟာသအ်သေန်ပွမစၞောန်ထ္ၜးပူဂဵုအတေံ၊ မက္တဵုဒှ်ဂမၠိုၚ်၊ ဌာန်ဒတန်ဂမၠိုၚ်၊ ဥပပါတ်ဂမၠိုၚ်၊ ကဆံၚ်ဂုန်သတ္တိ ဝါ ကိုန်စဳရေၚ်ဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်]][[ကဏ္ဍ:နာမ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဇ]] jxw562wpetabm99lpdu29fu784u59tc 402106 402105 2026-09-27T16:51:21Z 咽頭べさ 33 402106 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာသဇြတ်ဇြဳလ်|ဇြတ်ဇြဳလ်]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကဇြတ်ဇြဳလ်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''နာမ်ဂမၠိုၚ်''' :ဝေါဟာဇြတ်ဇြဳလ်ပွမစၞောန်ထ္ၜးပူဂဵုအတေံ၊ မက္တဵုဒှ်ဂမၠိုၚ်၊ ဌာန်ဒတန်ဂမၠိုၚ်၊ ဥပပါတ်ဂမၠိုၚ်၊ ကဆံၚ်ဂုန်သတ္တိ ဝါ ကိုန်စဳရေၚ်ဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်]][[ကဏ္ဍ:နာမ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဇ]] dwozpmn7twz01ovrnhrx8asn8kfg55m ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ် 14 75682 402113 99149 2026-09-28T09:16:32Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:ဘာသာသအ်သေန်]] ဇရေင် [[ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 99149 wikitext text/x-wiki [[ကဏ္ဍ:အရေဝ်ဘာသာ|သ]] 35dqc0d9vhcsx18tf4xyf68t42cg8qz 402114 402113 2026-09-28T09:17:12Z 咽頭べさ 33 402114 wikitext text/x-wiki [[ကဏ္ဍ:အရေဝ်ဘာသာ|ဇ]][[ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|ဇ]] 0062mzmgvoq5gxyj0mlir55m7labb7v ကဏ္ဍ:ဝေါဟာအဓိကဇြတ်ဇြဳလ်ဂမၠိုၚ် 14 75683 402109 385339 2026-09-28T09:13:37Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:ဝေါဟာအဓိကသအ်သေန်ဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:ဝေါဟာအဓိကဇြတ်ဇြဳလ်ဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 275240 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာသအ်သေန်|သအ်သေန်]] » '''ဝေါဟာတံသ္ဇိုၚ်ဂမၠိုၚ်''' :ဝေါဟာတံသ္ဇိုၚ်ဘာသာသအ်သေန်၊ ကဏ္ဍနူကဵုမပါ်ပရံဒကုတ်မဆေၚ်စပ်ကဵုမအရေဝ်ဝေါဟာ။ [[ကဏ္ဍ:ဘာသာသအ်သေန်]][[ကဏ္ဍ:ဝေါဟာအဓိကဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|သ]] 779miesuwyvjf1qnci7mkntqrijiqbn 402110 402109 2026-09-28T09:14:21Z 咽頭べさ 33 402110 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်|ဇြတ်ဇြဳလ်]] » '''ဝေါဟာတံသ္ဇိုၚ်ဂမၠိုၚ်''' :ဝေါဟာတံသ္ဇိုၚ်ဘာသာဇြတ်ဇြဳလ်၊ ကဏ္ဍနူကဵုမပါ်ပရံဒကုတ်မဆေၚ်စပ်ကဵုမအရေဝ်ဝေါဟာ။ [[ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်]][[ကဏ္ဍ:ဝေါဟာအဓိကဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဇ]] naxrkweudbwa7mwcd8nb1nzhc7vanh6 ကဏ္ဍ:ဝေါဟာဇြတ်ဇြဳလ်ပ္တိတ်ရမျာၚ် IPA ဂမၠိုၚ် 14 75684 402107 275241 2026-09-27T16:51:57Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:ဝေါဟာသအ်သေန်ပ္တိတ်ရမျာၚ် IPA ဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:ဝေါဟာဇြတ်ဇြဳလ်ပ္တိတ်ရမျာၚ် IPA ဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 275241 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာသအ်သေန်|သအ်သေန်]] » '''{{PAGENAME}}''' :ဝေါဟာသအ်သေန်လုပ်အဝေါၚ်မဆေၚ်စပ်မပတိတ်ရမျာၚ်ပ္ဍဲနကဵုဗီုပြၚ် IPA။ [[ကဏ္ဍ:ဘာသာသအ်သေန်]][[ကဏ္ဍ:ဝေါဟာမနွံကဵုမပတိတ်ရမျာၚ် IPA ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|သ]] 87c0sl2q8t27u038h7y23p6ydqcwwtn 402108 402107 2026-09-27T16:52:36Z 咽頭べさ 33 402108 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်|ဇြတ်ဇြဳလ်]] » '''{{PAGENAME}}''' :ဝေါဟာဇြတ်ဇြဳလ်လုပ်အဝေါၚ်မဆေၚ်စပ်မပတိတ်ရမျာၚ်ပ္ဍဲနကဵုဗီုပြၚ် IPA။ [[ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်]][[ကဏ္ဍ:ဝေါဟာမနွံကဵုမပတိတ်ရမျာၚ် IPA ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဇ]] 5np87vvkgrvpaxuhphljtxdcsf07cs1 ကဏ္ဍ:ကြိယာဇြတ်ဇြဳလ်ဂမၠိုၚ် 14 75686 402100 385341 2026-09-27T16:47:54Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:ကြိယာသအ်သေန်ဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:ကြိယာဇြတ်ဇြဳလ်ဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 385341 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာသအ်သေန်|သအ်သေန်]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကသအ်သေန်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''ကြိယာဂမၠိုၚ်''' :ဝေါဟာသအ်သေန်ပွမယဵုဒုၚ်မစၞောန်ထ္ၜးအတေံ၊ မက္တဵုဒှ်ပရောဟိုတ် ဝါ ကဆံၚ်ဒတန်ဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာသအ်သေန်]][[ကဏ္ဍ:ကြိယာဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|သ]] iy5w2ufraq0xum8z2jdir12wx6gc15a 402101 402100 2026-09-27T16:48:37Z 咽頭べさ 33 402101 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်|ဇြတ်ဇြဳလ်]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကဇြတ်ဇြဳလ်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''ကြိယာဂမၠိုၚ်''' :ဝေါဟာသအ်သေန်ပွမယဵုဒုၚ်မစၞောန်ထ္ၜးအတေံ၊ မက္တဵုဒှ်ပရောဟိုတ် ဝါ ကဆံၚ်ဒတန်ဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်]][[ကဏ္ဍ:ကြိယာဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဇ]] p1b8abicgxf42crvr4fqhmku2whkrah ကဏ္ဍ:သုၚ်စောဲဝေါဟာဇြတ်ဇြဳလ်ထ္ၜးဥပမာဂမၠိုၚ် 14 75687 402111 178002 2026-09-28T09:15:13Z 咽頭べさ 33 402111 wikitext text/x-wiki [[ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်]] gu7x8qh30pvkktj4h9nund4abnt3753 402112 402111 2026-09-28T09:15:58Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:သုၚ်စောဲဝေါဟာသအ်သေန်ထ္ၜးဥပမာဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:သုၚ်စောဲဝေါဟာဇြတ်ဇြဳလ်ထ္ၜးဥပမာဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 402111 wikitext text/x-wiki [[ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်]] gu7x8qh30pvkktj4h9nund4abnt3753 ကဏ္ဍ:နာမဝိသေသနဇြတ်ဇြဳလ်ဂမၠိုၚ် 14 75690 402102 385343 2026-09-27T16:49:08Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ကဏ္ဍ:နာမဝိသေသနသအ်သေန်ဂမၠိုၚ်]] ဇရေင် [[ကဏ္ဍ:နာမဝိသေသနဇြတ်ဇြဳလ်ဂမၠိုၚ်]] သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင် 385343 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာသအ်သေန်|သအ်သေန်]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကသအ်သေန်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''နာမဝိသေသနဂမၠိုၚ်''' :ဝေါဟာသအ်သေန်မဒုၚ်ကေတ်အၚ်္ဂအဝဲဂုန်နကဵုနာမ်ဂမၠိုၚ်၊ မဒုၚ်ကဵုကေတ်အဓိပ္ပာဲအတေံဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာသအ်သေန်]][[ကဏ္ဍ:နာမဝိသေသနဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|သ]] q3kzx0sj4rbxta4ecrdx9ceo377xy92 402103 402102 2026-09-27T16:49:47Z 咽頭べさ 33 402103 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်|ဇြတ်ဇြဳလ်]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကဇြတ်ဇြဳလ်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''နာမဝိသေသနဂမၠိုၚ်''' :ဝေါဟာသအ်သေန်မဒုၚ်ကေတ်အၚ်္ဂအဝဲဂုန်နကဵုနာမ်ဂမၠိုၚ်၊ မဒုၚ်ကဵုကေတ်အဓိပ္ပာဲအတေံဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာဇြတ်ဇြဳလ်]][[ကဏ္ဍ:နာမဝိသေသနဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဇ]] ke1sn2zt9gli2f2wstjwl8b6i43b7ip မဝ်ဂျူ:is-common 828 119765 402134 393767 2026-09-28T10:23:33Z 咽頭べさ 33 402134 Scribunto text/plain local export = {} local string_char_module = "Module:string/char" local string_pattern_escape_module = "Module:string/patternEscape" local string_replacement_escape_module = "Module:string/replacementEscape" local inflection_utilities_module = "Module:inflection utilities" local dump = mw.dumpObject local rmatch = mw.ustring.match local rsubn = mw.ustring.gsub local usub = mw.ustring.sub local uupper = mw.ustring.upper local function pattern_escape(...) pattern_escape = require(string_pattern_escape_module) return pattern_escape(...) end local function replacement_escape(...) replacement_escape = require(string_replacement_escape_module) return replacement_escape(...) end local function u(...) u = require(string_char_module) return u(...) end -- Capitalize the first letter. local function ucap(str) local first, rest = rmatch(str, "^(.)(.*)$") if first then return uupper(first) .. rest end return str end -- version of rsubn() that discards all but the first return value local function rsub(term, foo, bar) local retval = rsubn(term, foo, bar) return retval end local function track(track_id) require("Module:debug/track")("is-common/" .. track_id) return true end local AU_SUB = u(0xFFF0) -- temporary substitution for 'au' local CAP_AU_SUB = u(0xFFF1) -- temporary substitution for 'Au' local ALL_CAP_AU_SUB = u(0xFFF2) -- temporary substitution for 'AU' local EY_SUB = u(0xFFF3) -- temporary substitution for 'ey' local CAP_EY_SUB = u(0xFFF4) -- temporary substitution for 'Ey' local ALL_CAP_EY_SUB = u(0xFFF5) -- temporary substitution for 'EY' local UR_SUB = u(0xFFF6) -- temporary substitution for final 'ur'; should be treated as consonant local lc_vowel = "aeiouyáéíóúýöæ" local uc_vowel = uupper(lc_vowel) export.vowel = lc_vowel .. uc_vowel .. AU_SUB .. CAP_AU_SUB .. ALL_CAP_AU_SUB export.vowel_c = "[" .. export.vowel .. "]" export.vowel_or_hyphen = export.vowel .. "%-" export.vowel_or_hyphen_c = "[" .. export.vowel_or_hyphen .. "]" export.non_vowel_c = "[^" .. export.vowel .. "]" export.cons_c = "[^" .. export.vowel .. "]" local V = export.vowel_c local C = export.cons_c export.umut_types = {"umut", "Umut", "uumut", "uUmut", "uUUmut", "u_mut"} export.unumut_types = {} for _, umut_type in ipairs(export.umut_types) do table.insert(export.unumut_types, "un" .. umut_type) end -- Maybe replace -au-, -ey- and/or final -ur with special characters so they won't get substituted. If `apply_au_sub`, -- substitute -au-. If `apply_ey_sub`, substitute -ey-. If `apply_ur_sub`, substitute final -ur. Use undo_au_ey_ur_sub() -- to reverse the substitution(s). local function apply_au_ey_ur_sub(stem, apply_au_sub, apply_ey_sub, apply_ur_sub) if apply_au_sub then -- au doesn't u-mutate, while u does; easiest way to handle this is to temporarily convert au and variants to single -- characters stem = stem:gsub("au", AU_SUB) :gsub("Au", CAP_AU_SUB) :gsub("AU", ALL_CAP_AU_SUB) end if apply_ey_sub then -- ey doesn't reverse i-mutate, while y does; u-mutate; easiest way to handle this is to temporarily convert ey and -- variants to single characters stem = stem:gsub("ey", EY_SUB) :gsub("Ey", CAP_EY_SUB) :gsub("EY", ALL_CAP_EY_SUB) end if apply_ur_sub then -- There must be at least one vowel to treat -ur as a suffix, or we must be dealing with the suffix [[-ur]] itself; -- lemmas like [[bur]] don't count. stem = (rsub(stem, "^(.*" ..export.vowel_or_hyphen_c .. ".*)ur$", "%1" .. UR_SUB)) end return stem end local function undo_au_ey_ur_sub(stem) return (stem:gsub(UR_SUB, "ur") :gsub(EY_SUB, "ey") :gsub(CAP_EY_SUB, "Ey") :gsub(ALL_CAP_EY_SUB, "EY") :gsub(AU_SUB, "au") :gsub(CAP_AU_SUB, "Au") :gsub(ALL_CAP_AU_SUB, "AU") ) end local lc_i_mutation = { ["a"] = "e", -- [[dagur]] "dat" -> dat sg [[degi]]; [[faðir]] "father" -> nom pl [[feður]]; [[maður]] "man" -> nom -- pl [[menn]]; [[taka]] "to take" -> 1sg pres ind [[tek]]; [[langur]] "long" -> [[lengd]] "length" ["á"] = "æ", -- [[háttur]] "way, manner" -> nom pl [[hættir]]; [[hár]] "high" -> comp [[hærri]] -- ["e"] = "i", -- I don't think there are any instances of this in inflections and it's wrong for strong verbs ["o"] = "e", -- [[hnot]] "nut; small ball of yarn" -> nom pl [[hnetur]]; [[koma]] "to come" -> 1sg pres ind [[kem]] -- ["o"] = "y", -- [[sonur]] "son" -> nom pl [[synir]]; in the subjunctive of several verbs; needs explicit vowel ["ö"] = "e", -- [[mölur]] "clothes moth" -> nom pl [[melir]]; [[köttur]] "cat" -> nom pl [[kettir]]; [[slökkva]] -- "to extinguish" -> 1sg pres ind [[slekk]]; [[dökkur]] "dark" -> comp [[dekkri]] ["ó"] = "æ", -- [[bók]] "book" -> nom pl [[bækur]]; [[stór]] "big" -> comp [[stærri]]; [[dómur]] "judgement" -> -- [[dæmdur]] "judged" ["u"] = "y", -- [[fullur]] "full" -> comp [[fyllri]]; [[þungur]] "heavy/weighty" -> [[þyngd]] "weight" ["ú"] = "ý", -- [[mús]] "mouse" -> nom pl [[mýs]]; [[brú]] "bridge" -> nom pl [[brýr]]; [[búa]] "to reside" -> -- 1sg pres ind [[bý]]; [[hús]] "house" -> [[hýsa]] "to house" ["ja"] = "i", -- un-u-mutated version of jö; occurs in a logical sense in several nouns -- ["ja"] = "e", -- [[gjalda]] -> 1sg pres ind [[geld]], [[gjalla]] -> 1sg pres ind [[gell]], [[bjarga]] -> archaic -- 1sg pres ind [[berg]]; need overrides -- ["já"] = "jæ", -- [[ljá]], [[tjá]] -> 1sg pres ind [[ljæ]], [[tjæ]]; this is automatic, hence not needed -- ["já"] = "é", -- [[sjá]] -> 1sg pres ind [[sé]]; irregular, needs explicit form -- ["já"] = "e", -- [[skjálfa]] -> 1sg pres ind [[skelf]]; irregular, needs explicit form ["jö"] = "i", -- [[fjörður]] "fjord" -> dat sg [[firði]], nom pl [[firðir]] -- ["jö"] = "é", -- [[stjölur]] "rump, hind part (obsolete)" -> dat sg [[stéli]], nom pl [[stélir]]; needs explicit -- vowel ["jó"] = "ý", -- [[bjóða]] "to offer" -> 1sg pres ind [[býð]]; [[ljós]] "light" -> [[lýsa]] "to illuminate" -- ["ju"] = "y", -- [[við]] [[bjuggum]] "we lived" -> subjunctive [[við]] [[byggjum]]; in fact, the subjunctive -- of these verbs has either y or jy or both; we should stick with expected jy ["jú"] = "ý", -- [[ljúga]] "to lie" -> 1sg pres ind [[lýg]] ["au"] = "ey", -- [[ausa]] "to dip, to scoop" -> 1sg pres ind [[eys]]; [[aumur]] "wretched" -> [[eymd]] -- "wretchedness" } local i_mutation = {} for k, v in pairs(lc_i_mutation) do i_mutation[k] = v i_mutation[ucap(k)] = ucap(v) end local lc_reverse_i_mutation = { ["æ"] = "á", -- [[hættur]] nom pl "bedtime, quitting time" dat pl [[háttum]]; [[ær]] "ewe" acc/dat sg [[á]] ["e"] = "a", -- [[ketill]] "kettle" dat sg [[katli]]; [[Egill]] (male given name) dat sg [[Agli]]; -- [[telja]] "to count" past ind [[taldi]] -- not i -> e; [[skilja]] "to understand" past ind [[skildi]] ["ý"] = "ú", -- [[kýr]] "cow" acc/dat sg [[kú]]; [[gnýja]] "to storm, to rage" past ind [[gnúði]] ["y"] = "u", -- [[mylja]] "to crush" past ind [[muldi]] -- not ey -> au; [[deyja]] "to die" past ind [[deyði]] } local reverse_i_mutation = {} for k, v in pairs(lc_reverse_i_mutation) do reverse_i_mutation[k] = v reverse_i_mutation[ucap(k)] = ucap(v) end -- Apply i-mutation to the last vowel of `stem`, maybe excluding suffixal -ur. If `newv` is given, use that vowel (for -- cases like [[sonur]] "son" nom pl [[synir]] but [[hnot]] "nut; small ball of yarn" nom pl [[hnetur]]); otherwise use -- the appropriate default vowel. If `exclude_final_ur`, act as if suffixal -ur isn't present and mutate the previous -- vowel. If `error_if_unmatchable`, throw an error if we are unable to mutate the vowel. function export.apply_i_mutation(stem, newv, exclude_final_ur, error_if_unmatchable) if newv then track("i-mutation-newv") end local modstem local function subfunc(origv, post) return (newv or i_mutation[origv] or origv) .. post end stem = apply_au_ey_ur_sub(stem, false, false, exclude_final_ur) modstem = rsub(stem, "([Aa]u)(" .. C .. "*)$", subfunc) if modstem ~= stem then return undo_au_ey_ur_sub(modstem) end modstem = rsub(stem, "([Jj][aáoöóuú])(" .. C .. "*)$", subfunc) if modstem ~= stem then return undo_au_ey_ur_sub(modstem) end modstem = rsub(stem, "([aáoöóuúAÁOÖÓUÚ])(" .. C .. "*)$", subfunc) if modstem ~= stem then return undo_au_ey_ur_sub(modstem) end stem = undo_au_ey_ur_sub(stem) if error_if_unmatchable then error(("Stem '%s' does not contain an i-mutatable vowel as its last vowel"):format(stem)) end return stem end -- Apply reverse i-mutation to the last vowel of `stem`, maybe excluding suffixal -ur. If `newv` is given, use that -- vowel; otherwise use the appropriate default vowel. If `exclude_final_ur`, act as if suffixal -ur isn't present and -- unmutate the previous vowel. If `error_if_unmatchable`, throw an error if we are unable to unmutate the vowel. function export.apply_reverse_i_mutation(stem, newv, exclude_final_ur, error_if_unmatchable) if newv then track("reverse-i-mutation-newv") end local modstem local function subfunc(origv, post) return (newv or reverse_i_mutation[origv] or origv) .. post end stem = apply_au_ey_ur_sub(stem, false, true, exclude_final_ur) -- We need to include -i- even though we don't have a default mapping for it, to allow e.g. for nom pl Vestfirðir -> -- gen pl Vestfjarða. modstem = rsub(stem, "([æeiýyÆEIÝY])(" .. C .. "*)$", subfunc) if modstem ~= stem then return undo_au_ey_ur_sub(modstem) end stem = undo_au_ey_ur_sub(stem) if error_if_unmatchable then error(("Stem '%s' does not contain a reversible i-mutated vowel as its last vowel"):format(stem)) end return stem end local lesser_u_mutation = { ["a"] = "ö", ["A"] = "Ö", } local lesser_reverse_u_mutation = { ["ö"] = "a", ["Ö"] = "A", } local greater_u_mutation = { ["a"] = "u", ["A"] = "U", -- FIXME, may not occur } local greater_reverse_u_mutation = { ["u"] = "a", ["U"] = "A", -- FIXME, may not occur } -- Apply u-mutation to `stem`, maybe excluding suffixal -ur. `typ` is the type of u-mutation: -- * "umut" (mutate the last vowel if possible, with a -> ö); -- * "Umut" (mutate the last vowel if possible, with a -> u); -- * "uumut" (mutate the last two vowels if possible, with a -> ö in the second-to-last and a -> ö in the last); -- * "uUmut" (mutate the last two vowels if possible, with a -> ö in the second-to-last and a -> u in the last); -- * "uUUmut" (mutate the last three vowels if possible, with a -> ö in the third-to-last and a -> u in the last and -- second-to-last; needed in superlatives of past-participle-derived adjectives like [[saltaður]] "salty" -- with superlative [[saltaðastur]] whose nominative feminine singular is [[söltuðust]]); -- * "u_mut" (mutate the second-to-last vowel if possible, with a -> ö, leaving alone the last vowel). -- If `exclude_final_ur`, act as if suffixal -ur isn't present and mutate the previous vowel. -- If `error_if_unmatchable`, throw an error if we are unable to mutate the vowel. function export.apply_u_mutation(stem, typ, exclude_final_ur, error_if_unmatchable) local origstem = stem stem = apply_au_ey_ur_sub(stem, true, false, exclude_final_ur) if typ == "uUUmut" then local first, v1, mid1, v2, mid2, v3, last = rmatch(stem, "^(.*)(" .. V .. ")(" .. C .. "*)(" .. V .. ")(" .. C .. "*)(" .. V .. ")(" .. C .. "*)$") if first then v1 = lesser_u_mutation[v1] or v1 elseif stem:sub(1, 1) ~= "-" then if error_if_unmatchable then error(("Can't apply u-mutation of type '%s' because stem '%s' doesn't have three syllables"): format(typ, origstem)) end return undo_au_ey_ur_sub(stem) else first, v2, mid2, v3, last = rmatch(stem, "^(.*)(" .. V .. ")(" .. C .. "*)(" .. V .. ")(" .. C .. "*)$") if not first then if error_if_unmatchable then error(("Can't apply u-mutation of type '%s' because suffix stem '%s' doesn't have two syllables"): format(typ, origstem)) end return undo_au_ey_ur_sub(stem) end v1 = "" mid1 = "" end v2 = greater_u_mutation[v2] or v2 v3 = greater_u_mutation[v3] or v3 local retval = undo_au_ey_ur_sub(first .. v1 .. mid1 .. v2 .. mid2 .. v3 .. last) if retval == origstem and error_if_unmatchable then error(("Can't apply u-mutation of type '%s' to stem '%s'; result would be the same as the original"): format(typ, origstem)) end return retval end if typ == "uUmut" or typ == "uumut" or typ == "u_mut" then local first, v1, middle, v2, last = rmatch(stem, "^(.*)(" .. V .. ")(" .. C .. "*)(" .. V .. ")(" .. C .. "*)$") if first then v1 = lesser_u_mutation[v1] or v1 elseif stem:sub(1, 1) ~= "-" then if error_if_unmatchable then error(("Can't apply u-mutation of type '%s' because stem '%s' doesn't have two syllables"): format(typ, origstem)) end return undo_au_ey_ur_sub(stem) else first, v2, last = rmatch(stem, "^(.*)(" .. V .. ")(" .. C .. "*)$") if not first then if error_if_unmatchable then error(("Can't apply u-mutation of type '%s' because suffix stem '%s' doesn't have even one syllable"): format(typ, origstem)) end return undo_au_ey_ur_sub(stem) end v1 = "" middle = "" end v2 = typ == "u_mut" and v2 or (typ == "uUmut" and greater_u_mutation or lesser_u_mutation)[v2] or v2 local retval = undo_au_ey_ur_sub(first .. v1 .. middle .. v2 .. last) if retval == origstem and error_if_unmatchable then error(("Can't apply u-mutation of type '%s' to stem '%s'; result would be the same as the original"): format(typ, origstem)) end return retval end if typ ~= "umut" and typ ~= "Umut" then error(("Internal error: For stem '%s', saw unrecognized u-mutation type '%s'"):format(origstem, typ)) end local first, v, last = rmatch(stem, "^(.*)(" .. V .. ")(" .. C .. "*)$") if not first then if error_if_unmatchable then error(("Can't apply u-mutation of type '%s' because stem '%s' doesn't have a vowel"):format(typ, origstem)) end return undo_au_ey_ur_sub(stem) end v = (typ == "Umut" and greater_u_mutation or lesser_u_mutation)[v] or v local retval = undo_au_ey_ur_sub(first .. v .. last) if retval == origstem and error_if_unmatchable then error(("Can't apply u-mutation of type '%s' to stem '%s'; result would be the same as the original"): format(typ, origstem)) end return retval end -- Apply reverse u-mutation to `stem`, maybe excluding suffixal -ur. `typ` is the type of u-mutation: -- * "unumut" (unmutate the last vowel if possible, with ö -> a); -- * "unUmut" (unmutate the last vowel if possible, with u -> a); -- * "unuumut" (unmutate the last two vowels if possible, with ö -> a in the second-to-last and ö -> a in the last); -- * "unuUmut" (unmutate the last two vowels if possible, with ö -> a in the second-to-last and u -> a in the last); -- * "unuUUmut" (unmutate the last three vowels if possible, with ö -> a in the third-to-last and u -> a in the last and -- second-to-last; needed, at least theoretically, in declining adjective-noun multiword terms where the -- adjective is an inflected-form superlative of a past-participle-derived adjective such as [[söltuðust]] -- "saltiest", nominative feminine singular of [[saltaðastur]]); -- * "unu_mut" (unmutate the second-to-last vowel if possible, with ö -> a, leaving alone the last vowel). -- If `exclude_final_ur`, act as if suffixal -ur isn't present and unmutate the previous vowel. -- If `error_if_unmatchable`, throw an error if we are unable to unmutate the vowel. function export.apply_reverse_u_mutation(stem, typ, exclude_final_ur, error_if_unmatchable) local origstem = stem stem = apply_au_ey_ur_sub(stem, true, false, exclude_final_ur) if typ == "unuUUmut" then local first, v1, mid1, v2, mid2, v3, last = rmatch(stem, "^(.*)(" .. V .. ")(" .. C .. "*)(" .. V .. ")(" .. C .. "*)(" .. V .. ")(" .. C .. "*)$") if first then v1 = lesser_reverse_u_mutation[v1] or v1 elseif stem:sub(1, 1) ~= "-" then if error_if_unmatchable then error(("Can't apply reverse u-mutation of type '%s' because stem '%s' doesn't have three syllables"): format(typ, origstem)) end return undo_au_ey_ur_sub(stem) else first, v2, mid2, v3, last = rmatch(stem, "^(.*)(" .. V .. ")(" .. C .. "*)(" .. V .. ")(" .. C .. "*)$") if not first then if error_if_unmatchable then error(("Can't apply reverse u-mutation of type '%s' because suffix stem '%s' doesn't have two syllables"): format(typ, origstem)) end return undo_au_ey_ur_sub(stem) end v1 = "" mid1 = "" end v2 = greater_reverse_u_mutation[v2] or v2 v3 = greater_reverse_u_mutation[v3] or v3 local retval = undo_au_ey_ur_sub(first .. v1 .. mid1 .. v2 .. mid2 .. v3 .. last) if retval == origstem and error_if_unmatchable then error(("Can't apply reverse u-mutation of type '%s' to stem '%s'; result would be the same as the original"): format(typ, origstem)) end return retval end if typ == "unuumut" or typ == "unuUmut" or typ == "unu_mut" then local first, v1, middle, v2, last = rmatch(stem, "^(.*)(" .. V .. ")(" .. C .. "*)(" .. V .. ")(" .. C .. "*)$") if not first then if error_if_unmatchable then error(("Can't apply reverse u-mutation of type '%s' because stem '%s' doesn't have two syllables"): format(typ, origstem)) end return undo_au_ey_ur_sub(stem) end v1 = lesser_reverse_u_mutation[v1] or v1 v2 = typ == "unu_mut" and v2 or (typ == "unuUmut" and greater_reverse_u_mutation or lesser_reverse_u_mutation)[v2] or v2 local retval = undo_au_ey_ur_sub(first .. v1 .. middle .. v2 .. last) if retval == origstem and error_if_unmatchable then error(("Can't apply reverse u-mutation of type '%s' to stem '%s'; result would be the same as the original"): format(typ, origstem)) end return retval end if typ ~= "unumut" and typ ~= "unUmut" then error(("Internal error: For stem '%s', saw unrecognized reverse u-mutation type '%s'"):format(origstem, typ)) end local first, v, last = rmatch(stem, "^(.*)(" .. V .. ")(" .. C .. "*)$") if not first then if error_if_unmatchable then error(("Can't apply reverse u-mutation of type '%s' because stem '%s' doesn't have a vowel"): format(typ, origstem)) end return undo_au_ey_ur_sub(stem) end v = (typ == "unUmut" and greater_reverse_u_mutation or lesser_reverse_u_mutation)[v] or v local retval = undo_au_ey_ur_sub(first .. v .. last) if retval == origstem and error_if_unmatchable then error(("Can't apply reverse u-mutation of type '%s' to stem '%s'; result would be the same as the original"): format(typ, origstem)) end return retval end -- Apply contraction to `stem`. Throw an error if the stem can't be contracted. function export.apply_contraction(stem) -- Contraction only applies when the last vowel is a/i/u and followed by a single consonant. There are restrictions -- on what the consonant can be but I'm not sure exactly what they are; r/l/n/ð are all possible (cf. [[hamar]], -- [[megin]], [[höfuð]], [[þumall]], where in the last case the final -l is the nominative singular ending). local butlast, last = rmatch(stem, "^(.*" .. C .. ")[aiu](" .. C .. ")$") if not butlast then error(("Contraction cannot be applied to stem '%s' because it doesn't end in a/i/u preceded by a consonant and followed by a single consonant" ):format(stem)) end return butlast .. last end -- Add a dental ending (d/t/ð) to `stem`. function export.add_dental_ending(stem) if stem:match("[lmn]$") then -- [[talinn]] "counted" -> tald-; [[framinn]] "performed" -> framd-; [[hruninn]] "fallen down/in" -> hrund- return stem .. "d" elseif stem:match("ð$") then -- I dunno if this ever happens. return usub(stem, 1, -2) .. "dd" elseif stem:match("[pkt]$") then -- [[glapinn]] "confused" -> glapt-; [[lukinn]] "(en)closed" -> lukt-; no examples with -t- return stem .. "t" end -- [[vafinn]] "wrapped" -> vafð-; [[varinn]] "defended" -> varð-; [[tugginn]] "chewed" -> tuggð- (or tuggn-); -- [[spúinn]] "vomited" -> spúð- return stem .. "ð" end -- Parse off and return a final -ur or -r nominative ending. Return the portion before the ending as well as the ending -- itself. If the lemma ends in -aur, only the -r is stripped off. This is used by ## and by the `@l` scraping -- indicator (so that e.g. `@r` when applied to a compound of [[réttur]] "law; court; course (of a meal)" won't get -- confused by the final -r). function export.parse_off_final_nom_ending(lemma) local lemma_minus_r, final_nom_ending if lemma:match("[^Aa]ur$") then lemma_minus_r, final_nom_ending = lemma:match("^(.*)(ur)$") elseif lemma:sub(-1) == "r" then lemma_minus_r, final_nom_ending = lemma:match("^(.*)(r)$") else lemma_minus_r, final_nom_ending = lemma, "" end return lemma_minus_r, final_nom_ending end -- Replace # and ## with `val`, substituting `lemma` as necessary (possibly without final -r or -ur). function export.replace_hashvals(val, lemma) if not val then return val elseif val:find("##", nil, true) then local lemma_minus_r = export.parse_off_final_nom_ending(lemma) val = val:gsub("##", replacement_escape(lemma_minus_r)) end return (val:gsub("#", replacement_escape(lemma))) end --[==[ Find the inflection spec by scraping the contents of the Icelandic section of `data.lemma`, looking for `data.infltemp` calls (where the template is e.g. {"is-ndecl"}, {"is-adecl"} or {"is-conj"}). If `inflid` is given, it must match the value of the {{para|id}} param specified to the inflection template; otherwise, the inflection template must not have an {{para|id}} param. If anything goes wrong in the process, a string is returned describing the error message; otherwise a table of inflections is returned, each containing a field `infl` with the inflection spec. The inflection spec comes from the {{para|deriv}}, {{para|deriv2}}, etc. params in the inflection template if specified and `data.is_deriv` is given; otherwise from {{para|1}}, {{para|2}}, etc. If `data.allow_empty_infl` is given, a missing inflection spec in {{para|1}} is allowed and converted to an empty string; otherwise, an error string is returned. ]==] function export.scrape_inflection(data) local retval = require(inflection_utilities_module).scrape_inflection { langname = "Icelandic", lemma = data.lemma, infltemp = data.infltemp, inflid = data.inflid, idparam = "id", } if type(retval) == "string" then return retval end local args = retval.template:get_arguments() local infls = {} if data.is_deriv and args.deriv then local i = 1 while true do local deriv_param = "deriv" .. (i == 1 and "" or tostring(i)) if args[deriv_param] then table.insert(infls, {infl = args[deriv_param]}) i = i + 1 else break end end elseif not args[1] and not data.allow_empty_infl then return ("For Icelandic base lemma '[[%s]]', saw no inflection spec in 1="):format(data.lemma) else local i = 1 while true do if args[i] or (i == 1 and data.allow_empty_infl) then table.insert(infls, {infl = args[i] or ""}) i = i + 1 else break end end end return {infls = infls, pos = args.pos} end --[==[ Find the appropriate inflection template for a given lemma by ''scraping'', i.e. fetching the template from a page where it is already given. There are two types of inflection scraping: ''direct scraping'' and ''related-lemma scraping''. ''Direct scraping'' is the simpler case of directly scraping the inflection of a specified lemma, and occurs in two circumstances: ''self-scraping'' (scraping the inflection from elsewhere on the same page of the lemma in question) and ''multiword scraping'' (scraping the inflection of a single word, or sometimes a multiword subportion, of a multiword lemma). Self-scraping typically occurs in the headword of a lemma, where it is desirable to scrape the inflection from the corresponding ==Inflection==, ==Conjugation== or ==Declension== section, rather than duplicating it. For example, most Icelandic nouns have their headword specified as {{tl|is-noun|@@}}, where specs beginning with `@` are scraping specs and `@@` specifically indicates direct scraping (in this case, self-scraping, i.e. looking for the inflection specified in an {{tl|is-ndecl}} call elsewhere on the same page). Multiword scraping typically occurs in the inflection call of a multiword expression; for example, the Icelandic idiom {{m|is|almenn skynsemi|lit=common sense}} has its declension defined as {{tl|is-ndecl|almenn<adj> skynsemi<@@>}}, which says to inflect {{m|is||almenn}} (the feminine of {{m|is|almennur||common, general, universal}}) as an adjective and inflect {{m|is|skynsemi||sense, reason}} by scraping its declension from the page on which it is defined. ''Related-lemma scraping'' means using the inflection of a related word, typically a suffixal component of the lemma in question, to specify the lemma's inflection. For example, the lemma {{m|is|ljósabekkur||sunbed, tanning bed}} is a compound of {{m|is|ljós||light}} and {{m|is|bekkur||bench}}, and inflects the same as {{m|is|bekkur}}, so we can scrape the inflection of {{m|is|bekkur}} and use it to specify the inflection of {{m|is|ljósabekkur}} and other similar compounds rather than copying the inflection of the base word to each compound. (This is comparable to using {{m|en|tooth}} to define the inflection of {{m|en|sawtooth}}, {{m|en|foretooth}}, {{m|en|dogtooth}}, etc., or using {{m|en|draw}} to define the inflection of {{m|en|withdraw}}, {{m|en|overdraw}}, and the like.) In this case, the inflection of {{m|is|ljósabekkur}} will typically be given as {{tl|is-ndecl|@b}}, meaning to scrape the inflection of the portion of the lemma beginning with ''b''. Sometimes more than one letter needs to be given; for example, to scrape the inflection of {{m|en|sawtooth}} from {{m|en|tooth}}, we'd have to use `@to`, as `@t` would wrongly try to look up the inflection of {{m|en|th}}. There is one param, an object with the following fields: * `lemma`: The lemma whose inflection is to be determined by scraping. * `scrape_spec`: The spec indicating how the ''base lemma'' (the actual lemma whose inflection is to be scraped) is constructed. This is normally the part of the spec following the initial `@` in the template call. A value of {"@"} indicates ''direct scraping''' (see above), i.e. the value of `lemma` is used as the base lemma. Any other value indicates ''related-lemma scraping'' (see above). The base lemma will be constructed by fetching the rightmost suffix beginning with the letter(s) of `scrape_spec`, forming the ''lemma suffix'', which is either used directly as the base lemma or modified slightly (if `scrape_is_suffix` or `scrape_is_uppercase` is given). * `scrape_is_suffix`: If specified, the base lemma is constructed from the lemma suffix by prefixing with {"-"}, i.e. the lemma whose inflection is to be scraped is a suffix, such as {{m|is|-son}}. * `scrape_is_uppercase`: If specified, the base lemma is constructed from the lemma suffix by uppercasing it. This is used e.g. to scrape the inflection of {{m|is|Björn}} for use in constructing the inflection of {{m|is|Aðalbjörn}}. * `infltemp`: A string specifying the name of the template containing the inflections. * `allow_empty_infl`: If specified, a missing inflection spec in {{para|1}} is allowed and converted to an empty string; otherwise, an error string is returned. * `inflid`: The inflection ID that must match the value of the `idparam` parameter specified by the inflection template. If not specified, there must be exactly one matching inflection template present, and it must not have a value given for the `idparam` parameter. Otherwise, all matching inflection templates must have a value specified for the `idparam` parameter of the template, and there must be exactly one template whose `idparam` parameter value is the same as the value of `inflid`. The return value is an object with the following fields: * `prefix`: The found prefix, as specified above. * `base_lemma`: The found base lemma, as specified above. * `infl`: The inflections; same as is returned by `scrape_inflection`. {nil} if no matching template could be found (in which case `error` will be populated). * `errmsg`: If no matching inflection template could be found, this will be a string describing what went wrong. For example, if inflection templates were found but with incorrect ID's, the ID's actually found will be listed. ]==] function export.find_inflection_given_scrape_spec(data) local lemma, scrape_spec, scrape_is_suffix, scrape_is_uppercase, infltemp, allow_empty_infl, inflid = data.lemma, data.scrape_spec, data.scrape_is_suffix, data.scrape_is_uppercase, data.infltemp, data.allow_empty_infl, data.inflid local prefix, base_lemma if scrape_spec == "@" then -- @@ specified base_lemma = lemma prefix = "" else local lemma_minus_ending, final_ending = data.parse_off_ending(lemma) prefix, base_lemma = rmatch(lemma_minus_ending, "^(.*)(" .. pattern_escape(scrape_spec) .. ".-)$") if not prefix then error(("Can't determine base lemma to scrape given lemma '%s' and scraping spec '@%s'; scraping spec not " .. "found in lemma"):format(lemma, scrape_spec)) end base_lemma = base_lemma .. final_ending end if scrape_is_uppercase then local base_first, base_rest = rmatch(base_lemma, "^(.)(.*)$") if not base_first then error(("Internal error: Something wrong, couldn't match a single character in %s"):format(dump(base_lemma))) end base_lemma = uupper(base_first) .. base_rest end if scrape_is_suffix then base_lemma = "-" .. base_lemma end local infl = export.scrape_inflection { lemma = base_lemma, infltemp = infltemp, allow_empty_infl = allow_empty_infl, is_deriv = true, inflid = inflid } local errmsg = nil if type(infl) == "table" then infl = infl.infls if infl[2] then errmsg = ("For Icelandic base lemma '[[%s]]', saw %s inflection specs; currently, can only handle one"): format(base_lemma, #infl) else infl = infl[1] local argspec = infl.infl if argspec:find("<", nil, true) then errmsg = ("For Icelandic base lemma '[[%s]]', saw explicit angle bracket spec in inflection, likely " .. "indicating a multiword inflection; can't handle yet: %s"):format(lemma, argspec) elseif argspec:find("((", nil, true) then errmsg = ("For Icelandic base lemma '[[%s]]', saw alternant specs; can't handle yet: %s"): format(lemma, argspec) end end if errmsg then infl = nil end else errmsg = infl infl = nil end return { prefix = prefix, base_lemma = base_lemma, infl = infl, errmsg = errmsg, } end return export 0r2mz79wqsdbqchokvctyh6chhsxl3o မဝ်ဂျူ:is-noun 828 119774 402129 393766 2026-09-28T10:13:45Z 咽頭べさ 33 402129 Scribunto text/plain local export = {} --[=[ Authorship: Ben Wing <benwing2> ]=] --[=[ TERMINOLOGY: -- "slot" = A particular combination of case/number. Example slot names for nouns are "acc_s" (accusative singular) and "gen_p" (genitive plural). Each slot is filled with zero or more forms. -- "form" = The declined Icelandic form representing the value of a given slot. -- "lemma" = The dictionary form of a given Icelandic term. Generally the nominative singular, or nominative plural of plural-only nouns, but may occasionally be another form if the nominative is missing. ]=] --[=[ FIXME: 1. Support 'plstem' overrides. [DONE] 2. Support definite lemmas such as [[Bandaríkin]] "the United States". [DONE] 3. Support adjectivally-declined terms. [DONE PARTIALLY] 4. Support @ for built-in irregular lemmas. [DONE; SINCE REPLACED WITH SCRAPING SPECS] 5. Somehow if the user specifies v-infix, it should prevent default unumut from happening in strong feminines. [DONE] 6. Def acc pl should ignore -u ending in indef acc pl. [DONE] 7. Footnotes on omitted forms should be possible. 8. Remove setting of override on pl when processing plural-only terms in synthesize_singular_lemma(); interferes with decllemma in [[dyr]]. But then need to fix handling of masculine accusative plural. [DONE] 9. Rationalize conventions used in u-mutation types. [DONE] 10. Compute defaulted number and definiteness early so it's usable when merging built-in and user-specified specs. [DONE] 11. Support multiple declension specs. [DONE] 12. Support dark mode. [DONE] 13. Support scraping declension specs. [DONE] 14. Support @-d etc. for suffix scraping. [DONE] 15. Include scraped base nouns in title annotation. [DONE] 16. Support @@ for self-scraping. [DONE IN [[Module:gmq-headword]]] 17. Support scraping multiple declension specs; e.g. [[fræði]] is declared with 'n.pl|f.sg' and [[hljómfræði]] would like to use '@f' but you get an error. ]=] local lang = require("Module:languages").getByCode("is") local require_when_needed = require("Module:utilities/require when needed") local m_table = require("Module:table") local m_links = require("Module:links") local m_string_utilities = require("Module:string utilities") local iut = require("Module:inflection utilities") local put = require("Module:parse utilities") local m_para = require("Module:parameters") local com = require("Module:is-common") local m_inflection_table = require("Module:inflection-table") local m_is_adjective = require_when_needed("Module:is-adjective") local en_utilities_module = "Module:en-utilities" local u = mw.ustring.char local rsplit = mw.text.split local rfind = mw.ustring.find local rmatch = mw.ustring.match local rsubn = mw.ustring.gsub local ulen = mw.ustring.len local usub = mw.ustring.sub local uupper = mw.ustring.upper local ulower = mw.ustring.lower local dump = mw.dumpObject local force_cat = false -- set to true to make categories appear in non-mainspace pages, for testing local SUB_ESCAPED_PERIOD = u(0xFFF0) local SUB_ESCAPED_COMMA = u(0xFFF1) -- version of rsubn() that discards all but the first return value local function rsub(term, foo, bar) local retval = rsubn(term, foo, bar) return retval end -- version of rsubn() that returns a 2nd argument boolean indicating whether -- a substitution was made. local function rsubb(term, foo, bar) local retval, nsubs = rsubn(term, foo, bar) return retval, nsubs > 0 end local function track(track_id) require("Module:debug/track")("is-noun/" .. track_id) return true end local potential_lemma_slots = { "ind_nom_s", "ind_nom_p", "def_nom_s", "def_nom_p", "ind_acc_s", -- for [[sig]] } local cases = { "nom", "acc", "dat", "gen", } local case_set = m_table.listToSet(cases) local overridable_stems = { "stem", "vstem", "plstem", "plvstem", "imutval", "unimutval", } local overridable_stem_set = m_table.listToSet(overridable_stems) local control_specs = { "umut", "imut", "unumut", "unimut", "con", "defcon", "j", "v", } local control_spec_set = m_table.listToSet(control_specs) local clitic_articles = { m = { nom_s = "inn", acc_s = "inn", dat_s = "num", gen_s = "ins", nom_p = "nir", acc_p = "na", dat_p = "num", gen_p = "nna", }, f = { nom_s = "in", acc_s = "ina", dat_s = "inni", gen_s = "innar", nom_p = "nar", acc_p = "nar", dat_p = "num", gen_p = "nna", }, n = { nom_s = "ið", acc_s = "ið", dat_s = "nu", gen_s = "ins", nom_p = "in", acc_p = "in", dat_p = "num", gen_p = "nna", }, } local gender_code_to_desc = { m = "masculine", f = "feminine", n = "neuter", none = nil, } local number_code_to_desc = { sg = "singular", pl = "plural", both = "both numbers", none = nil, } local definiteness_code_to_desc = { indef = "indefinite-only", def = "definite-only", bothdef = "indefinite and definite", none = nil, } local function get_noun_slots(alternant_multiword_spec) local noun_slots_list = {} for _, case in ipairs(cases) do for _, num in ipairs { "s", "p" } do for _, def in ipairs { "ind", "def" } do local slot = ("%s_%s_%s"):format(def, case, num) local accel = ("%s|%s"):format(def == "ind" and "indef" or def, case) if alternant_multiword_spec.actual_number == "both" then accel = accel .. "|" .. num end table.insert(noun_slots_list, { slot, accel }) end end end for _, potential_lemma_slot in ipairs(potential_lemma_slots) do table.insert(noun_slots_list, { potential_lemma_slot .. "_linked", "-" }) end return noun_slots_list end local function generate_list_of_possibilities_for_err(list) local quoted_list = {} for _, item in pairs(list) do if item == "" then item = "<nowiki />" end table.insert(quoted_list, "'" .. item .. "'") end table.sort(quoted_list) return mw.text.listToText(quoted_list) end local function skip_slot(number, definiteness, slot) return number == "sg" and slot:find("_p$") or number == "pl" and slot:find("_s$") or definiteness == "def" and slot:find("^ind_") or (definiteness == "indef" or definiteness == "none") and slot:find("^def_") end local function apply_i_mutation(stem, newv) return com.apply_i_mutation(stem, newv, "exclude final -ur", "error if unmatchable") end local function apply_reverse_i_mutation(stem, newv, error_if_unmatchable) return com.apply_reverse_i_mutation(stem, newv, "exclude final -ur", error_if_unmatchable) end local function apply_u_mutation(stem, typ, error_if_unmatchable) return com.apply_u_mutation(stem, typ, "exclude final -ur", error_if_unmatchable) end local function apply_reverse_u_mutation(stem, typ, error_if_unmatchable) return com.apply_reverse_u_mutation(stem, typ, "exclude final -ur", error_if_unmatchable) end --[=[ Create an empty `base` object for holding the result of parsing and later the generated forms. The object is of the form { -- Original lemma as directly given by the user or taken from the pagename. orig_lemma = "ORIGINAL-LEMMA", -- Same as `orig_lemma` but with links removed. orig_lemma_no_links = "ORIGINAL-LEMMA-NO-LINKS", -- Originally the same as `orig_lemma_no_links`, but if the term is a plural-only noun, this will be the corresponding -- singular lemma, and if the term is an adjective form, this will be the corresponding lemma (strong nominative -- masculine singular form). lemma = "LEMMA", -- Generated per-slot forms. After calling `inflect_multiword_or_alternant_multiword_spec`, the forms will be filled -- in with the format as given below, where the value of each slot is a form object. After calling `show_forms`, the -- value of each slot will be a formatted string listing all of the forms of that slot, or "—" if there are none. forms = { SLOT = { { form = "FORM", footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}, }, ... }, ... }, -- Specs for control groups as specified by the user. CONTROL_GROUP is as below and CONTROL_SPEC is -- {form = "FORM", footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}, defaulted = BOOLEAN}, where FORM is as specified -- by the user (e.g. "uUmut", "-unumut") or set as a default by the code (in which case `defaulted` will be set to -- true for control groups "umut" and "unumut"). The control groups are as follows: -- * umut (u-mutation); -- * imut (i-mutation); -- * unumut (reverse u-mutation); -- * unimut (reverse i-mutation); -- * con (stem contraction before vowel-initial endings); -- * defcon (stem contraction before vowel-initial definite clitics when the ending itself is null); -- * j (j-infix before vowel-initial endings not beginning with an i); -- * v (v-infix before vowel-initial endings). CONTROL_GROUP = { CONTROL_SPEC, CONTROL_SPEC, ... }, -- Property sets containing computed stems, one per each combination of control group values. Described in more detail -- below. prop_sets = { PROPSET, -- see below ..., }, -- Per-slot overrides, which override forms generated by the auto-determined or specified declension pattern. SLOT is -- the actual name of the slot, normally without the definiteness prefix, such as "dat_s" (NOT the slot name as -- specified by the user, which would be just "dat" for "dat_s") and OVERRIDE is of the form -- {indef = {FORMOBJ, FORMOBJ, ...}, def = nil or false or {FORMOBJ, FORMOBJ, ...}}, where FORMOBJ is of the form -- {form = FORM, footnotes = FOOTNOTES} as in the `forms` table ("-" means to suppress the slot entirely and is -- signaled by "--" as the user-specified form value; normally FORM values are endings, but a value preceded by ! -- means it's a full form rather than an ending; in such forms you can use # to indicate the lemma and ## to indicate -- the lemma minus -ur or -r, as with stems); `indef` means the override(s) of the indefinite variant of the slot and -- is specified by the user before a slash; `def` means the override(s) of the definite variant of the slot and come -- after a slash, and `false` for either means that the user left the value before or after the slash completely -- blank, meaning not to override the indefinite or definite forms. Sometimes the slot itself has def_ in it; this -- happens when the user preceded the slot spec by 'def', e.g. 'defdat' or 'defgenpl'. overrides = { SLOT = OVERRIDE, SLOT = OVERRIDE, ... }, -- Overrides for the genitive singular, specified after a comma after the gender. OVERRIDE is in the same format as -- above. gens = nil or OVERRIDE, -- Overrides for the nominative and accusative plural, specified after a comma after the gender. OVERRIDE is in the -- same format as above. The actual values given are for the nominative plural, and the accusative plural is derived -- automatically from these values. pls = nil or OVERRIDE, -- "sg", "pl", "both" or "none" (for certain pronouns); may be missing and if so is defaulted number = "NUMBER", -- "m", "f", "n" or "none" (for certain pronouns); always specified by the user gender = "GENDER", -- "def", "indef", "bothdef" or "none" (for pronouns); may be missing and if so is defaulted definiteness = "DEFINITENESS", -- decline like the specified lemma decllemma = nil or "DECLLEMMA", -- decline like the specified gender declgender = nil or "DECLGENDER", -- decline like the specified number declnumber = nil or "DECLNUMBER", -- override the stem; may have # (= lemma) or ## (= lemma minus -ur or -r) stem = nil or "STEM", -- override the stem used before vowel-initial endings; same format as `stem` vstem = nil or "STEM", -- override the plural stem; same format as `stem` plstem = nil or "STEM", -- override the plural stem used before vowel-initial endings; same format as `stem` plvstem = nil or "STEM", -- decline like an adjective; will be present if the user gave a spec starting with 'adj' adjspec = { -- User explicitly specified the lemma using a colon + lemma. lemma = nil or LEMMA -- User gave a one-part or two-part substitution spec such as 'tvöfalt<adj/dur>' or 'ryðfrítt<adj/tt/r>'. subspec = nil or { from = nil or FROM, to = TO, }, }, -- misc Boolean properties: -- * "proper" (a lowercase noun that behaves like a proper noun, i.e. defaults to no plural or definite forms); -- * "common" (a capitalized noun that behaves like a common noun, i.e. defaults to plural and definite forms); -- * "dem" (a demonym, i.e. a capitalized noun such as [[Svisslendingur]] "Swiss person" that behaves like a common -- noun; currently behaves like "common"); -- * "builtin" (for built-in terms such as pronouns); -- * "indecl" (noun is indeclinable); -- * "decl?" (declension is unknown); -- * "iending" (a definite-only noun whose lemma ends in -i, which is elided before a definite clitic beginning with -- i-); -- * "rstem" (an r-stem like [[bróðir]] "brother" or [[dóttir]] "daughter"); -- * "já" (a neuter in -é whose stem alternates with -já, such as [[tré]] "tree" and [[hné]]/[[kné]] "knee"); -- * "weak" (the noun should decline like an ordinary weak noun; used in the declension of [[fjandi]] to disable the -- special -ndi declension); -- * "linkasis" (when linking definite-only and plural-only lemmas in the headword, link as-is instead of -- linking the singular indefinite version); props = { PROP = true, PROP = true, ... }, -- Alternant-level footnotes, specified using `.[footnote]`, i.e. a footnote by itself. footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}, -- ADDNOTE_SPEC is {slot_specs = {"SPEC", "SPEC", ...}, footnotes = {"FOOTNOTE", "FOOTNOTE", ...}}; SPEC is a Lua -- pattern matching slots (anchored on both sides) and FOOTNOTE is a footnote to add to those slots. addnote_specs = { ADDNOTE_SPEC, ADDNOTE_SPEC, ... }, } There is one PROPSET (property set) for each combination of control specs; in the lower limit, there is a single property set. There may be more than one property set e.g. if the user specified 'umut,uUmut' or '-j,j' or '-imut,imut' or some combination of these. The properties in a given property set specify the values themselves of each control group, as well as stems (derived from the control specs) that are used to construct the various forms and populate the slots in `forms` with these values. The information found in the property sets cannot be stored in `base` because it depends on a particular combination of control specs, of which there may be more than one (see above). The decline_noun() function iterates over all property sets and calls the appropriate declension function on each one in turn, which adds forms to each slot in `base.forms`, automatically deduplicating. The properties in each property set are: * Control specs: These are copied from the control specs at the base level. The key is one of the possible control groups ("umut", "imut", "con", etc.), but the value is a single form object {form = "FORM", footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}}. These are set by expand_property_sets(). * Stems (each stem is either a string or a form object; stems in general may be missing, i.e. nil, unless otherwise specified, and default to more general variants): ** `stem`: The basic stem. Always set. May be overridden by more specific variants. ** `nonvstem`: The stem used when the ending is null or starts with a consonant, unless overridden by a more specific variant. Defaults to `stem`. Not currently used, but could be if e.g. a user stem override `nonvstem:...` were supported. ** `umut_nonvstem`: The stem used when the ending is null or starts with a consonant and u-mutation is in effect, unless overridden by a more specific variant. Defaults to `nonvstem`. Will only be present when the result of u-mutation is different from the stem to which u-mutation is applied. (In this case, it will be present even if `nonvstem` is missing, because there is no generic `umut_stem`.) ** `imut_nonvstem`: The stem used when the ending is null or starts with a consonant and i-mutation is in effect. If i-mutation is in effect, this should always be specified (otherwise an internal error will occur); hence it has no default. Note that i-mutation is only in effect when either (a) `imut` or `unimut` was specified; (b) a user-specified override is given that begins with a single ^ (indicating i-mutation); or (c) a declension type is in effect that contains default endings beginning with a single ^ (examples are `f-long-vowel` for lemmas in -ó and `f-long-umlaut-vowel-r`). Note also that this will be present even if `nonvstem` is missing, because there is no generic `imut_stem`. ** `vstem`: The stem used when the ending starts with a vowel, unless overridden by a more specific variant. Defaults to `stem`. Will be specified when contraction is in effect or the user specified `vstem:...`. ** `umut_vstem`: The stem(s) used when the ending starts with a vowel and u-mutation is in effect. Defaults to `vstem`. Note that u-mutation applies to the contracted stem if both u-mutation and contraction are in effect. Will only be present when the result of u-mutation is different from the stem to which u-mutation is applied. (In this case, it will be present even if `vstem` is missing, because there is no generic `umut_stem`.) ** `imut_vstem`: The stem(s) used when the ending starts with a vowel and i-mutation is in effect. If i-mutation is in effect, this should always be specified (otherwise an internal error will occur); hence it has no default. Note that i-mutation applies to the contracted stem if both i-mutation and contraction are in effect. See `imut_nonvstem` for comments on when this stem will be present. ** `null_defvstem`: The stem(s) used when the ending is null and is followed by a definite ending that begins with a vowel, unless overridden by a more specific variant. Defaults to `nonvstem`. This is normally set when `defcon` is specified. ** `umut_null_defvstem`: The stem(s) used when the ending is null and is followed by a definite ending that begins with a vowel, and u-mutation is in effect. Defaults to `null_defvstem`. This is normally set when `defcon` is specified and u-mutation is needed, as in the nom/acc pl of neuter [[mastur]] "mast". Will only be present when the result of u-mutation is different from the stem to which u-mutation is applied. ** `pl_stem`: The basic stem used for plural inflections. Only set when `plstem:...` is specified by the user. If this is set, the alternative plural-specific stem variants are used, where each of the above stems has a plural-specific counterpart, and the identical algorithms and fallbacks are used to determine the correct stem. ** `pl_nonvstem`, `pl_umut_nonvstem`, `pl_imut_nonvstem`, `pl_vstem`, `pl_umut_vstem`, `pl_imut_vstem`, `pl_null_defvstem`, `pl_umut_null_defvstem`: Plural-specific counterparts of the above stems. See the comment under `pl_stem` for when these are used. * Other properties: ** `jinfix`: If present, either "" or "j". Inserted between the stem and ending when the ending begins with a vowel other than "i". Note that j-infixes don't apply to ending overrides. ** `jinfix_footnotes`: Footnotes to attach to forms where j-infixing is possible (even if it's not present). ** `vinfix`: If present, either "" or "v". Inserted between the stem and ending when the ending begins with a vowel. Note that v-infixes don't apply to ending overrides. `jinfix` and `vinfix` cannot both be specified. ** `vinfix_footnotes`: Footnotes to attach to forms where v-infixing is possible (even if it's not present). ** `imut`: If specified (i.e. not nil), either true or false. If specified, there may be associated footnotes in `imut_footnotes`. If true, i-mutation and associated footnotes are in effect before endings starting with "i". If false, associated footnotes still apply before endings starting with "i". Note that i-mutation is also in effect if the ending has ^ prepended, but the associated footnotes don't apply here. ** `imut_footnotes`: See `imut`. ** `unumut`: If specified (i.e. not nil), the type of un-u-mutation requested (either "unumut" or a variant, or the negation of the same using "-unumut" or a variant for no un-u-mutation; "unumut" and variants differ in which slots any associated footnote are placed). If specified, there may be associated footnotes in `unumut_footnotes`. If "unumut" itself, u-mutation is in effect *except* before an ending that starts with an "a" or "i" (unless i-mutation is in effect, which takes precedence). If any other variant, the rules are different: when masculine, u-mutation is in effect *except* in the gen sg and pl (examples are [[söfnuður]] "congregation" and [[mánuður]] "month"); when feminine, u-mutation is in effect except in the nom/acc/gen pl (examples are [[verslun]] "trade, business; store, shop" and [[kvörtun]] "complaint"). When u-mutation is *not* in effect, and i-mutation is also not in effect, the associated footnotes in `unumut_footnotes` apply. If `unumut` is "-unumut" or a variant, there is no un-u-mutation (i.e. there are no special u-mutated stems, and the basic stems, which typically have u-mutation built into them, apply throughout), but the associated footnotes in `unumut_footnotes` still apply in the same circumstances where they would apply if `unumut` were the non-negated counterpart. ** `unumut_footnotes`: See `unumut`. ** `unimut`: If specified (i.e. not nil), either true or false. If specified, there may be associated footnotes in `unimut_footnotes`. If true, i-mutation is in effect *except* in certain case/num combinations that depend on the gender. Specifically: (1) for masculine nouns e.g. [[ketill]] "kettle" and proper names [[Egill]] and [[Ketill]], i-mutation does not apply in the dat sg and throughout the plural; (2) for feminine nouns e.g. [[kýr]] "cow", [[sýr]] "sow (archaic)" and [[ær]] "ewe", i-mutation does not apply in the acc and dat sg and in the dat and gen pl. Cf. also feminine pl-only [[hættur]] "bedtime, quitting time" and [[mætur]] "appreciation, liking", which use 'unimut' to get e.g. dat pl [[háttum]] and gen pl [[hátta]]; but these are handled by synthesizing a singular without i-mutation in the lemma. Very similar are neuter pl [[læti]] "behavior, demeanor" and [[ólæti]] "noise, racket", with e.g. dat pl [[látum]] and gen pl [[láta]], which are handled in the same way. When i-mutation is *not* in effect, the associated footnotes in `unimut_footnotes` apply. If false, the associated footnotes in `unimut_footnotes` still apply in the same circumstances where they would apply if `unimut` where true. ** `unimut_footnotes`: See `unimut`. ]=] local function create_base() return { forms = {}, overrides = {}, props = {}, addnote_specs = {}, } end -- Return true if `stem` refers to a proper noun (first character is uppercase, second character is lowercase). local function is_proper_noun(base, stem) if base.props.common or base.props.dem then return false end if base.props.proper then return true end if base.source_template == "is-noun" then return false end if base.source_template == "is-proper noun" then return true end local first_letter = usub(stem, 1, 1) local second_letter = usub(stem, 2, 2) return ulower(first_letter) ~= first_letter and ((not second_letter or second_letter == "") or uupper(second_letter) ~= second_letter) end --[=[ Basic function to combine stem(s) and other properties with ending(s) and insert the result into the appropriate slot. `base` is the object describing all the properties of the word being inflected for a single alternant (in case there are multiple alternants specified using `((...))`). `slot_prefix` is either "ind_" or "def_" and is prefixed to the slot value in `slot` to get the actual slot to add the resulting forms to. (`slot_prefix` is separated out because the code below frequently needs to conditionalize on the value of `slot` and should not have to worry about the definite and indefinite slot variants). `props` is a property set object containing computed stems and other information (such as whether i-mutation is active) about a particular combination of control specs. See the comment above create_base() for more information. The information found in `props` cannot be stored in `base` because there may be more than one set of such properties per `base` (e.g. if the user specified 'umut,uUmut' or '-j,j' or '-imut,imut' or some combination of these; in such a case, the caller will iterate over all possible combinations, and ultimately invoke add() multiple times, one per combination). `endings` is the ending or endings added to the appropriate stem (after any j or v infix) to get the form(s) to add to the slot. Its value can be a single string, a list of strings, or a list of form objects (i.e. in general list form). `clitics` is the clitic or clitics to add after the endings to form the actual form value inserted into definite slots; it should be nil for indefinite slots. Its format is the same as for `endings`. `ending_override`, if true, indicates that the ending(s) supplied in `endings` come from a user-specified override, and hence j and v infixes should not be added as they are already included in the override if needed. ]=] local function add_slotval(base, slot_prefix, slot, props, endings, clitics, ending_override) if not endings then return end -- Call skip_slot() based on the declined number and definiteness; if the actual number is different, we correct -- this in decline_noun() at the end. if skip_slot(base.number, base.definiteness, slot) then return end if not clitics then clitics = { "" } elseif type(clitics) == "string" then clitics = { clitics } end if type(endings) == "string" then endings = { endings } end -- Loop over each ending and clitic. for _, endingobj in ipairs(endings) do for _, cliticobj in ipairs(clitics) do -- Do the following inside of the innermost loop even though it does not depend on the value of `cliticobj`, -- because that way we are free to mutate `ending` below. local ending, ending_footnotes if type(endingobj) == "string" then ending = endingobj else ending = endingobj.form ending_footnotes = endingobj.footnotes end -- Ending of "-" means the user used -- to indicate there should be no form here. if ending == "-" then return end local function interr(msg) error(("Internal error: For lemma '%s', slot '%s%s', ending '%s', %s: %s"):format(base.lemma, slot_prefix, slot, ending, msg, dump(props))) end local clitic, clitic_footnotes if type(cliticobj) == "string" then clitic = cliticobj else clitic = cliticobj.form clitic_footnotes = cliticobj.footnotes end -- Compute whether i-mutation or u-mutation is in effect, and compute the "mutation footnotes", which are -- footnotes attached to a mutation-related indicator and which may need to be added even if no mutation is -- in effect (specifically when dealing with an ending that would trigger a mutation if in effect). AFAIK -- you cannot have both mutations in effect at once, and i-mutation overrides u-mutation if both would be in -- effect. -- Single ^ at the beginning of an ending indicates that the i-mutated version of the stem should apply, and -- double ^^ at the beginning indicates that the u-mutated version should apply. local explicit_imut, explicit_umut -- % at the end of a definite ending indicates that the following i- of the clitic should drop, as with -- neuter [[tré]], [[kné]], [[fé]]. There's no counterpart to force irregular inclusion of an i- that would -- normally drop; just include it in the ending (as with acc/dat sg of [[eygló]] "eyeball???" and [[sígó]] -- "cig"). local clitic_i_drops ending, explicit_umut = rsubb(ending, "^%^%^", "") if not explicit_umut then ending, explicit_imut = rsubb(ending, "^%^", "") end ending, clitic_i_drops = rsubb(ending, "%%$", "") local is_vowel_ending = rfind(ending, "^" .. com.vowel_c) local is_vowel_clitic = rfind(clitic, "^" .. com.vowel_c) local mut_in_effect, mut_not_in_effect, mut_footnotes local ending_in_a = not not ending:find("^a") local ending_in_i = not not ending:find("^i") local ending_in_u = not not ending:find("^u") if props.unimut ~= nil and props.unumut ~= nil then interr("Cannot have both 'unimut' and 'unumut' in effect at the same time") end if props.unimut ~= nil and props.imut ~= nil then interr("Cannot have both 'unimut' and 'imut' in effect at the same time") end if props.unumut ~= nil and props.umut ~= nil then interr("Cannot have both 'unumut' and 'umut' in effect at the same time") end if explicit_imut then mut_in_effect = "i" elseif explicit_umut then mut_in_effect = "u" else if props.unimut ~= nil then local is_unimut_slot if base.gender == "m" then is_unimut_slot = slot == "dat_s" or slot:find("_p") elseif base.gender == "f" then is_unimut_slot = slot == "acc_s" or slot == "dat_s" or slot == "dat_p" or slot == "gen_p" else interr( "'unimut' shouldn't be specified with neuter nouns; don't know what slots would be affected; neuter pluralia tantum nouns using 'unimut' should have synthesized a singular without i-mutation") end if is_unimut_slot then mut_not_in_effect = "i" mut_footnotes = props.unimut_footnotes elseif props.unimut then mut_in_effect = "i" end elseif props.imut ~= nil then if ending_in_i then if props.imut then mut_in_effect = "i" mut_footnotes = props.imut_footnotes elseif props.imut == false then mut_not_in_effect = "i" mut_footnotes = props.imut_footnotes end end end if props.unumut ~= nil then local is_unumut_slot if props.unumut == "unumut" or props.unumut == "-unumut" then is_unumut_slot = ending_in_a or ending_in_i elseif base.gender == "m" then is_unumut_slot = slot == "gen_s" or slot == "gen_p" elseif base.gender == "f" then is_unumut_slot = slot == "nom_p" or slot == "acc_p" or slot == "gen_p" else interr( "'unumut' and variants shouldn't be specified with neuter nouns; don't know what slots would be affected; neuter pluralia tantum nouns using 'unumut'and variants should have synthesized a singular without u-mutation") end if not mut_in_effect and not mut_not_in_effect then -- Do nothing if mut_in_effect or mut_not_in_effect because i-mut takes precedence over u-mut; -- FIXME: I hope this is correct in all cases. if is_unumut_slot then mut_not_in_effect = "u" mut_footnotes = props.unumut_footnotes elseif props.unumut then mut_in_effect = "u" end end end if ending_in_u and not mut_in_effect then mut_in_effect = "u" -- umut and uUmut footnotes are incorporated into the appropriate umut_* stems end end local ending_was_asterisk = ending == "*" -- Now compute the appropriate stem to which the ending and clitic are added. `prefix` is either an empty -- string or "pl_" and selects the set of stems to consider when computing the stem in effect. See the -- comment above for `pl_stem`. local function compute_stem_in_effect(prefix) local stem_in_effect if mut_in_effect == "i" then -- NOTE: It appears that imut and defcon never co-occur; otherwise we'd need to flesh out the set of -- stems to include i-mutation versions of defcon stems, similar to what we do for u-mutation. if is_vowel_ending then if not props[prefix .. "imut_vstem"] then interr(("i-mutation in effect and ending begins with a vowel but '.%simut_vstem' not defined") : format(prefix)) end stem_in_effect = props[prefix .. "imut_vstem"] else if not props[prefix .. "imut_nonvstem"] then interr(("i-mutation in effect and ending does not begin with a vowel but '.%simut_nonvstem' not defined") : format(prefix)) end stem_in_effect = props[prefix .. "imut_nonvstem"] end else -- Careful with the following logic; it is written carefully and should not be changed without a -- thorough understanding of its functioning. local has_umut = mut_in_effect == "u" -- First, if the ending is null (or "*", which eventually turns into a null ending; see below), and -- we have a vowel-initial definite-article clitic, use the special 'defcon' stem if available. if (ending == "" or ending == "*") and is_vowel_clitic then stem_in_effect = has_umut and props[prefix .. "umut_null_defvstem"] or props[prefix .. "null_defvstem"] end -- If the stem is still unset, then use the vowel or non-vowel stem if available. When u-mutation is -- active, we first check for the u-mutated version of the vowel or non-vowel stem before falling -- back to the regular vowel or non-vowel stem. Note that an expression like `has_umut and -- props[prefix .. "umut_vstem"] or props[prefix .. "vstem"]` here is NOT equivalent to an if-else -- or ternary operator expression because if `has_umut` is true and `umut_vstem` is missing, it will -- still fall back to `vstem` (which is what we want). if not stem_in_effect then if is_vowel_ending then stem_in_effect = has_umut and props[prefix .. "umut_vstem"] or props[prefix .. "vstem"] else stem_in_effect = has_umut and props[prefix .. "umut_nonvstem"] or props[prefix .. "nonvstem"] end end -- Finally, fall back to the basic stem, which is always defined. stem_in_effect = stem_in_effect or props[prefix .. "stem"] end -- If the ending is "*", it means to use the lemma as the form directly (before adding any definite -- clitic) rather than try to construct the form from a stem and ending. We need to do this for the -- lemma slot and especially for the nominative singular, because we don't have the nominative singular -- ending available and it may vary (e.g. it may be -ur, -l, -n, -a, etc. especially in the masculine). -- Not trying to construct the form from stem + ending also avoids complications from the nominative -- singular in -ur, which exceptionally does not trigger u-mutation. However, when 'defcon' is active -- and we're processing a definite form beginning with a vowel (i.e. is_vowel_clitic is set), we can't -- do this, because the form to which the clitic is added is not the lemma but the contracted version. -- As it happens, this works out because in all situations where 'defcon' is active, the nominative -- singular has a null ending. (If this weren't the case, we'd have to change all the declension -- functions to pass in the nominative singular ending in addition to other endings.) An example where -- 'defcon' is active is neuter [[mastur]] "mast" with definite nominative singular [[mastrið]]; here, -- using the lemma would incorrectly produce #[[masturið]]. -- Finally, however, if there is a footnote associated with the computed stem in effect, we need to -- preserve it. if ending == "*" then if not is_vowel_clitic or not props.defcon or props.defcon.form ~= "defcon" then local stem_in_effect_footnotes if type(stem_in_effect) == "table" then stem_in_effect_footnotes = stem_in_effect.footnotes end stem_in_effect = iut.combine_form_and_footnotes(base.actual_lemma, stem_in_effect_footnotes) end -- See comment above. When 'defcon' is not in effect, we changed the stem to be the lemma and -- want to use a null ending; otherwise, the ending is always null anyway, so it's safe to set -- it thus. ending = "" end return stem_in_effect end local stem_in_effect = props.pl_stem and slot:find("_p$") and compute_stem_in_effect("pl_") or compute_stem_in_effect("") local infix, infix_footnotes -- Compute the infix (j, v or nothing) that goes between the stem and ending. if not ending_override and is_vowel_ending then if props.vinfix and props.jinfix then interr("Can't have specifications for both '.vinfix' and '.jinfix'; should have been caught above") end if props.vinfix then infix = props.vinfix infix_footnotes = props.vinfix_footnotes elseif props.jinfix and not ending_in_i then infix = props.jinfix infix_footnotes = props.jinfix_footnotes end end -- If base-level footnotes specified, they go before any stem footnotes, so we need to extract any footnotes -- from the stem in effect and insert the base-level footnotes before. In general, we want the footnotes to -- be in the order [base.footnotes, stem.footnotes, mut_footnotes, infix_footnotes, ending.footnotes, -- clitic.footnotes]. if base.footnotes then local stem_in_effect_footnotes if type(stem_in_effect) == "table" then stem_in_effect_footnotes = stem_in_effect.footnotes stem_in_effect = stem_in_effect.form end stem_in_effect = iut.combine_form_and_footnotes(stem_in_effect, iut.combine_footnotes(base.footnotes, stem_in_effect_footnotes)) end local ending_is_full ending, ending_is_full = rsubb(ending, "^!", "") local function combine_stem_ending(stem, clitic) if stem == "?" then return "?" end local function drop_clitic_i() clitic = clitic:gsub("^i", "") end -- If we're definite-only and using the actual lemma as the stem, the clitic is already incorporated -- into the stem. if base.definiteness == "def" and ending_was_asterisk then return stem end -- % at the end of a definite ending indicates that the following i- of the clitic should drop; see -- above. if clitic_i_drops then drop_clitic_i() end local stem_with_infix = ending_is_full and "" or stem .. (infix or "") -- Drop final -j- of stem before an ending beginning with a consonant. This happens e.g. in [[kirkja]] -- "church" with genitive plural -na, producing [[kirkna]]. It does not happen with a null ending; cf. -- neuter [[emj]] "cries, shouting" and [[gremj]] "anger, irritation" (the latter not in BÍN). if stem_with_infix:find("j$") and rfind(ending, "^" .. com.cons_c) then stem_with_infix = stem_with_infix:gsub("j$", "") end local stem_with_ending -- An initial s- of the ending drops after a cluster of cons + s (including written <x>). if ending:find("^s") and (stem_with_infix:find("x$") or rfind(stem_with_infix, com.cons_c .. "s$")) then stem_with_ending = stem_with_infix .. ending:gsub("^s", "") else stem_with_ending = stem_with_infix .. ending end if clitic == "" then return stem_with_ending end if slot == "dat_p" then stem_with_ending = stem_with_ending:gsub("m$", "") end if clitic:find("^i.*[aiu]") then -- disyllabic clitics in i- -- in practice, fem acc_s -ina, dat_s -inni, gen_s -innar if rfind(stem_with_ending, com.vowel_c .. "$") then drop_clitic_i() end elseif clitic:find("^i") then -- monosyllabic clitics in i- local ending_for_clitic_dropping = ending_was_asterisk and base.lemma_ending or ending if ending_for_clitic_dropping:find("[aiu]$") then drop_clitic_i() end end return stem_with_ending .. clitic end local combined_footnotes = iut.combine_footnotes( iut.combine_footnotes(mut_footnotes, infix_footnotes), iut.combine_footnotes(ending_footnotes, clitic_footnotes) ) local clitic_with_notes = iut.combine_form_and_footnotes(clitic, combined_footnotes) if not stem_in_effect then interr("stem_in_effect is nil") end iut.add_forms(base.forms, slot_prefix .. slot, stem_in_effect, clitic_with_notes, combine_stem_ending) end end end -- Add the definite and indefinite variants of a slot by combining the appropriate stem in `props` with (optionally) an -- infix in `props` and the endings in `endings`, tacking on the definite article clitic in the definite slot variant. -- This calls the underlying function add_slotval() twice, once for indefinite forms and once for definite forms, and is -- normally called by add_decl() or similar function to add an entire declension. `endings` can be nil (no endings are -- added), a single string, a list of strings, a list of form objects (i.e. in general list form), or a table containing -- fields `indef` and `def` (each of which can be any of the previous formats) to add separate sets of endings for the -- indefinite and definite slot variants. If any of the formats for `endings` is supplied other than the separate -- indefinite/definite table, the supplied set of endings is used for both indefinite and definite slot variants. -- `ending_override` and `endings_are_full` are as in add_slotval(). local function add(base, slot, props, endings, ending_override, endings_are_full) if not endings then return end local indef_endings, def_endings if type(endings) == "table" and (endings.indef or endings.def) then indef_endings = endings.indef def_endings = endings.def else indef_endings = endings def_endings = endings end if indef_endings and base.definiteness ~= "def" then add_slotval(base, "ind_", slot, props, indef_endings, nil, ending_override, endings_are_full) end if def_endings and (base.definiteness ~= "indef" and base.definiteness ~= "none") then local clitic = clitic_articles[base.gender] if not clitic then error(("Internal error: Unrecognized value for base.gender: %s"):format(dump(base.gender))) end clitic = clitic[slot] if not clitic then error(("Internal error: Unrecognized value for `slot` in add(): %s"):format(dump(slot))) end add_slotval(base, "def_", slot, props, def_endings, clitic, ending_override, endings_are_full) end end -- Generate the accusative plural ending from the nominative plural. For feminines and neuters, both are the same. -- For masculines, drop the -r except in -ur. local function acc_p_from_nom_p(base, nom_p) if base.gender == "f" or base.gender == "n" then return nom_p end if not nom_p then return nom_p -- this is correct as `nom_p` could be nil or false and we want to return the same thing end local function form_masc_acc_p(ending) -- Form the masculine accusative by dropping -r unless the form ends in -ur, which is kept. If the ending is *, -- we substitute the entire actual lemma. In that case, if the lemma is definite-only, we have to strip off -- the nominative plural clitic -nir before generating the accusative. We don't add the clitic -na because it -- will be added in add_slotval(). if ending == "*" then ending = "!" .. base.actual_lemma end if base.definiteness == "def" and ending:find("^!") then ending = ending:match("^(.*)nir$") if not ending then error(("Masculine plural definite-only lemma '%s' does not end in expected clitic '-nir'; " .. "don't know how to compute the corresponding accusative plural"):format(base.actual_lemma)) end end -- If the ending is full (begins with !), check the whole thing for -ur at the end. if ending:find("^%^*ur$") or ending:find("^!.*[^Aa]ur$") then -- as-is else ending = ending:gsub("r$", "") end return ending end if type(nom_p) == "string" then return form_masc_acc_p(nom_p) end local acc_p = {} for _, ending in ipairs(nom_p) do if type(ending) == "string" then table.insert(acc_p, form_masc_acc_p(ending)) else table.insert(acc_p, { form = form_masc_acc_p(ending.form), footnotes = ending.footnotes }) end end return acc_p end local function process_one_slot_override(base, slot, spec) -- Call skip_slot() based on the declined number and definiteness; if the actual number is different, we correct -- this in decline_noun() at the end. if skip_slot(base.number, base.definiteness, slot) then error(("Override specified for invalid slot '%s' due to '%s' number restriction and/or '%s' definiteness restriction") :format( slot, base.number, base.definiteness)) end local defslot = slot:find("^def_") if defslot then base.forms[slot] = nil else if spec.indef ~= false then base.forms["ind_" .. slot] = nil end if spec.def ~= false then base.forms["def_" .. slot] = nil end end if defslot then local slot_prefix -- Don't call add(), like below, because it adds both indefinite and definite variants, including definite -- clitics in the latter. Instead, directly call add_slotval(). But we need to separate the slot into slot -- prefix "def_" and the remainder because add_slotval() expects slots to be missing the prefix when -- checking which stem to use (which may depend on the slot). slot_prefix, slot = slot:match("^(def_)(.*)$") for _, props in ipairs(base.prop_sets) do add_slotval(base, slot_prefix, slot, props, spec.def, nil, "ending override") end else local endings if spec.indef ~= nil and spec.def ~= nil then -- This could include `false` as the value of either `spec.indef` or `spec.def` to not touch those slots. -- Note that specifying something like 'dat/i' is allowed and will only override the definite slot, but -- is different from a definite-slot override 'defdatinum' because the latter includes the clitic in it. endings = { indef = spec.indef, def = spec.def, } elseif not spec.indef then error(("Internal error: Unless both `spec.indef` and `spec.def` have non-nil values (i.e. the user included a slash in the override, `spec.indef` must be defined: %s") :dump(spec)) elseif slot == "acc_p" then -- As a special case, don't carry over literary acc_p ending -u to the definite. local def_endings = {} for _, ending in ipairs(spec.indef) do -- If the ending is full (begins with !), check the whole thing for -u at the end. if not ending.form:find("^%^*u$") and not ending.form:find("^!.*[^Aa]u$") then table.insert(def_endings, ending) end end endings = { indef = spec.indef, def = def_endings, } else endings = spec.indef end for _, props in ipairs(base.prop_sets) do add(base, slot, props, endings, "ending override") end end end local function process_slot_overrides(base) if base.gens then process_one_slot_override(base, "gen_s", base.gens) end if base.pls then local spec = base.pls process_one_slot_override(base, "nom_p", spec) local acc_p_spec = { indef = acc_p_from_nom_p(base, spec.indef), def = acc_p_from_nom_p(base, spec.def), } process_one_slot_override(base, "acc_p", acc_p_spec) end for slot, spec in pairs(base.overrides) do process_one_slot_override(base, slot, spec) end end -- Generate the full declension for the term given the endings for each slot. acc_p, dat_p and gen_p can be omitted and -- will be defaulted: dat_p defaults to "um", gen_p defaults to "a", and acc_p defaults to the nom_p except for masculines -- not in -ur, where the -r is dropped. Use `false` as the value of an ending to disable generating any value for that -- slot. local function add_decl_with_nom_sg(base, props, nom_s, acc_s, dat_s, gen_s, nom_p, acc_p, dat_p, gen_p) add(base, "nom_s", props, nom_s) add(base, "acc_s", props, acc_s) add(base, "dat_s", props, dat_s) add(base, "gen_s", props, gen_s) if base.number == "pl" then -- If this is a plurale tantum noun and we're processing the nominative plural, use the user-specified lemma -- rather than generating the plural from the synthesized singular, which may not match the specified lemma. -- This is both because we don't set a plural override to specify what the plural should look like and because -- of exceptional cases like [[dyr]], which is plural-only and uses 'decllemma:dyrir'. nom_p = "*" end add(base, "nom_p", props, nom_p) -- Generate defaults for acc_p, dat_p, gen_p if nil was specified; but be careful not to do so for false, which -- means to generate no form. if acc_p == nil then acc_p = acc_p_from_nom_p(base, nom_p) end if dat_p == nil then dat_p = "um" end if gen_p == nil then gen_p = "a" end add(base, "acc_p", props, acc_p) add(base, "dat_p", props, dat_p) add(base, "gen_p", props, gen_p) end -- Generate the full declension for the term given the endings for each slot except the nom_s. This is like -- add_decl_with_nom_sg() but takes the nom sg directly from the lemma instead of trying to reconstruct it from a stem, -- which is more correct in the vast majority of circumstances. The * below is a signal to the underlying add() function -- to use the actual lemma (not any stem, and not the value of 'decllemma:' if given) for the nom sg. Note that add() is -- smart enough to ignore this for the definite nom sg when the 'defcon' indicator is given, because in that case the stem -- for the def nom sg is contracted compared with the lemma. (Specifically, it uses the correct contracted stem and a null -- ending; AFAIK all cases of 'defcon' occur with lemmas with a null ending in the nom sg.) local function add_decl(base, props, acc_s, dat_s, gen_s, nom_p, acc_p, dat_p, gen_p) add_decl_with_nom_sg(base, props, "*", acc_s, dat_s, gen_s, nom_p, acc_p, dat_p, gen_p) end local function add_sg_decl(base, props, acc_s, dat_s, gen_s) add_decl(base, props, acc_s, dat_s, gen_s, false, false, false, false) end local function add_pl_only_decl(base, props, acc_p, dat_p, gen_p) add_decl(base, props, false, false, false, "*", acc_p, dat_p, gen_p) end -- Table mapping declension types to functions to decline the noun. The function takes two arguments, `base` and -- `props`; the latter specifies the computed stems (vowel vs. non-vowel, singular vs. plural) and whether the noun -- is reducible and/or has vowel alternations in the stem. Most of the specifics of determining which stem to use -- and how to modify it for the given ending are handled in add_decl(); the declension functions just need to generate -- the appropriate endings. local decls = {} decls["indecl"] = function(base, props) add_decl(base, props, "", "", "", "", "", "", "") end decls["decl?"] = function(base, props) add_decl(base, props, "?", "?", "?", "?", "?", "?", "?") end decls["m"] = function(base, props) -- The default dative singular is computed below in determine_default_masc_dat_sg(). local dat = props.default_dat_sg add_decl(base, props, "", dat, "s", "ar") end decls["m-ir"] = function(base, props) add_decl(base, props, "i", "i", "is", "ar") end decls["m-skapur"] = function(base, props) -- Nouns in -skapur; default gen is -ar, default dat is -/-, default num is sg. add_decl(base, props, "", "", "ar", "ar") end decls["m-naður"] = function(base, props) -- Nouns in -naður; default gen is -ar, default dat is dati/i:-, default nom pl is -ir, default num is sg, -- default u-mutation is uUmut. add_decl(base, props, "", { indef = "i", def = { "i", "" } }, "ar", "ir") end decls["m-kell"] = function(base, props) -- Proper nouns in -kell; [[Þorkell]], [[Grímkell]], etc. local alt_dat_s = base.stem:gsub("kel$", "katli") add_decl(base, props, "", { "i", { form = "!" .. alt_dat_s, footnotes = { "[archaic]" } } }, "s", false, false, false, false) end decls["m-ó"] = function(base, props) -- abbreviations of school names generally have null genitive: [[Kennó]] from [[Kennaraskóla]] "Teachers' College"), -- [[Astró]], [[Borgó]] (from [[Borgarholtsskóli]]), [[Bríó]], [[Foldó]] (from [[Foldaskóli]]), [[Hafró]] (from -- [[Hafrannsóknastofnun]] "Marine Research Institute" (of Norway), [[Hagó]] (from [[Hagaskóli]]), [[Húsó]], -- [[Kvennó]] (from [[Kvennaskóli]]), [[Meló]] (from [[Melaskóli]]), [[Menntó]] (from [[Menntaskóli]]), [[Tónó]] -- (from [[Tónlistarskóli]]), [[Való]] (from [[Valhúsaskóli]]), [[Versló]]/[[Verzló]] (from -- [[Verslunarskóli Íslands|Iceland Business School]]); but these are completely outweighed by male given names, -- nicknames and historical names of men in -ó (e.g. [[Bó]], [[Bóbó]], [[Brúnó]], [[Dittó]], [[Filpó]], [[Galíleó]], -- [[Jagó]], [[Kató]], [[Kristó]], [[Leó]], [[Leónardó]], [[Markó]], etc.) as well as common nouns in -ó (e.g. -- [[bóleró]] "bolero", [[evró]] "Euro (dated)", [[faraó]] "pharaoh", [[kanó]] "canoe", [[kímonó]] "kimono", -- [[mambó]] "mambo", [[pesó]] "peso", [[pikkóló]] "piccolo", [[róló]] "playground", [[sleikjó]] "lollipop", -- etc.) add_decl(base, props, "", "", "s", "ar") end decls["m-rstem"] = function(base, props) local imut = "^" add_decl(base, props, "ur", "ur", { "ur", { form = "urs", footnotes = { "[proscribed]" } } }, imut .. "ur", nil, imut .. "rum", imut .. "ra") end decls["m-ndi"] = function(base, props) -- Words in -ndi, mostly derived from present participles and mostly in [[andi]]; but cf. [[bóndi]], [[frændi]], -- and [[fjandi]] with two plurals with different meanings. local imut if props.stem:find("ænd$") then imut = "" else imut = "^" end add_decl(base, props, "a", "a", "a", imut .. "ur", nil, { imut .. "um", { form = "um", footnotes = "[rare/obsolete]" } }, { imut .. "a", { form = "a", footnotes = "[rare/obsolete]" } }) end decls["m-weak"] = function(base, props) -- Words in -i like [[tími]] "time, hour"; also words in -a e.g. [[herra]] "gentleman; sir, Mr. (term of address)", -- [[séra]]/[[síra]] "reverend" add_decl(base, props, "a", "a", "a", "ar") end decls["f"] = function(base, props) -- Normal strong feminine nouns; default to genitive -ar, plural -ir. add_decl(base, props, "", "", "ar", "ir") end decls["f-ung"] = function(base, props) -- Strong feminine nouns in -ung, e.g. [[nýjung]] "newness, novelty; piece of news", [[nauðung]] -- "constraint, compulsion". Most such nouns are singular-only, e.g. [[djörfung]] "boldness, daring", [[launung]] -- "secrecy". Occasional nouns need overrides, e.g. [[sundrung]] "scattering; dissension, division, disunity" with -- acc/dat sg either - or -u (but only - in the definite acc/dat sg). add_decl(base, props, "", "", "ar", "ar") end decls["f-ing"] = function(base, props) -- Strong feminine nouns in -ing, e.g. [[kerling]] "old woman", [[eining]] "unity; unit". Singular-only: e.g. -- [[málning] "paint", [[menning]] "culture", [[örvænting]] "despair". add_decl(base, props, "u", "u", "ar", "ar") end decls["f-ur"] = function(base, props) add_decl(base, props, "i", "i", "ar", "ir") end decls["f-i"] = function(base, props) add_decl(base, props, "i", "i", "i", "ir") end decls["f-long-vowel"] = function(base, props) -- nouns in -á, e.g. [[á]] "river", [[gjá]] "gorge, canyon", [[skuggská]] "mirror", [[slá]] "door bolt"; -- nouns in -ó, e.g. [[fló]] "flea", [[kónguló]] "spider", [[kló]] "claw"; -- nouns in -ú, e.g. [[frú]] "married woman", [[trú]] "faith, belief". -- Each is slightly different. local gen, nompl if props.stem:find("á$") then gen = "r" nompl = "r" elseif props.stem:find("ó$") then gen = "ar" nompl = "^r" elseif props.stem:find("ú$") then gen = "ar" nompl = "r" else error(("Unrecognized stem '%s' for long-vowel feminine; should end in -á, -ó or -ú")) end add_decl(base, props, "", "", gen, nompl, nompl, "m", { indef = "a", def = "" }) end decls["f-long-umlaut-vowel-r"] = function(base, props) -- nouns in long umlauted vowel + -r: [[kýr]] "cow", [[sýr]] "sow (archaic)", [[ær]] and compounds. add_decl(base, props, "", "", "^r", "^r", "^r", "m", { indef = "a", def = "" }) end decls["f-acc-dat-i"] = function(base, props) -- Some proper female names with -i in the acc and dat sg add_decl(base, props, "i", "i", "ar", "ar") end decls["f-rstem"] = function(base, props) local imut if props.stem:find("syst$") then imut = "" else imut = "^" end local sg_ending = { "ur", { form = "ir", footnotes = { "[proscribed]" } } } add_decl(base, props, sg_ending, sg_ending, sg_ending, imut .. "ur", nil, imut .. "rum", imut .. "ra") end decls["f-weak"] = function(base, props) add_decl(base, props, "u", "u", "u", "ur") end decls["n"] = function(base, props) -- Normal (strong) neuter nouns. add_decl(base, props, "", "i", "s", "^^") end decls["n-já"] = function(base, props) -- [[tré]] "tree; wood"; [[hné]]/[[kné]] "knee"; [[fé]] "sheep; cattle; money"; the stem has previously been set -- to not include final -é; fé has genitive fjár while the others have genitive in -és. local gen = props.stem:find("f$") and "jár" or "és" add_decl_with_nom_sg(base, props, "é%", "é%", "é", gen, "é%", "é%", "jám", { indef = "jáa", def = "já" }) end decls["n-i"] = function(base, props) -- Neuter nouns in -i, e.g. [[kvæði]] "poem, song". Nouns in -ki and -gi e.g. [[ríki]] "state, kingdom" and [[engi]] -- "meadow" have j-insertion by default, which is set elsewhere. add_decl(base, props, "i", "i", "is", "i") end decls["n-weak"] = function(base, props) -- "Weak" neuter nouns in -a, e.g. [[auga]] "eye", [[hjarta]] "heart". U-mutation occurs in the nom/acc/dat pl but -- doesn't need to be indicated explicitly because the ending begins with u-. add_decl(base, props, "a", "a", "a", "u") end local function reconstruct_control_spec(control_specs) local parts = {} local function ins(txt) table.insert(parts, txt) end for i, spec in ipairs(control_specs) do if i > 1 then ins(",") end ins(spec.form) if spec.footnotes then for _, footnote in ipairs(spec.footnotes) do ins(footnote) -- already has brackets around it end end end return table.concat(parts) end decls["adj"] = function(base, _props) -- This maps from a slot name constructed from the individual state, case, gender and number properties to the -- actual syncretic slot name used in [[Module:is-adjective]]. local slot_to_syncretic_slot_mapping = { str_nom_m_s = "str_nom_m", str_nom_f_s = "str_nom_f", str_nom_n_s = "str_nom_n", str_acc_m_s = "str_acc_m", str_acc_f_s = "str_acc_f", str_acc_n_s = "str_nom_n", str_dat_m_s = "str_dat_m", str_dat_f_s = "str_dat_f", str_dat_n_s = "str_dat_n", str_gen_m_s = "str_gen_m", str_gen_f_s = "str_gen_f", str_gen_n_s = "str_gen_n", str_nom_m_p = "str_nom_mp", str_nom_f_p = "str_nom_fp", str_nom_n_p = "str_nom_np", str_acc_m_p = "str_acc_mp", str_acc_f_p = "str_nom_fp", str_acc_n_p = "str_nom_np", str_gen_m_p = "str_gen_p", str_gen_f_p = "str_gen_p", str_gen_n_p = "str_gen_p", str_dat_m_p = "str_dat_p", str_dat_f_p = "str_dat_p", str_dat_n_p = "str_dat_p", wk_nom_m_s = "wk_nom_m", wk_nom_f_s = "wk_nom_f", wk_nom_n_s = "wk_n", wk_acc_m_s = "wk_obl_m", wk_acc_f_s = "wk_obl_f", wk_acc_n_s = "wk_n", wk_dat_m_s = "wk_obl_m", wk_dat_f_s = "wk_obl_f", wk_dat_n_s = "wk_n", wk_gen_m_s = "wk_obl_m", wk_gen_f_s = "wk_obl_f", wk_gen_n_s = "wk_n", wk_nom_m_p = "wk_p", wk_nom_f_p = "wk_p", wk_nom_n_p = "wk_p", wk_acc_m_p = "wk_p", wk_acc_f_p = "wk_p", wk_acc_n_p = "wk_p", wk_gen_m_p = "wk_p", wk_gen_f_p = "wk_p", wk_gen_n_p = "wk_p", wk_dat_m_p = "wk_p", wk_dat_f_p = "wk_p", wk_dat_n_p = "wk_p", } local props = {} local function ins(prop) table.insert(props, prop) end for _, spectype in ipairs(m_is_adjective.control_specs) do if base[spectype] then ins(reconstruct_control_spec(base[spectype])) end end -- If a specific reverse u-mutation type was specified and no u-mutation was given, convert the reverse -- u-mutation into a regular u-mutation by chopping off the "un" at the beginning. if base.adj_unumut and not base.umut then ins(base.adj_unumut:sub(3)) end for k, _ in pairs(base.props) do if m_is_adjective.boolean_property_set[k] then ins(k) end end if not base.props.builtin then ins(base.props.iscomp and "-pos" or "-comp") end if base.stem == "#" or base.stem == "##" then ins(base.stem) elseif base.stem then ins("stem:" .. base.stem) end for _, stem in ipairs(m_is_adjective.overridable_stems) do if stem ~= "stem" and base[stem] then ins(("%s:%s"):format(stem, base.stem)) end end local propspec = table.concat(props, ".") if propspec ~= "" then propspec = "<" .. propspec .. ">" end local argspec = base.lemma .. propspec local adj_alternant_multiword_spec = m_is_adjective.do_generate_forms({ argspec }, argspec, "is-ndecl") local function copy(from_slot, to_slot, do_clone) -- We want to avoid sharing form objects (although sharing footnotes is OK, but we don't avoid cloning them -- here) so we can later side-effect form objects as needed. `do_clone` is set to avoid such sharing, -- specifically when the weak form of the adjective is used for both definite and indefinite slots. local source = adj_alternant_multiword_spec.forms[from_slot] if do_clone then source = m_table.deepCopy(source) end base.forms[to_slot] = source end local function copy_gender_number_forms(gender, number) local state = base.adj_is_weak and "wk" or "str" local degree_pref = base.props.iscomp and "comp_" or "" for _, case in ipairs(cases) do local individual_slot = state .. "_" .. case .. "_" .. gender .. "_" .. number local wk_individual_slot = "wk_" .. case .. "_" .. gender .. "_" .. number local syncretic_slot = slot_to_syncretic_slot_mapping[individual_slot] local wk_syncretic_slot = slot_to_syncretic_slot_mapping[wk_individual_slot] if not syncretic_slot then error(("Internal error: Constructed bad individual slot '%s' with no entry in syncretic slot mapping"): format(individual_slot)) end syncretic_slot = degree_pref .. syncretic_slot if not wk_syncretic_slot then error(("Internal error: Constructed bad weak individual slot '%s' with no entry in syncretic slot mapping") : format(wk_individual_slot)) end wk_syncretic_slot = degree_pref .. wk_syncretic_slot copy(syncretic_slot, "ind_" .. case .. "_" .. number) copy(wk_syncretic_slot, "def_" .. case .. "_" .. number, syncretic_slot == wk_syncretic_slot) end end if base.number ~= "pl" then copy_gender_number_forms(base.gender, "s") end if base.number ~= "sg" then copy_gender_number_forms(base.gender, "p") end end local function set_builtin_defaults(base) if base.gender or base.number or base.definiteness then error("Can't specify gender, number or definiteness for built-in terms") end local function builtin_props() -- Return values are GENDER, NUMBER if base.lemma == "ég" or base.lemma == "þú" then return "none", "sg" elseif base.lemma == "við" or base.lemma == "þið" then return "none", "pl" elseif base.lemma == "hann" then return "m", "sg" elseif base.lemma == "hún" then return "f", "sg" elseif base.lemma == "það" then return "n", "sg" elseif base.lemma == "þeir" then return "m", "pl" elseif base.lemma == "þær" then return "f", "pl" elseif base.lemma == "þau" then return "n", "pl" elseif base.lemma == "sig" then return "none", "none" else error(("Unrecognized pronoun '%s'"):format(base.lemma)) end end local gender, number = builtin_props() base.gender = gender base.actual_gender = gender base.number = number base.actual_number = number base.definiteness = "none" end local function determine_builtin_props(base) base.prop_sets[1].stem = { form = "" } base.decl = "builtin" end decls["builtin"] = function(base, props) if base.lemma == "ég" then add_sg_decl(base, props, "mig", "mér", "mín") elseif base.lemma == "þú" then add_sg_decl(base, props, "þig", "þér", "þín") elseif base.lemma == "hann" then add_sg_decl(base, props, "hann", "honum", "hans") elseif base.lemma == "hún" then add_sg_decl(base, props, "hana", "henni", "hennar") elseif base.lemma == "það" then add_sg_decl(base, props, "það", "því", "þess") elseif base.lemma == "við" then add_pl_only_decl(base, props, "okkur", "okkur", "okkar") elseif base.lemma == "þið" then add_pl_only_decl(base, props, "ykkur", "ykkur", "ykkar") elseif base.lemma == "þeir" then add_pl_only_decl(base, props, "þá", "þeim", "þeirra") elseif base.lemma == "þær" then add_pl_only_decl(base, props, "þær", "þeim", "þeirra") elseif base.lemma == "þau" then add_pl_only_decl(base, props, "þau", "þeim", "þeirra") elseif base.lemma == "sig" then -- Underlyingly we handle [[sig]]'s slots as singular. add_decl_with_nom_sg(base, props, false, "*", "sér", "sín", false, false, false, false) else error(("Internal error: Unrecognized pronoun lemma '%s'"):format(base.lemma)) end end -- Return the lemmas for this term. The return value is a list of {form = FORM, footnotes = FOOTNOTES}. -- If `linked_variant` is given, return the linked variants (with embedded links if specified that way by the user), -- otherwies return variants with any embedded links removed. If `remove_footnotes` is given, remove any -- footnotes attached to the lemmas. function export.get_lemmas(alternant_multiword_spec, linked_variant, remove_footnotes) local slots_to_fetch = potential_lemma_slots local linked_suf = linked_variant and "_linked" or "" for _, slot in ipairs(slots_to_fetch) do if alternant_multiword_spec.forms[slot .. linked_suf] then local lemmas = alternant_multiword_spec.forms[slot .. linked_suf] if remove_footnotes then local lemmas_no_footnotes = {} for _, lemma in ipairs(lemmas) do table.insert(lemmas_no_footnotes, { form = lemma.form }) end return lemmas_no_footnotes else return lemmas end end end return {} end local function handle_derived_slots_and_overrides(base) -- Process slot overrides: First slots specified after the gender, then individual slot overrides specified as -- separate indicators. process_slot_overrides(base) -- Compute linked versions of potential lemma slots, for use in {{is-noun}}. We substitute the original lemma -- (before removing links) for forms that are the same as the lemma, if the original lemma has links. for _, slot in ipairs(potential_lemma_slots) do iut.insert_forms(base.forms, slot .. "_linked", iut.map_forms(base.forms[slot], function(form) if form == base.orig_lemma_no_links then if base.orig_lemma:find("%[%[") then return base.orig_lemma elseif not base.is_multiword then return form elseif not base.props.linkasis and (base.lemma ~= base.orig_lemma_no_links or base.link_lowercase) then local lemma_for_linking = base.lemma if base.link_lowercase then local init, rest = rmatch(lemma_for_linking, "^(.)(.*)$") lemma_for_linking = ulower(init) .. rest end return ("[[%s|%s]]"):format(lemma_for_linking, base.orig_lemma_no_links) else return ("[[%s]]"):format(form) end else return form end end)) end end -- Process specs given by the user using 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'. local function process_addnote_specs(base) for _, spec in ipairs(base.addnote_specs) do for _, slot_spec in ipairs(spec.slot_specs) do slot_spec = "^" .. slot_spec .. "$" for slot, forms in pairs(base.forms) do if rfind(slot, slot_spec) then -- To save on memory, side-effect the existing forms. for _, form in ipairs(forms) do form.footnotes = iut.combine_footnotes(form.footnotes, spec.footnotes) end end end end end end local function is_regular_noun(base) return not base.adjspec and not base.props.builtin end local function process_declnumber(base) base.actual_number = base.number if base.declnumber then if base.declnumber == "sg" or base.declnumber == "pl" then base.number = base.declnumber else error(("Unrecognized value '%s' for 'declnumber', should be 'sg' or 'pl'"):format(base.declnumber)) end end end -- Map `fn` over an override spec (either `gens`, `pls` or one of the overrides in `overrides`). `fn` is passed one -- item (the form object of the override), which it can mutate if needed. If it ever returns non-nil, mapping stops -- and that value is returned as the return value of `map_override`; otherwise mapping runs to completion and nil is -- returned. local function map_override(override, fn) if not override then return nil end local function map_one_list(list) if not list then return nil end for _, formobj in ipairs(list) do local retval = fn(formobj) if retval ~= nil then return retval end end return nil end local retval = map_one_list(override.indef) if retval ~= nil then return retval end return map_one_list(override.def) end -- Map `fn` over all override specs in `base` (`gens`, `pls` and the overrides in `overrides`). `fn` is passed one -- item (the form object of the override), which it can mutate if needed. If it ever returns non-nil, mapping stops -- and that value is returned as the return value of `map_override`; otherwise mapping runs to completion and nil is -- returned. local function map_all_overrides(base, fn) for slot, override in pairs(base.overrides) do local retval = map_override(override, fn) if retval ~= nil then return retval end end local retval = map_override(base.gens, fn) if retval ~= nil then return retval end return map_override(base.pls, fn) end -- Like put.split_alternating_runs_and_strip_spaces(), but ensure that backslash-escaped commas and periods are not -- treated as separators. local function split_alternating_runs_with_escapes(segments, splitchar) for i, segment in ipairs(segments) do segment = rsub(segment, "\\,", SUB_ESCAPED_COMMA) segments[i] = rsub(segment, "\\%.", SUB_ESCAPED_PERIOD) end local separated_groups = put.split_alternating_runs_and_strip_spaces(segments, splitchar) for _, separated_group in ipairs(separated_groups) do for i, segment in ipairs(separated_group) do segment = rsub(segment, SUB_ESCAPED_COMMA, ",") separated_group[i] = rsub(segment, SUB_ESCAPED_PERIOD, ".") end end return separated_groups end local function fetch_footnotes(separated_group, parse_err) local footnotes for j = 2, #separated_group - 1, 2 do if separated_group[j + 1] ~= "" then parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'") end if not footnotes then footnotes = {} end table.insert(footnotes, separated_group[j]) end return footnotes end -- Fetch and parse a slot override, e.g. "ar:s" or "um:m[archaic]/um" or "i:!Þorkatli[archaic]" (where ! indicates that -- the override is the full form including the stem); that is, everything after the slot name(s). `segments` is the -- input in the form of a list where the footnotes have been separated out (see `parse_override` below); `spectype` is -- used in error messages and specifies e.g. "genitive" or "dat+gen slot override"; `allow_blank` indicates that a -- completely blank override spec is allowed (in that case, nil will be returned); `defslot`, if true, indicates that -- we're processing a definite slot override, i.e. two slash-separated specs (indefinite and definite) are not allowed -- and the return overrides will be stored into `def`; and `parse_err` is a function of one argument to throw a parse -- error. The return value is an object containing fields `indef` and/or `def`, of the format described below in the -- comment above `parse_override`. local function fetch_slot_override(segments, spectype, allow_blank, defslot, parse_err) if allow_blank and #segments == 1 and segments[1] == "" then return nil end local slash_separated_groups = put.split_alternating_runs_and_strip_spaces(segments, "/") if #slash_separated_groups > 2 then parse_err(("Can specify at most two slash-separated override groups for %s, but saw %s"):format( spectype, #slash_separated_groups)) end if slash_separated_groups[2] and defslot then parse_err(("Can't specify two slash-separated override groups for %s; the second override group is for the definite slot variant, but the slot is already definite") :format( spectype)) end local ret = {} for i, slash_separated_group in ipairs(slash_separated_groups) do local retfield = defslot and "def" or i == 1 and "indef" or "def" if #slash_separated_group == 1 and slash_separated_group[1] == "" then ret[retfield] = false else local colon_separated_groups = put.split_alternating_runs_and_strip_spaces(slash_separated_group, ":") local specs = {} for _, colon_separated_group in ipairs(colon_separated_groups) do local form = colon_separated_group[1] if form == "" then parse_err(("Use - to indicate an empty ending for %s: '%s'"):format(spectype, table.concat(segments))) elseif form == "-" then form = "" elseif form == "--" then -- missing form = "-" end local new_spec = { form = form, footnotes = fetch_footnotes(colon_separated_group, parse_err) } for _, existing_spec in ipairs(specs) do if existing_spec.form == new_spec.form then parse_err("Duplicate " .. spectype .. " spec '" .. table.concat(colon_separated_group) .. "'") end end table.insert(specs, new_spec) end ret[retfield] = specs end end return ret end --[=[ Parse a single override spec (e.g. 'dat-:i/-' or 'nompl+accpl^/' or 'defnompl+defaccpl!sumrin[when referring to summers in general]:!sumurin[when referring to a specific number of summers]') and return two values: the slot(s) the override applies to, and an object describing the override spec. The input is actually a list where the footnotes have been separated out; for example, given the third example spec above, the input will be a list {"defnompl+defaccpl!sumrin", "[when referring to summers in general]", ":!sumurin", "[when referring to a specific number of summers]", ""}. The object returned for 'dat-:i[mostly in the context of violent actions]/-' looks like this: { indef = { { form = "" }, { form = "i", footnotes = {"[mostly in the context of violent actions]"} } }, def = { { form = "" } } } The object returned for '!nompl+accpl^/' looks like this: { indef = { { form = "^" }, }, def = false } The object returned for 'defnompl+defaccpl!sumrin[when referring to summers in general]:!sumurin[when referring to a specific number of summers]' looks like this: { def = { { form = "!sumrin", footnotes = {"[when referring to summers in general]"} }, { form = "!sumurin", footnotes = {"[when referring to a specific number of summers]"} } } } ]=] local function parse_override(segments, parse_err) local part = segments[1] local slots = {} local defslot while true do local this_defslot if part:find("^def") then this_defslot = true part = usub(part, 4) else this_defslot = false end if defslot == nil then defslot = this_defslot elseif defslot ~= this_defslot then parse_err(("When multiple slot overrides are combined with +, all must be definite or indefinite: '%s'"): format(table.concat(segments))) end local case = usub(part, 1, 3) if case_set[case] then -- ok else parse_err(("Unrecognized case '%s' in override: '%s'"):format(case, table.concat(segments))) end part = usub(part, 4) local slot = defslot and "def_" or "" if part:find("^pl") then part = usub(part, 3) slot = slot .. case .. "_p" else slot = slot .. case .. "_s" end table.insert(slots, slot) if part:find("^%+") then part = usub(part, 2) else break end end segments[1] = part local retval = fetch_slot_override(segments, ("%s slot override"):format(table.concat(slots, "+")), false, defslot, parse_err) return slots, retval end local function parse_adjspec(_base, spec, parse_err) local ret = {} local origspec = spec if spec:find("^:") then ret.lemma = spec:sub(2) elseif spec:find("^/") then local from, to = spec:match("^/([^/]*)/([^/]*)$") if from then ret.subspec = { from = from, to = to } else to = spec:match("^/([^/]*)$") if to then ret.subspec = { to = to } else parse_err(("Syntax error in adjective spec 'adj%s': too many slashes"):format(origspec)) end end elseif spec ~= "" then parse_err(("Syntax error in adjective spec 'adj%s'; should be followed only by a colon + lemma or slash " .. "substitution spec, possibly preceded by ^ to indicate lowercasing"):format(origspec)) end return ret end local function parse_inside(base, inside, is_scraped_noun) local function parse_err(msg) error((is_scraped_noun and "Error processing scraped noun spec: " or "") .. msg .. ": <" .. inside .. ">") end local segments = put.parse_balanced_segment_run(inside, "[", "]") local dot_separated_groups = split_alternating_runs_with_escapes(segments, "%.") local isadj = false for i, dot_separated_group in ipairs(dot_separated_groups) do -- Parse a control spec such as "umut,uUmut[rare]" or "-unuUmut,unuUmut" or "imut". This assumes the control -- spec is contained in `dot_separated_group` (already split on brackets) and the result of parsing should go in -- `base[dest]`. `allowed_specs` is a list of the allowed control specs in this group, such as -- {"umut", "Umut", "uumut", "uUmut", "uUUmut", "u_mut"} or {"con", "-con"}. The result of parsing is a list of -- structures of the form { -- form = "FORM", -- footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}, -- }. local function parse_control_spec(dest, allowed_specs) if base[dest] then parse_err(("Can't specify '%s'-type control spec twice; second such spec is '%s'"):format( dest, table.concat(dot_separated_group))) end base[dest] = {} local comma_separated_groups = split_alternating_runs_with_escapes(dot_separated_group, ",") for _, comma_separated_group in ipairs(comma_separated_groups) do local specobj = {} local spec = comma_separated_group[1] if not m_table.contains(allowed_specs, spec) then parse_err(("For '%s'-type control spec, saw unrecognized spec '%s'; valid values are %s"): format(dest, spec, generate_list_of_possibilities_for_err(allowed_specs))) else specobj.form = spec end specobj.footnotes = fetch_footnotes(comma_separated_group, parse_err) table.insert(base[dest], specobj) end end local part = dot_separated_group[1] while true do if i == 1 and not part:find("^adj") and not part:find("^@") and part ~= "builtin" then local comma_separated_groups = split_alternating_runs_with_escapes(dot_separated_group, ",") if #comma_separated_groups > 3 then parse_err(("At most three comma-separated specs are allowed but saw %s"):format( #comma_separated_groups)) end if comma_separated_groups[1][2] then parse_err("Footnotes not allowed on gender indicator") end base.gender = comma_separated_groups[1][1] if not base.gender:find("^[mfn]$") then parse_err(("Unrecognized gender '%s', should be 'm', 'f' or 'n'"):format(base.gender)) end if comma_separated_groups[2] then base.gens = fetch_slot_override(comma_separated_groups[2], "genitive", true, false, parse_err) end if comma_separated_groups[3] then base.pls = fetch_slot_override(comma_separated_groups[3], "nominative plural", true, false, parse_err) end break elseif part == "" then if not dot_separated_group[2] then parse_err("Blank indicator; not allowed without attached footnotes") end base.footnotes = fetch_footnotes(dot_separated_group, parse_err) break elseif part == "addnote" then local spec_and_footnotes = fetch_footnotes(dot_separated_group, parse_err) if #spec_and_footnotes < 2 then parse_err("Spec with 'addnote' should be of the form 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'") end local slot_spec = table.remove(spec_and_footnotes, 1) local slot_spec_inside = rmatch(slot_spec, "^%[(.*)%]$") if not slot_spec_inside then parse_err("Internal error: slot_spec " .. slot_spec .. " should be surrounded with brackets") end local slot_specs = rsplit(slot_spec_inside, ",") -- FIXME: Here, [[Module:it-verb]] called strip_spaces(). Generally we don't do this. Should we? table.insert(base.addnote_specs, { slot_specs = slot_specs, footnotes = spec_and_footnotes }) break elseif ulen(part) > 3 and case_set[usub(part, 1, 3)] or ( ulen(part) > 6 and usub(part, 1, 3) == "def" and case_set[usub(part, 4, 6)]) then local slots, override = parse_override(dot_separated_group, parse_err) for _, slot in ipairs(slots) do if base.overrides[slot] then error(("Two overrides specified for slot '%s'"):format(slot)) else base.overrides[slot] = override end end break end if isadj then if m_is_adjective.parse_for_control_specs(part, parse_control_spec) then break end else if part:find("^[Uu]+_?mut") then parse_control_spec("umut", com.umut_types) break elseif not part:find("^imutval") and part:find("^%-?imut") then parse_control_spec("imut", { "imut", "-imut" }) break elseif part:find("^%-?un[uU]+_?mut") then local unumut_types_and_negated = {} for _, typ in ipairs(com.unumut_types) do table.insert(unumut_types_and_negated, typ) table.insert(unumut_types_and_negated, "-" .. typ) end parse_control_spec("unumut", unumut_types_and_negated) break elseif not part:find("^unimutval") and part:find("^%-?unimut") then parse_control_spec("unimut", { "unimut", "-unimut" }) break elseif part:find("^%-?con") then parse_control_spec("con", { "con", "-con" }) break elseif part:find("^%-?defcon") then parse_control_spec("defcon", { "defcon", "-defcon" }) break elseif not part:find("^já") and part:find("^%-?j") then -- don't trip over .já indicator parse_control_spec("j", { "j", "-j" }) break elseif not part:find("^vstem") and part:find("^%-?v") then parse_control_spec("v", { "v", "-v" }) break end end if #dot_separated_group > 1 then parse_err( ("Footnotes only allowed with slot overrides, negatable indicators and by themselves: '%s'"): format(table.concat(dot_separated_group))) elseif part:find("^adj") then if i > 1 then parse_err("Adjective spec must be the first indicator") end if base.adjspec then parse_err("Can't specify two adjective specs") end isadj = true base.adjspec = parse_adjspec(base, part:sub(4), parse_err) break elseif part:find("^[mfn]$") then if base.gender then parse_err("Can't specify gender twice") end base.gender = part break elseif not isadj and (part:find("^decllemma%s*:") or part:find("^declgender%s*:") or part:find("^declnumber%s*:")) then local field, value = part:match("^(decl[a-z]+)%s*:%s*(.+)$") if not value then parse_err(("Syntax error in decllemma/declgender/declnumber indicator: '%s'"):format(part)) end if base[field] then parse_err(("Can't specify '%s:' twice"):format(field)) end base[field] = value break elseif part:find("^q%s*:") or part:find("header%s*:") then local field, value = part:match("^(q)%s*:%s*(.+)$") if not value then field, value = part:match("^(header)%s*:%s*(.+)$") end if not value then parse_err(("Syntax error in q/header indicator: '%s'"):format(part)) end if base[field] then parse_err(("Can't specify '%s:' twice"):format(field)) end base[field] = value break elseif not isadj and part:find("^@") then -- FIXME: Implement adjective scraping if base.scrape_spec then parse_err("Can't specify scrape directive '@...' twice") end if part:find(":") then base.scrape_is_suffix, base.scrape_spec, base.scrape_id = part:match("^@(%-?)(.-)%s*:%s*(.+)$") else base.scrape_is_suffix, base.scrape_spec = part:match("^@(%-?)(.-)$") end -- If we saw a hyphen, set `scrape_is_suffix` to true, otherwise false base.scrape_is_suffix = base.scrape_is_suffix == "-" if not base.scrape_spec or base.scrape_spec == "" then parse_err(("Syntax error in scrape directive '%s"):format(part)) end local scrape_init, scrape_rest = rmatch(base.scrape_spec, "^(.)(.*)$") local lower_scrape_init = ulower(scrape_init) if ulower(scrape_init) ~= scrape_init then base.scrape_is_uppercase = true base.scrape_spec = lower_scrape_init .. scrape_rest end break elseif part:find(":") then local spec, value = part:match("^([a-z]+)%s*:%s*(.+)$") if not spec then parse_err(("Syntax error in indicator with value, expecting alphabetic slot or stem/lemma " .. "override indicator: '%s'"):format(part)) end local stem_set = isadj and m_is_adjective.overridable_stem_set or overridable_stem_set if not stem_set[spec] then parse_err(("Unrecognized stem override indicator '%s', should be %s"):format( part, generate_list_of_possibilities_for_err( isadj and m_is_adjective.overridable_stems or overridable_stems))) end if base[spec] then if spec == "stem" then parse_err("Can't specify spec for 'stem:' twice (including using 'stem:' along with # or ##)") else parse_err(("Can't specify '%s:' twice"):format(spec)) end end base[spec] = value break elseif part == "#" or part == "##" then if base.stem then parse_err("Can't specify a stem spec ('stem:', # or ##) twice") end base.stem = part break elseif part == "sg" or part == "pl" or part == "both" then if base.number then if base.number ~= part then parse_err("Can't specify '" .. part .. "' along with '" .. base.number .. "'") else parse_err("Can't specify '" .. part .. "' twice") end end base.number = part break elseif part == "indef" or part == "def" or part == "bothdef" then if base.definiteness then if base.definiteness ~= part then parse_err(("Can't specify two conflicting definiteness values; saw '%s' (%s) when existing " .. "definiteness is %s"):format(part, definiteness_code_to_desc[part], definiteness_code_to_desc[base.definiteness])) else parse_err("Can't specify '" .. part .. "' twice") end end base.definiteness = part break elseif not isadj and (part == "weak" or part == "iending" or part == "rstem" or part == "já" or part == "linkasis") or isadj and (m_is_adjective.boolean_property_set[part] or part == "iscomp") or part == "proper" or part == "common" or part == "dem" or part == "builtin" or part == "indecl" or part == "decl?" then if base.props[part] then parse_err("Can't specify '" .. part .. "' twice") end base.props[part] = true break elseif part == "~" then if base.link_lowercase then parse_err("Can't specify '~' twice") end base.link_lowercase = true break elseif isadj and m_table.contains(com.unumut_types, part) then if base.adj_unumut then parse_err("Can't specify two values for reverse u-mutation spec with adjectives") end base.adj_unumut = part break end parse_err("Unrecognized indicator '" .. part .. "'") end end return base end -- Set some defaults (e.g. number and definiteness) now, because they (esp. the number) may be needed -- below when determining how to merge scraped and user-specified properies. local function set_early_base_defaults(base) if is_regular_noun(base) then local function check_err(msg) error(("Lemma '%s': %s"):format(base.lemma, msg)) end if not base.gender then check_err("Internal error: For nouns, gender must be specified") end base.number = base.number or is_proper_noun(base, base.lemma) and "sg" or base.gender == "m" and (base.lemma:find("skapur$") or base.lemma:find("naður$")) and not base.stem and "sg" or "both" base.definiteness = base.definiteness or is_proper_noun(base, base.lemma) and "indef" or "bothdef" process_declnumber(base) base.actual_gender = base.gender if base.declgender then if not base.declgender:find("^[mfn]$") then check_err(("Unrecognized gender '%s' for 'declgender:', should be 'm', 'f' or 'n'"):format( base.declgender)) end base.gender = base.declgender end end end local function parse_inside_and_merge(inside, lemma, scrape_chain) local function parse_err(msg) error(msg .. ": <" .. inside .. ">") end if #scrape_chain >= 10 then local linked_scrape_chain = {} for _, element in ipairs(scrape_chain) do table.insert(linked_scrape_chain, "[[" .. element .. "]]") end parse_err(("Probable infinite loop in scraping; scrape chain is [[%s]] -> %s"):format(lemma, table.concat(linked_scrape_chain, " -> "))) end local base = create_base() base.lemma = lemma base.scrape_chain = scrape_chain parse_inside(base, inside, #scrape_chain > 0) if not base.scrape_spec then -- If we're not scraping the declension from another noun, just return the parsed `base`. -- But don't set early defaults if we're being scraped because it interferes with overriding the number -- and/or definiteness by the noun that is scraping us. if #scrape_chain == 0 then set_early_base_defaults(base) end return base else local retval = com.find_inflection_given_scrape_spec { lemma = lemma, scrape_spec = base.scrape_spec, scrape_is_suffix = base.scrape_is_suffix, scrape_is_uppercase = base.scrape_is_uppercase, infltemp = "is-ndecl", allow_empty_infl = false, inflid = base.scrape_id, parse_off_ending = com.parse_off_final_nom_ending, } local prefix, base_noun, declspec, errmsg = retval.prefix, retval.base_lemma, retval.infl, retval.errmsg if errmsg then base.prefix = prefix base.base_noun = base_noun base.scrape_error = errmsg return base end -- Parse the inside spec from the scraped noun (merging any sub-scraping specs), and copy over the -- user-specified properties on top of it. table.insert(scrape_chain, base_noun) local inner_base = parse_inside_and_merge(declspec.infl, base_noun, scrape_chain) inner_base.lemma = lemma inner_base.prefix = prefix inner_base.base_noun = base_noun -- Add `prefix` to a full variant of the base noun (e.g. a stem spec or full override). We may need -- to adjust the variant to take into account the base noun being a suffix and/or uppercase (e.g. when -- we use [[-dómur]] to generate the inflection of [[vísdómur]] or [[Björn]] to generate the inflection -- of [[Ásbjörn]]). local function add_prefix(form) if base.scrape_is_suffix then form = form:gsub("^%-", "") end if base.scrape_is_uppercase then local first, rest = rmatch(form, "^(.)(.*)$") if first then form = ulower(first) .. rest end end return prefix .. form end -- If there's a prefix, add it now to all the full overrides in the scraped noun, as well as 'decllemma' -- and all stem overrides. if prefix ~= "" then map_all_overrides(inner_base, function(formobj) -- Not if the override contains # or ##, which expand to the full lemma (possibly minus -r -- or -ur). if formobj.form:find("^!") and not formobj.form:find("#") then formobj.form = "!" .. add_prefix(usub(formobj.form, 2)) end end) if inner_base.decllemma then inner_base.decllemma = add_prefix(inner_base.decllemma) end for _, stem in ipairs(overridable_stems) do -- Only actual stems, not (un)imutval; and not if the stem contains # or ##, which -- expand to the full lemma (possibly minus -r or -ur). if inner_base[stem] and stem:find("stem$") and not inner_base[stem]:find("#") then inner_base[stem] = add_prefix(inner_base[stem]) end end end local function copy_properties(plist) -- Copy various properties. for _, prop in ipairs(plist) do if base[prop] ~= nil then inner_base[prop] = base[prop] end end end copy_properties(control_specs) copy_properties(overridable_stems) copy_properties { "gens", "pls", "gender", "number", "definiteness", "decllemma", "declgender", "declnumber", "q", "header", "link_lowercase" } inner_base.footnotes = iut.combine_footnotes(inner_base.footnotes, base.footnotes) -- Copy addnote specs. for _, prop_list in ipairs { "addnote_specs" } do for _, prop in ipairs(base[prop_list]) do m_table.insertIfNot(inner_base[prop_list], prop) end end -- Now copy remaining user-specified specs into the scraped noun `base`. for _, prop_table in ipairs { "overrides", "props" } do for slot, prop in pairs(base[prop_table]) do inner_base[prop_table][slot] = prop end end -- Now determine the defaulted number and definiteness (after copying relevant settings -- but before the check just below that relies on `inner_base.number` being set). set_early_base_defaults(inner_base) -- If user specified 'sg', cancel out any pl overrides, otherwise we'll get an error. if inner_base.number == "sg" then inner_base.pls = nil for slot, _ in pairs(inner_base.overrides) do if slot:find("_p$") then inner_base.overrides[slot] = nil end end end return inner_base end end --[=[ Parse an indicator spec (text consisting of angle brackets and zero or more dot-separated indicators within them). Return value is an object of the form indicated in the comment above create_base(). ]=] local function parse_indicator_spec(angle_bracket_spec, lemma, pagename) if lemma == "" then lemma = pagename end local inside = rmatch(angle_bracket_spec, "^<(.*)>$") assert(inside) local orig_lemma = lemma local orig_lemma_no_links = m_links.remove_links(lemma) lemma = orig_lemma_no_links local base = parse_inside_and_merge(inside, lemma, {}) base.orig_lemma = orig_lemma base.orig_lemma_no_links = orig_lemma_no_links return base end -- Determine if the term has more than one word in it. Normally we just look at the number of words -- at top level. However, it's possible to have a single alternant at top level with multiple words -- in one of the arms, e.g. the equivalent of ((rēspūblica<>,rēs<>pūblica<>)). So if there's only one -- top-level "word" and it's an alternant, check the length of each arm. We also need to check for -- before-text and post-text if there's only one inflected term. local function compute_is_multiword(alternant_multiword_spec) if #alternant_multiword_spec.alternant_or_word_specs > 1 or alternant_multiword_spec.post_text ~= "" then return true end local alternant_or_word_spec = alternant_multiword_spec.alternant_or_word_specs[1] if alternant_or_word_spec.alternants then for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do if #multiword_spec > 1 or multiword_spec.post_text ~= "" or multiword_spec[1] and multiword_spec[1].before_text ~= "" then return true end end end if alternant_or_word_spec.before_text ~= "" then return true end return false end local function set_defaults_and_check_bad_indicators(base) local function check_err(msg) error(("Lemma '%s': %s"):format(base.lemma, msg)) end -- Set default values. local regular_noun = is_regular_noun(base) if not base.adjspec and base.props.builtin then set_builtin_defaults(base) end if not regular_noun and not base.adjspec then for _, control_spec in ipairs(control_specs) do if base[control_spec] then check_err(("'%s' cannot be specified with pronouns"):format(control_spec)) end end end if not regular_noun then if base.declgender then check_err("'declgender' can only be specified with regular nouns") end return end -- Check for bad indicator combinations. if base.imut and base.unimut then check_err("'imut' and 'unimut' specs cannot be specified together") end if base.umut and base.unumut then check_err("'umut' and 'unumut' specs cannot be specified together") end if base.unimut and base.unumut then check_err("'unimut' and 'unumut' specs cannot be specified together") end if base.declnumber == "pl" and (base.gens or base.pls) then check_err("Cannot set genitive or plural specs after the gender in plural-only lemmas") end if base.plvstem and not base.plstem then check_err("When 'plvstem:' given, 'plstem:' must also be given") end -- Compute whether i-mutation stems are needed. -- First check for 'imut' set by user. if not base.need_imut then -- might be set by the detected declension if base.imut then for _, formobj in ipairs(base.imut) do if formobj.form == "imut" then base.need_imut = true break end end end end -- Then check for 'unimut' set by user. if not base.need_imut then if base.unimut then for _, formobj in ipairs(base.unimut) do if formobj.form == "unimut" then base.need_imut = true break end end end end -- Then check all overrides for any beginning with a single ^. if not base.need_imut then map_all_overrides(base, function(formobj) if formobj.form:find("^%^") and not formobj.form:find("^%^%^") then base.need_imut = true return true end end) end if base.imutval and not base.need_imut then check_err("'imutval:...' specified but 'imut' and 'unimut' not specified and no forms need i-mutation") end if base.unimutval and not base.need_imut then check_err("'unimutval:...' specified but 'imut' and 'unimut' not specified and no forms need i-mutation") end end local function set_all_defaults_and_check_bad_indicators(alternant_multiword_spec) -- Used when determining how to link definite-only and plural-only nouns. alternant_multiword_spec.is_multiword = compute_is_multiword(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) base.is_multiword = alternant_multiword_spec.is_multiword set_defaults_and_check_bad_indicators(base) for _, global_prop in ipairs { "q", "header" } do if base[global_prop] then if alternant_multiword_spec[global_prop] == nil then alternant_multiword_spec[global_prop] = base[global_prop] elseif alternant_multiword_spec[global_prop] ~= base[global_prop] then error(("With multiple words or alternants, set '%s' on only one of them or make them all agree"): format(global_prop)) end end end if base.props.builtin then alternant_multiword_spec.saw_builtin = true else alternant_multiword_spec.saw_non_builtin = true end if base.props.indecl then alternant_multiword_spec.saw_indecl = true else alternant_multiword_spec.saw_non_indecl = true end if base.props["decl?"] then alternant_multiword_spec.saw_unknown_decl = true else alternant_multiword_spec.saw_non_unknown_decl = true end end) end local function expand_property_sets(base) base.prop_sets = { {} } -- Construct the prop sets from all combinations of control specs, in case any given spec has more than one -- possibility. for _, control_spec in ipairs(control_specs) do local specvals = base[control_spec] -- Handle unspecified control specs. if not specvals then specvals = { false } end if #specvals == 1 then for _, prop_set in ipairs(base.prop_sets) do -- Convert 'false' back to nil prop_set[control_spec] = specvals[1] or nil end else local new_prop_sets = {} for _, prop_set in ipairs(base.prop_sets) do for _, specval in ipairs(specvals) do local new_prop_set = m_table.shallowCopy(prop_set) new_prop_set[control_spec] = specval table.insert(new_prop_sets, new_prop_set) end end base.prop_sets = new_prop_sets end end end -- Return the most likely ending to add to a stem form (e.g. from the feminine singular or the plural) to -- to get the lemma form (masculine singular). -- We use the following rules: -- 1. Stems in -nn or -ll take -ur. -- 2. Stems in -Vn or -Vl double the last letter, but not if this will result in contraction (the default -- for nouns in -[aiu]nn and -[aiu]ll, but for adjectives only in -inn), in which case -ur is added. -- 3. Stems in -Cn, -Cl, -r or -s remain unchanged. -- 4. Stems in a vowel add -r. -- 5. Remaining stems add -ur. -- Exceptional lemma forms for adjectives will need to be handled through a slash substitution spec or by -- directly specifying the lemma after a colon. local function stem_to_masc_sg_lemma_ending(stem, isadj) if stem:find("nn$") or stem:find("ll$") then return "ur" elseif not isadj and (stem:find("a[nl]$") or stem:find("[^eE]i[nl]$") or stem:find("[^aA]u[nl]$")) or isadj and stem:find("[^eE]in$") then return "ur" elseif stem:find(com.vowel_c .. "[nl]$") then return stem:sub(-1) elseif stem:find("[nlrs]$") then return "" elseif rfind(stem, com.vowel_c .. "$") then return "r" else return "ur" end end -- For a plural-only lemma, synthesize a likely singular lemma. It doesn't have to be theoretically correct as long as -- it generates all the correct plural forms. local function synthesize_singular_lemma(base) local lemma_determined -- Loop over all property sets in case the user specified multiple ones (e.g. using different control specs). If -- we try to reconstruct different lemmas for different property sets, we'll throw an error below. for _, props in ipairs(base.prop_sets) do local function interr(msg) error(("Internal error: For lemma '%s', %s: %s"):format(base.lemma, msg, dump(props))) end -- `ending` refers to the plural ending but is not currently used much. Instead, in add_decl(), when we process -- pl-only terms, we set the nom_pl to "*" so that the lemma is used directly. local stem, lemma, ending, sg_ending, default_unumut if base.gender == "m" or base.gender == "f" then stem, ending = rmatch(base.lemma, "^(.*)([aiu]r)$") if stem then -- masc: -- -- [[tónleikar]] "concert"; [[feðgar]] "father and son"; [[hafrar]] "oats" (dat pl höfrum); -- [[fjármunir]] "goods, property"; [[Fljótsdælir]] "inhabitants of Fljótsdalur (a valley)" -- (occurs definite, needs 'dem', no unimut); [[Ásmegir]] "sons of the Gods" (occurs definite, dat -- pl Ásmögum, gen pl Ásmaga, i.e. needs 'def' and 'unimut'); similarly [[ljóðmegir]]; -- [[buskuleggir]] "?" (has 'j' in dat pl [[buskuleggjum]], gen pl [[buskuleggja]]; [[Bekkir]] -- (place name; has 'j' in dat pl [[Bekkjum]], gen pl [[Bekkja]]) -- -- fem: -- [[frönskur]] "French fries" (with unumut); [[hjólbörur]] "wheelbarrow" (with unumut); [[buxur]] -- "trousers, pants", [[hættur]] "bedtime; quitting time" (with unimut); [[herðar]] "shoulders"; -- [[limar]] "branches"; [[öfgar]] "exaggeration, extreme" (no unumut); [[drefjar]] -- "stains, traces"; [[viðjar]] "chains, fetters"; many others in -jar, but the -j- is throughout -- the plural; [[svalir]] "balcony; porch"; [[dyr]] "doorway" (uses decllemma:dyrir) if ending == "ur" then -- FIXME: Does -ur as masculine plural ending occur? What should the singular be? sg_ending = base.gender == "f" and "a" or nil default_unumut = "unumut" else sg_ending = base.gender == "f" and "" or nil end if not sg_ending then sg_ending = stem_to_masc_sg_lemma_ending(stem) end elseif base.lemma:find("ær$") then -- [[barnatær]], [[fultær]], proper name [[Tær]] stem = base.lemma sg_ending = "" else error(("Masculine or feminine plural-only lemma '%s' should end in -ar, -ir or -ur"):format(base.lemma)) end elseif base.gender == "n" then -- Neuters in -i. Examples: [[fræði]] "branch of knowledge", [[jafndægri]] "equinox", [[meðmæli]] -- "recommendation", [[sannindi]] "truth", [[skæri]] "pair of scissors", [[vísindi]] "knowedge, learning". -- unimut is possible and occurs in [[læti]] "behavior, demeanor", [[ólæti]] "noise, racket". stem, ending = rmatch(base.lemma, "^(.*[^eE])(i)$") if stem then sg_ending = "i" end if not stem then -- Weak neuters in -u like [[gleraugu]] "glasses/spectacles". stem, ending = rmatch(base.lemma, "^(.*[^aA])(u)$") if stem then sg_ending = "a" default_unumut = "unumut" end end if not stem then -- Generally, plural will look like singular, with no ending in the plural (but there will be umut -- if possible). Examples: [[feðgin]] "father and daughter", [[hjón]] "married couple", [[jól]] -- "Christmas", [[lok]] "end"; [[jarðgöng]] "tunnel" needing 'unumut'. stem = base.lemma sg_ending = "" default_unumut = "unumut" end else interr(("unrecognized gender '%s'"):format(base.gender)) end if default_unumut and not props.unumut and not props.umut and not props.unimut then props.unumut = { form = default_unumut, defaulted = true } end if props.unumut and props.unimut then interr("shouldn't see both 'unumut' and 'unimut' set in plural-only lemma") end if props.unumut and props.unumut.form:find("^un") then stem = apply_reverse_u_mutation(stem, props.unumut.form, not props.unumut.defaulted) if props.umut then interr("shouldn't see both 'unumut' and 'umut' set in plural-only lemma") end props.umut = { form = rsub(props.unumut.form, "^un", ""), footnotes = props.unumut.footnotes, defaulted = props.unumut.defaulted } props.unumut = nil end if props.unimut and props.unimut.form:find("^un") then stem = apply_reverse_i_mutation(stem, base.unimutval, "error if unmatchable") if props.imut then interr("shouldn't see both 'unimut' and 'imut' set in plural-only lemma") end props.imut = { form = rsub(props.unimut.form, "^un", ""), footnotes = props.unimut.footnotes } props.unimut = nil end lemma = stem .. sg_ending if lemma_determined and lemma_determined ~= lemma then error(("Attempt to set two different singular lemmas '%s' and '%s'"):format(lemma_determined, lemma)) end lemma_determined = lemma end base.lemma = lemma_determined base.lemma_ending = ending or "" end -- For a nominative definite lemma, synthesize the corresponding indefinite lemma. Note that a plural definite lemma may -- need to be processed twice, first to convert to plural indefinite and then to convert to singular indefinite using -- synthesize_singular_lemma(). local function synthesize_indefinite_lemma(base) local lemma_determined -- Loop over all property sets in case the user specified multiple ones (e.g. using different control specs). If -- we try to reconstruct different lemmas for different property sets, we'll throw an error below. for _, props in ipairs(base.prop_sets) do local function interr(msg) error(("Internal error: For lemma '%s', %s: %s"):format(base.lemma, msg, dump(props))) end -- There are only 6 clitic articles, depending on the combination of gender and number: -- singular: m = -inn, f = -in, n = -ið; plural: m = -nir, f = -nar, n = -in. The two beginning in n- aren't -- problematic because in all cases they simply append to the actual form. The remaining four, however, drop -- the i- before an ending [aiu]. This means we can uniquely reconstruct the dropped vowel if we see e.g. -- -að or -uð in place of -ið. But if we see -ið, we don't know whether the lemma ended in -i or a consonant. -- And in general it's important to know because it affects some forms; e.g. compare definite neuter 'knippið' -- from [[knippi]] "bundle, bunch" with 'klappið' from [[klapp]] "applause; pat, stroke". The former has -- definite genitive 'knippisins' and the latter 'klappsins'. And in fact, all three genders commonly have -- both consonant-ending and i-ending nouns in the singular. This means we need an indicator to distinguish -- them. Probably easiest is 'iending'; reusing 'weak' won't work so well because neuters in -i, and sometimes -- feminines in -i, are considered strong. local function process_n_clitic(clitic) local lemma = base.lemma:match("^(.*)" .. clitic .. "$") if not lemma then error(("Lemma '%s' declared as %s %s should end in clitic '-%s'"):format(base.lemma, gender_code_to_desc[base.gender] or "NONE", number_code_to_desc[base.number] or "NONE", clitic)) end return lemma end local function process_i_clitic(clitic) local clitic_cons_end = clitic:match("^i(.*)$") if not clitic_cons_end then interr(("clitic '%s' should begin with 'i'"):format(clitic)) end local lemma_begin, ending = base.lemma:match("^(.*)([aiu])" .. clitic_cons_end .. "$") if not lemma_begin then error(("Lemma '%s' declared as %s %s should end in clitic '-%s' or in '-a%s' or '-u%s'"):format( base.lemma, gender_code_to_desc[base.gender] or "NONE", number_code_to_desc[base.number] or "NONE", clitic, clitic_cons_end, clitic_cons_end)) end if ending == "a" or ending == "u" then if base.props.iending then error(("Property 'iending' cannot be specified because definite lemma '%s' does not end in '-%s'"): format(base.lemma, clitic)) end return lemma_begin .. ending end if base.props.iending then return lemma_begin .. "i" else return lemma_begin end end local clitic = clitic_articles[base.gender]["nom_" .. (base.number == "pl" and "p" or "s")] local lemma if clitic:find("^n") then lemma = process_n_clitic(clitic) else lemma = process_i_clitic(clitic) end if lemma_determined and lemma_determined ~= lemma then error(("Attempt to set two different indefinite lemmas '%s' and '%s'"):format(lemma_determined, lemma)) end lemma_determined = lemma end base.lemma = lemma_determined base.lemma_ending = "" end -- For an adjectival lemma, synthesize the masc singular form. local function synthesize_adj_lemma(base) if base.props.indecl then base.decl = "indecl" return elseif base.props["decl?"] then base.decl = "decl?" return else base.decl = "adj" local adjspec = base.adjspec if not adjspec then error("Internal error: synthesize_adj_lemma() called without a parsed adjective spec in `base.adjspec`") end if adjspec.lemma then base.lemma = adjspec.lemma elseif adjspec.subspec then local from, to = adjspec.subspec.from, adjspec.subspec.to if from then local beginpart = base.lemma:match("^(.*)" .. m_string_utilities.pattern_escape(from) .. "$") if not beginpart then error(("Adjective slash substitution spec '/%s/%s' didn't match form '%s'"):format( from, to, base.lemma)) end base.lemma = beginpart .. to else local num_to_remove if base.number == "pl" then num_to_remove = (base.gender == "m" or base.gender == "f") and 2 or 0 elseif base.gender == "m" then error(("Single-part adjective slash substitution spec '/%s' not allowed with masculine-singular " .. "adjective form '%s'; if necessary, use a two-part spec or specify the lemma directly after " .. " a colon"):format(from, base.lemma)) else num_to_remove = base.gender == "f" and 0 or 1 end base.lemma = usub(base.lemma, 1, -num_to_remove - 1) .. to end else local stem, stem_is_lemma if base.props.iscomp then base.adj_is_weak = true if base.number ~= "pl" and base.gender == "n" then stem = base.lemma:match("^(.*)a$") if not stem then error(("Neuter singular weak comparative adjective form should end in -a: %s" ):format(base.lemma)) end stem = stem .. "i" else if not base.lemma:find("i$") then error(("Plural or masculine/feminine singular weak comparative adjective form should " .. "end in -i: %s"):format(base.lemma)) end stem = base.lemma end stem_is_lemma = true elseif base.number == "pl" then stem = base.lemma:match("^(.*[^Aa])u$") if stem then base.adj_is_weak = true end if not stem then if base.gender == "m" then stem = base.lemma:match("^(.*)ir$") if not stem then error(("Masculine plural strong adjective form should end in -ir: %s"):format(base.lemma)) end elseif base.gender == "f" then stem = base.lemma:match("^(.*)ar$") if not stem then error(("Feminine plural strong adjective form should end in -ar: %s"):format(base.lemma)) end else stem = base.lemma end end else if base.gender == "m" then stem = base.lemma:match("^(.*[^Ee])i$") if stem then base.adj_is_weak = true else -- Otherwise the form is strong and should remain as is. stem = base.lemma stem_is_lemma = true end elseif base.gender == "f" or base.gender == "n" then stem = base.lemma:match("^(.*)a$") if stem then base.adj_is_weak = true end if not stem then if base.gender == "n" then error(("No automatic rules for inferring the adjective lemma from strong neuter form " .. "'%s'; you must use a slash substitution spec such as 'tvöfalt<adj/dur>' (which " .. "chops off the last letter and replaces it with 'dur') or 'ryðfrítt<adj/tt/r>' " .. "(which chops off 'tt' and replaces it with 'r'), or directly specify the lemma " .. "using e.g. 'tvö<adj:tveir>'" ):format(base.lemma)) else stem = base.lemma end end end end if not stem_is_lemma then if base.adj_unumut then stem = apply_reverse_u_mutation(stem, base.adj_unumut, "error if unmatchable") end base.lemma = stem .. stem_to_masc_sg_lemma_ending(stem) else base.lemma = stem end end end end -- Determine the declension and stem based on the lemma and gender. The declension is set in base.decl and the stem in -- base.stem if not already set by the user. local function determine_declension(base) local stem = nil local ending local default_props = {} -- Determine declension if base.props.indecl then base.decl = "indecl" stem = base.lemma elseif base.props["decl?"] then base.decl = "decl?" stem = base.lemma elseif base.gender == "m" then if not stem then stem, ending = rmatch(base.lemma, "^(.*[ÁáÆæ])(r)$") if stem then -- in -ár: -- [[nár]] "corpse", [[sár]] "tub (archaic)", [[hár]] "thole, oarlock (archaic)", [[hár]] -- "spiny dogfish (archaic)" (with v-infix), [[kljár]] "weaving stone (archaic)", [[ljár]] "scythe", -- [[skjár]] "video screen, display", [[már]] "seagull", [[sjár]] "sea", [[snjár]] "snow" (with -- v-infix); vs. stems ending in -r: [[ár]] "? (archaic)", [[lár]] "wooden box for wool", [[klár]] -- "inferior horse, nag", [[pílár]] "slat, fence post; spoke (dated)", [[kentár]] "centaur" -- -- in -ær: -- [[glær]] "sea", [[skær]] "? (obsolete)", [[blær]] "gentle breeze", [[bær]] "farm; town", [[óbær]] -- "?", [[sær]] "sea", [[snær]] "snow" -- -- We used to also drop -r by default from the stem in -ýr words, but this doesn't make sense for -- adjectives and only half makes sense for nouns, so we don't do it any more. We have stems without -r: -- [[ýr]] "yew", [[býr]] "town, farm", [[gnýr]] "clash, rumble; blue wildebeest", [[týr]] "hero; god", -- also many proper names; vs. stems ending in -r: [[fýr]] "dude, guy", [[lýr]] "pollock", [[sýr]] -- "? (poetic)", [[ýr]] "? (obsolete)", [[hlýr]] "? (obsolete)", [[glýr]] "? (obsolete)" base.decl = "m" end end if not stem then stem = rmatch(base.lemma, "^(.*[Aa]ur)$") if stem then -- [[maur]] "ant", [[aur]] "loam, mud", [[gaur]] "ruffian", [[paur]] "devil; enmity", -- [[saur]] "dirt; excrement", [[staur]] "post", [[ljósastaur]] "lamp post" base.decl = "m" end end if not stem then -- There must be at least one vowel; lemmas like [[bur]] don't count. stem, ending = rmatch(base.lemma, "^(.*" .. com.vowel_or_hyphen_c .. ".*)(ur)$") if stem then if stem:find("skap$") and not base.stem then -- tons of words in -skapur base.decl = "m-skapur" elseif stem:find("nað$") and not base.stem then -- lots of words in -naður base.decl = "m-naður" default_props.umut = "uUmut" else if base.stem == base.lemma then -- [[akur]] "field" etc. where the stem includes the final -r stem = base.stem ending = "" -- not actually used default_props.con = "con" end -- [[hestur]] "horse" and lots of others base.decl = "m" end end end if not stem then stem = rmatch(base.lemma, "^(.*[Ee][iy]r)$") if stem then -- in -eir (all include -r in the stem): -- [[geir]] "?", [[eir]] "copper", [[leir]] "clay", [[Geir]] (male given name) -- -- in -eyr, including -r in the stem: -- [[reyr]] "reed", [[Reyr]] (male given name) -- in -eyr, not including -r in the stem: -- [[þeyr]] "thaw, thawing wind", [[Þeyr]] (male given name), [[Freyr]] (male given name) base.decl = "m" end end if not stem then -- There must be at least one vowel (although there don't appear to be any single-syllable -- lemmas ending in -ir other than in -eir). stem, ending = rmatch(base.lemma, "^(.*" .. com.vowel_or_hyphen_c .. ".*)(ir)$") if stem then -- [[læknir]] "physician" and many others -- [[bróðir]], [[faðir]] are r-stems if base.props.rstem then base.decl = "m-rstem" base.need_imut = true else base.decl = "m-ir" end end end if not stem then stem, ending = rmatch(base.lemma, "^(.*l)(l)$") if stem then if is_proper_noun(base, stem) and stem:find("kel$") then base.decl = "m-kell" else if not base.stem and (rfind(stem, com.cons_c .. "[aiu]l$") or stem:find("^[aiuAIU]l$")) then -- [[gaffall]] "fork" (dat pl [[göfflum]]), [[þumall]] "thumb"; [[ekkill]] "widower"; -- [[spegill]] "mirror"; [[segull]] "magnet"; [[öxull]] "axis; axle"; etc. Note that the check -- for a consonant preceding the a/i/u is important as there are words like [[manúall]] -- "manual", [[ritúall]] "ritual", [[kokteill]] "cocktail", [[feill]] "flaw, error", [[deill]] -- "dispute???" (rare, regional), [[haull]] "hernia", [[straull]] "? (rare, regional)" that -- don't have contraction. Beware of the rare word [[síill]] "sieve? strainer?" that per BÍN -- does contract to síl- before vowels. Currently the code to handle contraction will throw an -- error if you attempt to contract that word, but you can use 'vstem:...'. -- -- There are also lots of words in a vowel other than a/i/u followed by -ll, such as [[bíll]] -- "car", [[áll]] "eel", [[konsúll]] "consul", [[þræll]] "slave", [[hvoll]] "hill", [[stóll]] -- "chair", etc. In these, the final -l is the nominative singular ending, as above. -- -- Note that if the user overrode the stem (e.g. using '#' as with [[Ármann]]), we don't -- default to contraction as it may cause an error to be thrown. default_props.con = "con" end base.decl = "m" end end end if not stem then stem, ending = rmatch(base.lemma, "^(.*n)(n)$") if stem then if not base.stem and (rfind(stem, com.cons_c .. "[aiu]n$") or stem:find("^[aiuAIU]n$")) then -- As with -all/-ill/-ull although there are fewer such words in -nn. Examples: [[aftann]] "evening" -- (dat pl öftnum), [[arinn]] "hearth, fireplace" (dat pl örnum), [[drottinn]] "lord", [[himinn]] -- "sky, heaven", [[morgunn]] "morning", [[jötunn]] "giant", etc. -- -- There are also lots of words in a vowel other than a/i/u followed by -nn, such as [[fleinn]] -- "spear", [[steinn]] "rock", [[prjónn]] "knitting needle", [[daunn]] "stink", [[húnn]] "knob". -- In these, the final -n is the nominative singular ending, as above. -- -- Note that if the user overrode the stem (e.g. using '#' as with [[Ármann]]), we don't default -- to contraction as it may cause an error to be thrown. default_props.con = "con" end base.decl = "m" end end if not stem and not base.props.weak then stem, ending = rmatch(base.lemma, "^(.*[aóæ]nd)(i)$") if stem then -- [[nemandi]] "student" and many others; terms in -jandi like [[byrjandi]] -- "beginner", [[seljandi]] "seller" umlaut to -jend- in the plural instead of -ind- -- also terms in -óndi (probably all compounds of [[bóndi]] "farmer") and in -ændi -- (probably all compounds of [[frændi]]). Terms like [[andi]] "breath, spirit" and -- [[heiðasandi]] "heath sand?" need '.weak' to disable this, as does [[fjandi]] in -- the meaning "devil, demon" (vs. "enemy", which has plural [[fjendur]]). Terms like -- [[vandi]] "trouble; responsibility; custom, habit" and compounds are singular-only. base.decl = "m-ndi" if not stem:find("ænd$") then base.need_imut = true end if stem:find("jand$") then default_props.imutval = "je" end end end if not stem then stem, ending = rmatch(base.lemma, "^(.*)([ia])$") if stem then -- [[tími]] "time, hour" and many others; [[herra]] "gentleman" ([[sendiherra]] "ambassador"), -- [[séra]]/[[síra]] "reverend" base.decl = "m-weak" -- Recognize -ingi and make automatically j-infixing, but only when a vowel precedes -- (not [[ingi]], [[Ingi]], [[stingi]], [[þvingi]]). Use `-j` to turn this off. if ending == "i" and rfind(stem, com.vowel_or_hyphen_c .. ".*ing$") then default_props.j = "j" elseif ending == "i" and rfind(stem, com.vowel_or_hyphen_c .. ".*ar$") then default_props.umut = "uUmut" end end end if not stem then stem = rmatch(base.lemma, "^(.*ó)$") if stem then -- [[kanó]] "canoe", [[pesó]] "peso", [[Plútó]] "Pluto", [[Markó]] (male given name), etc. base.decl = "m-ó" end end if not stem then -- Miscellaneous masculine terms without ending stem = base.lemma base.decl = "m" end elseif base.gender == "f" then if not stem then stem, ending = rmatch(base.lemma, "^(.*)(a)$") if stem then base.decl = "f-weak" end end if not stem then stem, ending = rmatch(base.lemma, "^(.*[^eE])(i)$") if stem then base.decl = "f-i" end end if not stem and not base.stem then -- Don't match when base.stem is set, e.g. [[gimbur]] "female lamb", where the -ur is part of the stem stem, ending = rmatch(base.lemma, "^(.*[^aA])(ur)$") if stem and rfind(stem, com.vowel_or_hyphen_c) then if is_proper_noun(base, stem) then -- [[Auður]], [[Heiður]], [[Ingveldur]], [[Móeiður]], [[Þórelfur]], [[-frídur]] ([[Gunnfríður]], -- [[Hólmfríður]], [[Málfríður]], [[Sigfríður]]), [[Gerður]] ([[Hallgerður]], [[Ingigerður]], -- [[Þorgerður]]), [[Gunnur]] ([[Arngunnur]], [[Hildigunnur]]), [[Heiður]] ([[Aðalheiður]], -- [[Arnheiður]], [[Brynheiður]], [[Ragnheiður]]), [[Hildur]] ([[Ásthildur]], [[Berghildur]], -- [[Brynhildur]], [[Geirhildur]], [[Gunnhildur]], [[Ragnhildur]], [[Þórhildur]]), [[Ástríður]] -- (related names [[Guðríður]], [[Sigríður]], [[Þuríður]]), [[Þrúður]] [also a man's name] -- ([[Jarþrúður]], [[Jarðþrúður]], [[Sigþrúður]]) -- -- also with company/organization names like [[Berghildur]], [[Gunnhildur]]; likewise place names -- like [[Þuríður]] base.decl = "f-acc-dat-i" else base.decl = "f-ur" end end end if not stem and base.props.rstem then stem, ending = rmatch(base.lemma, "^(.*[^eE])(ir)$") if stem and base.props.rstem then -- [[dóttir]], [[móðir]], [[systir]] base.decl = "f-rstem" if not stem:find("syst$") then base.need_imut = true end end end if not stem then stem = rmatch(base.lemma, "^(.*ung)$") if stem then base.decl = "f-ung" end end if not stem then stem = rmatch(base.lemma, "^(.*ing)$") if stem then base.decl = "f-ing" end end if not stem then stem = rmatch(base.lemma, "^(.*[áóúÁÓÚ])$") if stem then base.decl = "f-long-vowel" if rfind(stem, "[óÓ]$") then base.need_imut = true end end end if not stem and not base.stem then -- Not when base.stem is set, which includes [[Ýr]], following the regular endingless f declension where -- -r is part of the stem. stem, ending = rmatch(base.lemma, "^(.*[ýÝæÆ])(r)$") if stem then -- [[kýr]] "cow", [[sýr]] "sow (archaic)", [[ær]] "ewe" and compounds base.decl = "f-long-umlaut-vowel-r" default_props.unimut = "unimut" end end if not stem then stem = rmatch(base.lemma, "^(.*[^aA]un)$") if stem and rfind(stem, com.vowel_or_hyphen_c) then -- [[pöntun]] "order (in commerce)"; [[verslun]] "trade, business; store, shop"; [[efun]] "doubt"; -- [[bötun]] "improvement"; [[örvun]] "encouragement; stimulation" (pl. örvanir); etc. -- Exclude words in -aun like [[baun]] "bean", [[laun]] "secret", [[raun]] "experience". -- Some words need a different indicator, e.g. [[örvun]] "encouragement; stimulation" (pl. örvanir), -- [[fjölgun]] "increase, proliferation" (pl. fjölganir), which need "unUmut". base.decl = "f" default_props.unumut = "unuUmut" end end if not stem then -- Miscellaneous feminine terms without ending stem = base.lemma base.decl = "f" -- A function here means we resolve it to its actual value later. We don't want to trigger -- unumut if the user specified v-infix or any type of u-mutation (e.g. 'uUmut' in [[ætlan]]), -- or if the last vowel of the term is 'a' ([[dragt]], [[aukavakt]]). default_props.unumut = function(base, props) if base.vstem or props.v and props.v.form == "v" or props.umut or rfind(stem, "[Aa]" .. com.cons_c .. "*$") then return nil else return { form = "unumut", defaulted = true } end end end elseif base.gender == "n" then if not stem then stem, ending = rmatch(base.lemma, "^(.*)(a)$") if stem then base.decl = "n-weak" end end if not stem then -- stem actually includes -é but due to the change to já we include it in the ending stem, ending = rmatch(base.lemma, "^(.*)(é)$") if stem then if base.props["já"] then -- Indicator 'já' for [[tré]], [[hné]]/[[kné]], etc. base.decl = "n-já" else -- [[té]] (letter T), etc. stem = stem .. "é" base.decl = "n" end end end if not stem then stem, ending = rmatch(base.lemma, "^(.*[kKgG])(i)$") if stem then base.decl = "n-i" default_props.j = "j" end end if not stem then stem, ending = rmatch(base.lemma, "^(.*[^eE])(i)$") if stem then base.decl = "n-i" end end if not stem then -- -ur preceded by a consonant and at least one vowel. stem = rmatch(base.lemma, "^(.*" .. com.vowel_or_hyphen_c .. ".*" .. com.cons_c .. "ur)$") if stem then base.decl = "n" default_props.con = "con" default_props.defcon = "defcon" end end if not stem then -- Miscellaneous neuter terms without ending stem = base.lemma base.decl = "n" end else error(("Internal error: `base.gender` is '%s' but should be 'm', 'f' or 'n'"):dump(base.gender)) end if base.stem then -- This isn't necessarily accurate but doesn't really matter. We only record the lemma ending to help with -- contraction of definite clitics in the nominative singular, and in the cases where the user gives an explicit -- stem, it's usually with # (meaning the ending is null) or ## (meaning the ending ends in -r), and in both -- cases there's no contraction of initial vowels in definite clitics in any case. base.lemma_ending = "" else base.stem = stem base.lemma_ending = ending or "" end for k, v in pairs(default_props) do if not base[k] then if control_spec_set[k] then for _, props in ipairs(base.prop_sets) do if type(v) == "function" then props[k] = v(base, props) else props[k] = { form = v, defaulted = true } end end else base[k] = v end end end track("decl/" .. base.decl) end local function determine_default_masc_dat_sg(base, props) -- We only need to compute the default dative singular for regular masculines (not masculines in -ir, -ó, -i, etc.). -- These other types have specific defaults for the entire type. if base.decl ~= "m" or base.number == "pl" then return end local default_dat_sg if base.overrides.dat_s then -- Track explicit override. track("masc-dat-sg-override") end local stem = base.stem if props.j and props.j.form == "j" then -- Stems with j-infix normally have null dative even if they end in two consonants, e.g. -- [[belgur]] "bellows; skin", [[fengur]] "profit", [[flekkur]] "spot, fleck", [[serkur]] -- "shirt", [[stingur]] "sting" default_dat_sg = "" elseif stem:find(com.vowel_or_hyphen_c .. ".*[iu]ng$") then -- Stems in suffix -ing or -ung normally have indef dat -i, def dat null default_dat_sg = { indef = "i", def = "" } elseif stem:find("x$") or (rfind(stem, com.cons_c .. com.cons_c .. "$") and not stem:find("kk$") and not stem:find("pp$")) then -- Other stems in two consonants normally have dat -i, but those in -kk or -pp normally -- don't, so exclude them and require explicit specification default_dat_sg = "i" elseif not rfind(stem, com.vowel_c .. "$") and is_proper_noun(base, stem) then -- proper noun whose stem does not end in a vowel default_dat_sg = "i" elseif props.con and props.con.form == "con" then default_dat_sg = "i" elseif rfind(stem, com.vowel_c .. "r?$") then default_dat_sg = "" elseif base.lemma:find("ll$") then -- nouns in -ll without contraction, which generally includes those not in -all/-ill/-ull plus a few in these -- endings such as [[panill]] "paneling" (rare variant of [[panell]]), [[kórall]] "coral", [[kristall]] -- "crystal", [[kanill]] "cinnamon" (also [[kanell]]); only a few exceptions, such as [[rafall]] "generator", -- which optionally contracts and has with dati/-:i without contraction; [[hvoll]] "hill", [[kokkáll]] -- "cuckold", [[páll]] "spade, pointed shovel", [[þræll]] "slave" with dat-:i/-; [[hóll]] "hill", [[hæll]] -- "heel", [[stóll]] "chair", which are dat-:i[footnote]/- with a footnote variously indicating that the -- dative in -i occurs only in fixed expressions, compounds, place names, etc. default_dat_sg = "" elseif base.lemma:find("nn$") then -- nouns in -nn without contraction, which generally includes those not in -ann/-inn/-unn; there are fewer of -- these than the corresponding nouns in -ll and they have default dative i/i; only exceptions I can find are -- [[húnn]] "knob", [[tónn]] "tone (music)", [[dúnn]] "down (feathers)"", which have dati:-/i. default_dat_sg = "i" elseif base.overrides.def_dat_s and base.definiteness == "def" then -- OK; user supplied def_dat_s override for a definite-only lemma elseif base.overrides.dat_s and base.overrides.dat_s.indef and base.definiteness == "indef" then -- OK; user supplied dat_s override with indefinite setting, for an indefinite-only lemma elseif base.overrides.dat_s and base.overrides.dat_s.indef and base.overrides.def_dat_s then -- OK; user supplied dat_s override with indefinite setting and def_dat_s override, which -- together provide both indefinite and definite values elseif base.overrides.dat_s and not base.overrides.dat_s.def then error(("Saw masculine stem '%s' and dative singular override of just the indefinite ending, but " .. "requires both the indefinite and definite endings of the dative singular in the form 'datINDEF/DEF'"): format(stem)) elseif not base.overrides.dat_s then local exceptions = "exceptions are nouns in -ir, -ó or -i; proper nouns; plural-only nouns; nouns with " .. "stem contraction or j-infix; nouns whose stem ends in two or more consonants, except for -kk and " .. "-pp; and nouns whose stem ends in a vowel or vowel + r" if base.definiteness == "indef" then error(("Saw masculine stem '%s' and no dative override: Most indefinite-only masculine nouns must " .. "explicitly specify the indefinite ending of the dative singular using an override of the form " .. "'datINDEF'; %s"):format(stem, exceptions)) else error(("Saw masculine stem '%s' and no dative override: Most masculine nouns must explicitly specify " .. "the indefinite and definite endings of the dative singular using an override of the form " .. "'datINDEF/DEF'; %s"):format(stem, exceptions)) end end props.default_dat_sg = default_dat_sg end -- Determine the stems and other properties to use for each property set. The list of such properties is given in the -- comment above create_base(), along with the explanation of what a property set is and why we have multiple such -- property sets (generally, one per combination of control specs such as 'con,-con' and 'umut,uUmut'). There are -- currently 9 singular stems and a corresponding 9 plural stems. local function determine_props(base) -- Now determine all the props for each prop set. for _, props in ipairs(base.prop_sets) do -- Determine the default dative singular for masculine nouns using declension "m". determine_default_masc_dat_sg(base, props) -- Almost all nouns have dative plural -um, which triggers u-mutation, so we need to compute the u-mutation -- stem using "umut" if not specifically given. Set `defaulted` so an error isn't triggered if there's no -- special u-mutated form. local props_umut = props.umut if not props_umut and (not props.unumut or props.unumut.form:find("^%-")) then props_umut = { form = "umut", defaulted = true } end -- First do all the stems, handling overall and plural-specific stems separately. for _, prefix in ipairs { "", "pl_" } do local base_stem, base_vstem if prefix == "" then base_stem = base.stem base_vstem = base.vstem else base_stem = base.plstem base_vstem = base.plvstem end -- The plstem is almost never set, so don't do a lot of unnecessary computation. if prefix == "pl_" and not base_stem then break end local stem, nonvstem, umut_nonvstem, imut_nonvstem, vstem, umut_vstem, imut_vstem, null_defvstem, umut_null_defvstem if props.unumut and not props.unumut.form:find("^%-") then umut_nonvstem = base_stem nonvstem = apply_reverse_u_mutation(umut_nonvstem, props.unumut.form, not props.unumut.defaulted) stem = nonvstem if base.need_imut then imut_nonvstem = apply_i_mutation(nonvstem, base.imutval) end if base_vstem then error(("Don't currently know how to combine '%svstem:' with 'unumut' specs"):format( prefix == "pl_" and "pl" or "")) end if props.con and props.con.form == "con" then umut_vstem = com.apply_contraction(base_stem) else umut_vstem = base_stem end vstem = apply_reverse_u_mutation(umut_vstem, props.unumut.form, not props.unumut.defaulted) if base.need_imut then imut_vstem = apply_i_mutation(vstem, base.imutval) end local props_unumut_form = props.unumut.form if props.defcon and props.defcon.form == "defcon" then umut_null_defvstem = com.apply_contraction(base_stem) else umut_null_defvstem = base_stem end null_defvstem = apply_reverse_u_mutation(umut_null_defvstem, props_unumut_form, not props.unumut.defaulted) elseif props.unimut and not props.unimut.form:find("^%-") then imut_nonvstem = base_stem local has_contraction = props.con and props.con.form == "con" nonvstem = apply_reverse_i_mutation(imut_nonvstem, base.unimutval, not has_contraction) stem = nonvstem if props_umut then umut_nonvstem = apply_u_mutation(nonvstem, props_umut.form, not props_umut.defaulted) end if base_vstem then error(("Don't currently know how to combine '%svstem:' with 'unimut' specs"):format( prefix == "pl_" and "pl" or "")) end if has_contraction then imut_vstem = com.apply_contraction(base_stem) else imut_vstem = base_stem end vstem = apply_reverse_i_mutation(imut_vstem, base.unimutval, "error if unmatchable") if props_umut then umut_vstem = apply_u_mutation(vstem, props_umut.form, not props_umut.defaulted) end if props.defcon and props.defcon.form == "defcon" then error("Don't currently know how to combine 'defcon' with 'unimut' specs") end base.need_imut = true elseif props_umut then stem = base_stem nonvstem = stem umut_nonvstem = apply_u_mutation(nonvstem, props_umut.form, not props_umut.defaulted) if base.need_imut then imut_nonvstem = apply_i_mutation(nonvstem, base.imutval) end vstem = base_vstem or base_stem if props.con and props.con.form == "con" then vstem = com.apply_contraction(vstem) end umut_vstem = apply_u_mutation(vstem, props_umut.form, not props_umut.defaulted) if base.need_imut then imut_vstem = apply_i_mutation(vstem, base.imutval) end if props.defcon and props.defcon.form == "defcon" then null_defvstem = com.apply_contraction(base_stem) else null_defvstem = base_stem end umut_null_defvstem = apply_u_mutation(null_defvstem, props_umut.form, not props_umut.defaulted) else -- Normally u-mutated forms should always be available, unless 'unumut' is in effect. error(("Internal error: Neither 'unumut' or 'umut' specified: %s"):format(dump(props))) end props[prefix .. "stem"] = stem if nonvstem ~= stem then props[prefix .. "nonvstem"] = nonvstem end if umut_nonvstem ~= nonvstem then -- For 'con' and 'defcon' below, footnotes can be placed on -con or -defcon so we have to check for -- those footnotes as well as checking for the vstem and such being different, so the -con and -defcon -- footnotes are still active. However, there's no such thing as -umut, and any time that there's an -- explicit umut variant given, umut_nonvstem will be different from nonvstem (otherwise an error will -- occur in apply_u_mutation), so we don't need this extra check here. if props_umut then umut_nonvstem = iut.combine_form_and_footnotes(umut_nonvstem, props_umut.footnotes) end props[prefix .. "umut_nonvstem"] = umut_nonvstem end if base.need_imut then -- imut footnotes handled specially below props[prefix .. "imut_nonvstem"] = imut_nonvstem end if vstem ~= stem or props.con and props.con.footnotes then -- See comment above for why we need to check for props.con.footnotes (basically, to handle footnotes on -- -con). if props.con then vstem = iut.combine_form_and_footnotes(vstem, props.con.footnotes) end props[prefix .. "vstem"] = vstem end if umut_vstem ~= vstem or props.con and props.con.footnotes then -- See comment above under `umut_nonvstem ~= nonvstem`. There's no -umut so whenever there's a specific -- umut variant with footnote, umut_vstem will be different from vstem so we don't need to check for -- `or props_umut and props_umut.footnotes` above. local footnotes = iut.combine_footnotes(props.con and props.con.footnotes or nil, props_umut and props_umut.footnotes or nil) umut_vstem = iut.combine_form_and_footnotes(umut_vstem, footnotes) props[prefix .. "umut_vstem"] = umut_vstem end if base.need_imut then -- imut footnotes handled specially below props[prefix .. "imut_vstem"] = imut_vstem end if null_defvstem ~= nonvstem or props.defcon and props.defcon.footnotes then -- See comment above for why we need to check for props.defcon.footnotes (basically, to handle footnotes -- on -defcon). if props.defcon then null_defvstem = iut.combine_form_and_footnotes(null_defvstem, props.defcon.footnotes) end props[prefix .. "null_defvstem"] = null_defvstem end if umut_null_defvstem ~= null_defvstem or props.defcon and props.defcon.footnotes then -- Analogous situation to the clause above that checks for `umut_vstem ~= vstem`. local footnotes = iut.combine_footnotes(props.defcon and props.defcon.footnotes or nil, props_umut and props_umut.footnotes or nil) umut_null_defvstem = iut.combine_form_and_footnotes(umut_null_defvstem, footnotes) props[prefix .. "umut_null_defvstem"] = umut_null_defvstem end end -- Do the j-infix, v-infix, imut, unimut and unumut properties. if props.j then props.jinfix = props.j.form == "j" and "j" or "" props.jinfix_footnotes = props.j.footnotes props.j = nil end if props.v then props.vinfix = props.v.form == "v" and "v" or "" props.vinfix_footnotes = props.v.footnotes props.v = nil end if props.imut then props.imut_footnotes = props.imut.footnotes props.imut = props.imut.form == "imut" and true or false end if props.unimut then props.unimut_footnotes = props.unimut.footnotes props.unimut = props.unimut.form == "unimut" and true or false end if props.unumut then props.unumut_footnotes = props.unumut.footnotes props.unumut = props.unumut.form end end end local function detect_indicator_spec(base) base.prop_sets = { {} } if base.adjspec then process_declnumber(base) synthesize_adj_lemma(base) elseif base.props.builtin then determine_builtin_props(base) else -- Replace # and ## in all overridable stems as well as all overrides. for _, stemkey in ipairs(overridable_stems) do base[stemkey] = com.replace_hashvals(base[stemkey], base.lemma) end map_all_overrides(base, function(formobj) formobj.form = com.replace_hashvals(formobj.form, base.lemma) end) expand_property_sets(base) if base.definiteness == "def" then synthesize_indefinite_lemma(base) end if base.number == "pl" then synthesize_singular_lemma(base) end determine_declension(base) determine_props(base) end end local function detect_all_indicator_specs(alternant_multiword_spec) -- Keep track of all genders seen in the singular and plural so we can determine whether to add the term to -- [[:Category:Icelandic nouns that change gender in the plural]]. FIXME: Is this needed for Icelandic? It's copied -- from Czech. alternant_multiword_spec.sg_genders = {} alternant_multiword_spec.pl_genders = {} iut.map_word_specs(alternant_multiword_spec, function(base) detect_indicator_spec(base) if base.number ~= "pl" then alternant_multiword_spec.sg_genders[base.actual_gender] = true end if base.number ~= "sg" then alternant_multiword_spec.pl_genders[base.actual_gender] = true end end) end local propagate_multiword_properties local function propagate_alternant_properties(alternant_spec, property, mixed_value, nouns_only) local seen_property for _, multiword_spec in ipairs(alternant_spec.alternants) do propagate_multiword_properties(multiword_spec, property, mixed_value, nouns_only) if seen_property == nil then seen_property = multiword_spec[property] elseif multiword_spec[property] and seen_property ~= multiword_spec[property] then seen_property = mixed_value end end alternant_spec[property] = seen_property end propagate_multiword_properties = function(multiword_spec, property, mixed_value, nouns_only) local seen_property = nil local last_seen_nounal_pos = 0 local word_specs = multiword_spec.alternant_or_word_specs or multiword_spec.word_specs for i = 1, #word_specs do local is_nounal if word_specs[i].alternants then propagate_alternant_properties(word_specs[i], property, mixed_value) is_nounal = not not word_specs[i][property] elseif nouns_only then is_nounal = is_regular_noun(word_specs[i]) else is_nounal = not not word_specs[i][property] end if is_nounal then if not word_specs[i][property] then error("Internal error: noun-type word spec without " .. property .. " set") end for j = last_seen_nounal_pos + 1, i - 1 do word_specs[j][property] = word_specs[j][property] or word_specs[i][property] end last_seen_nounal_pos = i if seen_property == nil then seen_property = word_specs[i][property] elseif seen_property ~= word_specs[i][property] then seen_property = mixed_value end end end if last_seen_nounal_pos > 0 then for i = last_seen_nounal_pos + 1, #word_specs do word_specs[i][property] = word_specs[i][property] or word_specs[last_seen_nounal_pos][property] end end multiword_spec[property] = seen_property end local function propagate_properties_downward(alternant_multiword_spec, property, default_propval) local function set_and_fetch(obj, default) local retval if obj[property] then retval = obj[property] else obj[property] = default retval = default end if not obj["actual_" .. property] then obj["actual_" .. property] = retval end return retval end local propval1 = set_and_fetch(alternant_multiword_spec, default_propval) for _, alternant_or_word_spec in ipairs(alternant_multiword_spec.alternant_or_word_specs) do local propval2 = set_and_fetch(alternant_or_word_spec, propval1) if alternant_or_word_spec.alternants then for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do local propval3 = set_and_fetch(multiword_spec, propval2) for _, word_spec in ipairs(multiword_spec.word_specs) do local propval4 = set_and_fetch(word_spec, propval3) if propval4 == "mixed" then -- FIXME, use clearer error message. error("Attempt to assign mixed " .. property .. " to word") end set_and_fetch(word_spec, propval4) end end else if propval2 == "mixed" then -- FIXME, use clearer error message. error("Attempt to assign mixed " .. property .. " to word") end set_and_fetch(alternant_or_word_spec, propval2) end end end --[=[ Propagate `property` (one of "gender", "number" or "definiteness") from nouns to adjacent adjectives. We proceed as follows: 1. We assume the properties in question are already set on all nouns. This should happen in set_defaults_and_check_bad_indicators(). 2. We first propagate properties upwards and sideways. We recurse downwards from the top. When we encounter a multiword spec, we proceed left to right looking for a noun. When we find a noun, we fetch its property (recursing if the noun is an alternant), and propagate it to any adjectives to its left, up to the next noun to the left. When we have processed the last noun, we also propagate its property value to any adjectives to the right (to handle e.g. [[svefninn langi]] "the long sleep", where the adjective [[langi]] should inherit the 'masculine', 'singular' and 'definite' properties of [[svefninn]]). Finally, we set the property value for the multiword spec itself by combining all the non-nil properties of the individual elements. If all non-nil properties have the same value, the result is that value, otherwise it is `mixed_value` (which is "mixed" for gender, but "both" for number and "bothdef" for definiteness). 3. When we encounter an alternant spec in this process, we recursively process each alternant (which is a multiword spec) using the previous step, and combine any non-nil properties we encounter the same way as for multiword specs. 4. The effect of steps 2 and 3 is to set the property of each alternant and multiword spec based on its children or its neighbors. ]=] local function propagate_properties(alternant_multiword_spec, property, default_propval, mixed_value) propagate_multiword_properties(alternant_multiword_spec, property, mixed_value, "nouns only") propagate_multiword_properties(alternant_multiword_spec, property, mixed_value, false) propagate_properties_downward(alternant_multiword_spec, property, default_propval) end local function determine_noun_status(alternant_multiword_spec) for i, alternant_or_word_spec in ipairs(alternant_multiword_spec.alternant_or_word_specs) do if alternant_or_word_spec.alternants then local is_noun = false for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do for j, word_spec in ipairs(multiword_spec.word_specs) do if is_regular_noun(word_spec) then multiword_spec.first_noun = j is_noun = true break end end end if is_noun then alternant_multiword_spec.first_noun = i end elseif is_regular_noun(alternant_or_word_spec) then alternant_multiword_spec.first_noun = i return end end end -- Set the part of speech based on properties of the individual words. local function set_pos(alternant_multiword_spec) if not alternant_multiword_spec.pos then if alternant_multiword_spec.saw_builtin and not alternant_multiword_spec.saw_non_builtin then alternant_multiword_spec.pos = "သဗ္ဗနာမ်" else alternant_multiword_spec.pos = "နာမ်" end end end local function normalize_all_lemmas(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) local lemma = base.orig_lemma_no_links base.actual_lemma = lemma base.lemma = base.decllemma or lemma base.source_template = alternant_multiword_spec.source_template end) end local function decline_noun(base) for _, props in ipairs(base.prop_sets) do if not decls[base.decl] then error("Internal error: Unrecognized declension type '" .. base.decl .. "'") end decls[base.decl](base, props) end handle_derived_slots_and_overrides(base) local function copy(from_slot, to_slot) base.forms["ind_" .. to_slot] = base.forms["ind_" .. from_slot] base.forms["def_" .. to_slot] = base.forms["def_" .. from_slot] end if base.actual_number ~= base.number then local source_num = base.number == "sg" and "_s" or "_p" local dest_num = base.number == "sg" and "_p" or "_s" for _, case in ipairs(cases) do copy(case .. source_num, case .. dest_num) copy("nom" .. source_num .. "_linked", "nom" .. dest_num .. "_linked") end if base.actual_number ~= "both" then local erase_num = base.actual_number == "sg" and "_p" or "_s" for _, case in ipairs(cases) do base.forms["ind_" .. case .. erase_num] = nil base.forms["def_" .. case .. erase_num] = nil end base.forms["ind_nom" .. erase_num .. "_linked"] = nil base.forms["def_nom" .. erase_num .. "_linked"] = nil end end process_addnote_specs(base) end -- Compute the categories to add the noun to, as well as the annotation to display in the -- declension title bar. We combine the code to do these functions as both categories and -- title bar contain similar information. local function compute_categories_and_annotation(alternant_multiword_spec) local all_cats = {} local plpos = require(en_utilities_module).pluralize(alternant_multiword_spec.pos) local function inscat(cattype) -- m_table.insertIfNot(all_cats, "Icelandic " .. cattype) end local function inscat_noun(cattype) if plpos == "နာမ်" then inscat(cattype) end end if alternant_multiword_spec.saw_indecl and not alternant_multiword_spec.saw_non_indecl then -- inscat("indeclinable " .. plpos) end if alternant_multiword_spec.saw_unknown_decl and not alternant_multiword_spec.saw_non_unknown_decl then -- inscat(plpos .. " with unknown declension") end if alternant_multiword_spec.actual_number == "sg" then -- inscat_noun("uncountable nouns") elseif alternant_multiword_spec.actual_number == "pl" then -- inscat_noun("pluralia tantum") end local annparts = {} local irregs = {} local genderspecs = {} local stemspecs = {} local scrape_chains = {} local function insann(txt, joiner) if joiner and annparts[1] then table.insert(annparts, joiner) end table.insert(annparts, txt) end local function do_word_spec(base) local actual_gender = gender_code_to_desc[base.actual_gender] local declined_gender = gender_code_to_desc[base.gender] local gender if actual_gender ~= declined_gender then gender = ("%s (declined as %s)"):format(actual_gender, declined_gender) -- inscat_noun("nouns with actual gender different from declined gender") else gender = actual_gender end if gender then m_table.insertIfNot(genderspecs, gender) end for _, props in ipairs(base.prop_sets) do -- User-specified 'decllemma:' indicates irregular stem. if base.decllemma then m_table.insertIfNot(irregs, "irreg-stem") -- inscat_noun("nouns with irregular stem") end m_table.insertIfNot(stemspecs, props.stem) end end local key_entry = alternant_multiword_spec.first_noun or 1 if #alternant_multiword_spec.alternant_or_word_specs >= key_entry then local alternant_or_word_spec = alternant_multiword_spec.alternant_or_word_specs[key_entry] if alternant_or_word_spec.alternants then for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do key_entry = multiword_spec.first_noun or 1 if #multiword_spec.word_specs >= key_entry then do_word_spec(multiword_spec.word_specs[key_entry]) end end else do_word_spec(alternant_or_word_spec) end end iut.map_word_specs(alternant_multiword_spec, function(base) if base.scrape_chain[1] then local linked_scrape_chain = {} for _, element in ipairs(base.scrape_chain) do table.insert(linked_scrape_chain, ("[[%s]]"):format(element)) end m_table.insertIfNot(scrape_chains, table.concat(linked_scrape_chain, " -> ")) end end) if alternant_multiword_spec.actual_number == "sg" or alternant_multiword_spec.actual_number == "pl" then -- not "both" or "none" (for [[sebe]]) insann(alternant_multiword_spec.actual_number .. "-only", " ") end if #genderspecs > 0 then insann(table.concat(genderspecs, " // "), " ") end if #irregs > 0 then insann(table.concat(irregs, " // "), " ") end if #scrape_chains > 0 then insann(("based on %s"):format(m_table.serialCommaJoin(scrape_chains)), ", ") -- inscat(plpos .. " declined using scraped base declensions") end alternant_multiword_spec.annotation = table.concat(annparts) if #stemspecs > 1 then -- inscat_noun("nouns with multiple stems") end if alternant_multiword_spec.actual_number == "both" and not m_table.deepEquals(alternant_multiword_spec.sg_genders, alternant_multiword_spec.pl_genders) then -- inscat_noun("nouns that change gender in the plural") end alternant_multiword_spec.categories = all_cats end local function show_forms(alternant_multiword_spec) local lemmas = {} local max_num_words = 1 for _, slot in ipairs(potential_lemma_slots) do if alternant_multiword_spec.forms[slot] then for _, formobj in ipairs(alternant_multiword_spec.forms[slot]) do table.insert(lemmas, formobj) local no_affix_form = formobj.form:gsub("^%-", ""):gsub("%-$", "") local num_words = #(rsplit(no_affix_form, "[ -]+")) max_num_words = math.max(max_num_words, num_words) end break end end alternant_multiword_spec.max_num_words = max_num_words local props = { lemmas = lemmas, slot_list = alternant_multiword_spec.noun_slots, lang = lang, } iut.show_forms(alternant_multiword_spec.forms, props) end local function make_table(alternant_multiword_spec) local forms = alternant_multiword_spec.forms local frame = mw.getCurrentFrame() local function template_prelude() return m_inflection_table.make_top{ title = '{title}{annotation}', palette = 'blue', tall = 'yes', } end local function template_postlude() return m_inflection_table.make_bottom{ notes = '{footnote}', } end local table_spec_both = template_prelude() .. [=[ ! rowspan="2" | ! colspan="2" | ကိုန်ဨကဝုစ် ! colspan="2" | ကိုန်ဗဟုဝစ် |- ! class="secondary" | ဟွံချိုတ်ပၠိုတ် ! class="secondary" | မချိုတ်ပၠိုတ် ! class="secondary" | ဟွံချိုတ်ပၠိုတ် ! class="secondary" | မချိုတ်ပၠိုတ် |- ! မဒုၚ်ယၟု | {ind_nom_s} | {def_nom_s} | {ind_nom_p} | {def_nom_p} |- ! ကမ္မကာရက | {ind_acc_s} | {def_acc_s} | {ind_acc_p} | {def_acc_p} |- ! ပြကမ္မကာရက | {ind_dat_s} | {def_dat_s} | {ind_dat_p} | {def_dat_p} |- ! ဗဳဇဂကူ | {ind_gen_s} | {def_gen_s} | {ind_gen_p} | {def_gen_p} ]=] .. template_postlude() local function get_table_spec_one_number(number, numcode) local table_spec_one_number = [=[ ! rowspan="2" | ! colspan="2" | NUMBER |- ! class="secondary" | ဟွံချိုတ်ပၠိုတ် ! class="secondary" | မချိုတ်ပၠိုတ် |- ! မဒုၚ်ယၟု | {ind_nom_NUM} | {def_nom_NUM} |- ! ကမ္မကာရက | {ind_acc_NUM} | {def_acc_NUM} |- ! ပြကမ္မကာရက | {ind_dat_NUM} | {def_dat_NUM} |- ! ဗဳဇဂကူ | {ind_gen_NUM} | {def_gen_NUM} ]=] return template_prelude() .. table_spec_one_number:gsub("NUMBER", number):gsub("NUM", numcode) .. template_postlude() end local function get_table_spec_one_number_one_def(number, numcode, definiteness, defcode) local table_spec_one_number_one_def = [=[ ! colspan="2" | DEFINITENESS NUMBER |- ! မဒုၚ်ယၟု | {DEF_nom_NUM} |- ! ကမ္မကာရက | {DEF_acc_NUM} |- ! ပြကမ္မကာရက | {DEF_dat_NUM} |- ! ဗဳဇဂကူ | {DEF_gen_NUM} ]=] return template_prelude() .. (table_spec_one_number_one_def:gsub("NUMBER", number):gsub("NUM", numcode) :gsub("DEFINITENESS", definiteness):gsub("DEF", defcode)) .. template_postlude() end if alternant_multiword_spec.title then forms.title = alternant_multiword_spec.title else forms.title = 'မလဟုတ်စှ်ေဆေၚ်စပ်ကဵု <i lang="is">' .. forms.lemma .. '</i>' end local annotation = alternant_multiword_spec.annotation if annotation == "" then forms.annotation = "" else forms.annotation = " (<span style=\"font-size: smaller;\">" .. annotation .. "</span>)" end local number, numcode if alternant_multiword_spec.actual_number == "sg" then number, numcode = "ကိုန်ဨကဝုစ်", "s" elseif alternant_multiword_spec.actual_number == "pl" then number, numcode = "ကိုန်ဗဟုဝစ်", "p" elseif alternant_multiword_spec.actual_number == "none" then -- used for [[sebe]] -- FIXME: Update for Icelandic number, numcode = "", "s" end local definiteness, defcode if alternant_multiword_spec.definiteness == "indef" then definiteness, defcode = "ဟွံချိုတ်ပၠိုတ်", "ind" elseif alternant_multiword_spec.definiteness == "def" then definiteness, defcode = "မချိုတ်ပၠိုတ်", "def" elseif alternant_multiword_spec.definiteness == "none" then definiteness, defcode = "", "ind" end local table_spec = alternant_multiword_spec.actual_number ~= "both" and alternant_multiword_spec.definiteness ~= "bothdef" and get_table_spec_one_number_one_def(number, numcode, definiteness, defcode) or alternant_multiword_spec.actual_number == "both" and table_spec_both or get_table_spec_one_number(number, numcode) return m_string_utilities.format(table_spec, forms) end local function compute_headword_genders(alternant_multiword_spec) local genders = {} local number if alternant_multiword_spec.actual_number == "pl" then number = "-p" else number = "" end iut.map_word_specs(alternant_multiword_spec, function(base) if base.actual_gender ~= "none" then m_table.insertIfNot(genders, base.actual_gender .. number) end end) return genders end -- Externally callable function to parse and decline a noun given user-specified arguments and the argument spec -- `argspec` (specified because the user may give multiple such specs). Return value is ALTERNANT_MULTIWORD_SPEC, an -- object where the declined forms are in `ALTERNANT_MULTIWORD_SPEC.forms` for each slot. If there are no values for a -- slot, the slot key will be missing. The value for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}. function export.do_generate_forms(args, argspec, source_template) local pagename = args.pagename or mw.loadData("Module:headword/data").pagename local parse_props = { parse_indicator_spec = function(angle_bracket_spec, lemma) return parse_indicator_spec(angle_bracket_spec, lemma, pagename) end, angle_brackets_omittable = true, allow_blank_lemma = true, } local alternant_multiword_spec = iut.parse_inflected_text(argspec, parse_props) alternant_multiword_spec.title = args.title alternant_multiword_spec.pos = args.pos alternant_multiword_spec.args = args alternant_multiword_spec.source_template = source_template local scrape_errors = {} iut.map_word_specs(alternant_multiword_spec, function(base) if base.scrape_error then table.insert(scrape_errors, base.scrape_error) end end) if scrape_errors[1] then alternant_multiword_spec.scrape_errors = scrape_errors else normalize_all_lemmas(alternant_multiword_spec) set_all_defaults_and_check_bad_indicators(alternant_multiword_spec) -- These need to happen before detect_all_indicator_specs() so that adjectives get their genders and number -- set appropriately, which are needed to correctly synthesize the adjective lemma. propagate_properties(alternant_multiword_spec, "number", "both", "both") -- FIXME, the default value (third param) used to be 'm' with a comment indicating that this applied only to -- plural adjectives, where it didn't matter; but in Icelandic, plural adjectives are distinguished for gender. -- Make sure 'mixed' works. propagate_properties(alternant_multiword_spec, "gender", "mixed", "mixed") propagate_properties(alternant_multiword_spec, "definiteness", "bothdef", "bothdef") detect_all_indicator_specs(alternant_multiword_spec) -- Propagate 'actual_number' after calling detect_all_indicator_specs(), which sets 'actual_number' for -- adjectives. propagate_properties(alternant_multiword_spec, "actual_number", "both", "both") determine_noun_status(alternant_multiword_spec) set_pos(alternant_multiword_spec) alternant_multiword_spec.noun_slots = get_noun_slots(alternant_multiword_spec) local inflect_props = { skip_slot = function(slot) return skip_slot(alternant_multiword_spec.actual_number, alternant_multiword_spec.definiteness, slot) end, slot_list = alternant_multiword_spec.noun_slots, inflect_word_spec = decline_noun, } iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props) compute_categories_and_annotation(alternant_multiword_spec) alternant_multiword_spec.genders = compute_headword_genders(alternant_multiword_spec) end if args.json then alternant_multiword_spec.args = nil return require("Module:JSON").toJSON(alternant_multiword_spec) end return alternant_multiword_spec end -- Entry point for {{is-ndecl}}. Template-callable function to parse and decline a noun given -- user-specified arguments and generate a displayable table of the declined forms. function export.show(frame) local parent_args = frame:getParent().args local params = { [1] = { required = true, list = true, default = "akur<m.#>" }, deriv = { list = true }, id = {}, pos = {}, title = {}, pagename = {}, json = { type = "boolean" }, } local args = m_para.process(parent_args, params) local alternant_multiword_specs = {} for i, argspec in ipairs(args[1]) do alternant_multiword_specs[i] = export.do_generate_forms(args, argspec, "is-ndecl") end if args.json then -- JSON return value if #args[1] == 1 then return alternant_multiword_specs[1] else return alternant_multiword_specs end end local parts = {} local function ins(txt) table.insert(parts, txt) end for _, alternant_multiword_spec in ipairs(alternant_multiword_specs) do if not alternant_multiword_spec.scrape_errors then show_forms(alternant_multiword_spec) end if alternant_multiword_spec.header then ins(("'''%s:'''\n"):format(alternant_multiword_spec.header)) end if alternant_multiword_spec.q then ins(("''%s''\n"):format(alternant_multiword_spec.q)) end local categories if alternant_multiword_spec.scrape_errors then local errmsgs = {} for _, scrape_error in ipairs(alternant_multiword_spec.scrape_errors) do table.insert(errmsgs, '<span style="font-weight: bold; color: var(--wikt-palette-red,#CC2200);">' .. scrape_error .. "</span>") end -- Surround the messages with a <div> because the table normally does that, and we want to ensure -- similar formatting with respect to newlines. ins("<div>" .. table.concat(errmsgs, "<br />") .. "</div>") categories = { "Icelandic scraping errors in Template:is-ndecl" } else ins(make_table(alternant_multiword_spec)) categories = alternant_multiword_spec.categories end ins(require("Module:utilities").format_categories(categories, lang, nil, nil, force_cat)) end return table.concat(parts) end return export sd7vgkx5qerx64dacgzo6js1z1abcgq 402131 402129 2026-09-28T10:17:06Z 咽頭べさ 33 402131 Scribunto text/plain local export = {} --[=[ Authorship: Ben Wing <benwing2> ]=] --[=[ TERMINOLOGY: -- "slot" = A particular combination of case/number. Example slot names for nouns are "acc_s" (accusative singular) and "gen_p" (genitive plural). Each slot is filled with zero or more forms. -- "form" = The declined Icelandic form representing the value of a given slot. -- "lemma" = The dictionary form of a given Icelandic term. Generally the nominative singular, or nominative plural of plural-only nouns, but may occasionally be another form if the nominative is missing. ]=] --[=[ FIXME: 1. Support 'plstem' overrides. [DONE] 2. Support definite lemmas such as [[Bandaríkin]] "the United States". [DONE] 3. Support adjectivally-declined terms. [DONE PARTIALLY] 4. Support @ for built-in irregular lemmas. [DONE; SINCE REPLACED WITH SCRAPING SPECS] 5. Somehow if the user specifies v-infix, it should prevent default unumut from happening in strong feminines. [DONE] 6. Def acc pl should ignore -u ending in indef acc pl. [DONE] 7. Footnotes on omitted forms should be possible. 8. Remove setting of override on pl when processing plural-only terms in synthesize_singular_lemma(); interferes with decllemma in [[dyr]]. But then need to fix handling of masculine accusative plural. [DONE] 9. Rationalize conventions used in u-mutation types. [DONE] 10. Compute defaulted number and definiteness early so it's usable when merging built-in and user-specified specs. [DONE] 11. Support multiple declension specs. [DONE] 12. Support dark mode. [DONE] 13. Support scraping declension specs. [DONE] 14. Support @-d etc. for suffix scraping. [DONE] 15. Include scraped base nouns in title annotation. [DONE] 16. Support @@ for self-scraping. [DONE IN [[Module:gmq-headword]]] 17. Support scraping multiple declension specs; e.g. [[fræði]] is declared with 'n.pl|f.sg' and [[hljómfræði]] would like to use '@f' but you get an error. ]=] local lang = require("Module:languages").getByCode("is") local require_when_needed = require("Module:require when needed") local m_table = require("Module:table") local m_links = require("Module:links") local m_string_utilities = require("Module:string utilities") local iut = require("Module:inflection utilities") local put = require("Module:parse utilities") local m_para = require("Module:parameters") local com = require("Module:is-common") local m_inflection_table = require("Module:inflection-table") local m_is_adjective = require_when_needed("Module:is-adjective") local en_utilities_module = "Module:en-utilities" local u = mw.ustring.char local rsplit = mw.text.split local rfind = mw.ustring.find local rmatch = mw.ustring.match local rsubn = mw.ustring.gsub local ulen = mw.ustring.len local usub = mw.ustring.sub local uupper = mw.ustring.upper local ulower = mw.ustring.lower local dump = mw.dumpObject local force_cat = false -- set to true to make categories appear in non-mainspace pages, for testing local SUB_ESCAPED_PERIOD = u(0xFFF0) local SUB_ESCAPED_COMMA = u(0xFFF1) -- version of rsubn() that discards all but the first return value local function rsub(term, foo, bar) local retval = rsubn(term, foo, bar) return retval end -- version of rsubn() that returns a 2nd argument boolean indicating whether -- a substitution was made. local function rsubb(term, foo, bar) local retval, nsubs = rsubn(term, foo, bar) return retval, nsubs > 0 end local function track(track_id) require("Module:debug/track")("is-noun/" .. track_id) return true end local potential_lemma_slots = { "ind_nom_s", "ind_nom_p", "def_nom_s", "def_nom_p", "ind_acc_s", -- for [[sig]] } local cases = { "nom", "acc", "dat", "gen", } local case_set = m_table.listToSet(cases) local overridable_stems = { "stem", "vstem", "plstem", "plvstem", "imutval", "unimutval", } local overridable_stem_set = m_table.listToSet(overridable_stems) local control_specs = { "umut", "imut", "unumut", "unimut", "con", "defcon", "j", "v", } local control_spec_set = m_table.listToSet(control_specs) local clitic_articles = { m = { nom_s = "inn", acc_s = "inn", dat_s = "num", gen_s = "ins", nom_p = "nir", acc_p = "na", dat_p = "num", gen_p = "nna", }, f = { nom_s = "in", acc_s = "ina", dat_s = "inni", gen_s = "innar", nom_p = "nar", acc_p = "nar", dat_p = "num", gen_p = "nna", }, n = { nom_s = "ið", acc_s = "ið", dat_s = "nu", gen_s = "ins", nom_p = "in", acc_p = "in", dat_p = "num", gen_p = "nna", }, } local gender_code_to_desc = { m = "masculine", f = "feminine", n = "neuter", none = nil, } local number_code_to_desc = { sg = "singular", pl = "plural", both = "both numbers", none = nil, } local definiteness_code_to_desc = { indef = "indefinite-only", def = "definite-only", bothdef = "indefinite and definite", none = nil, } local function get_noun_slots(alternant_multiword_spec) local noun_slots_list = {} for _, case in ipairs(cases) do for _, num in ipairs { "s", "p" } do for _, def in ipairs { "ind", "def" } do local slot = ("%s_%s_%s"):format(def, case, num) local accel = ("%s|%s"):format(def == "ind" and "indef" or def, case) if alternant_multiword_spec.actual_number == "both" then accel = accel .. "|" .. num end table.insert(noun_slots_list, { slot, accel }) end end end for _, potential_lemma_slot in ipairs(potential_lemma_slots) do table.insert(noun_slots_list, { potential_lemma_slot .. "_linked", "-" }) end return noun_slots_list end local function generate_list_of_possibilities_for_err(list) local quoted_list = {} for _, item in pairs(list) do if item == "" then item = "<nowiki />" end table.insert(quoted_list, "'" .. item .. "'") end table.sort(quoted_list) return mw.text.listToText(quoted_list) end local function skip_slot(number, definiteness, slot) return number == "sg" and slot:find("_p$") or number == "pl" and slot:find("_s$") or definiteness == "def" and slot:find("^ind_") or (definiteness == "indef" or definiteness == "none") and slot:find("^def_") end local function apply_i_mutation(stem, newv) return com.apply_i_mutation(stem, newv, "exclude final -ur", "error if unmatchable") end local function apply_reverse_i_mutation(stem, newv, error_if_unmatchable) return com.apply_reverse_i_mutation(stem, newv, "exclude final -ur", error_if_unmatchable) end local function apply_u_mutation(stem, typ, error_if_unmatchable) return com.apply_u_mutation(stem, typ, "exclude final -ur", error_if_unmatchable) end local function apply_reverse_u_mutation(stem, typ, error_if_unmatchable) return com.apply_reverse_u_mutation(stem, typ, "exclude final -ur", error_if_unmatchable) end --[=[ Create an empty `base` object for holding the result of parsing and later the generated forms. The object is of the form { -- Original lemma as directly given by the user or taken from the pagename. orig_lemma = "ORIGINAL-LEMMA", -- Same as `orig_lemma` but with links removed. orig_lemma_no_links = "ORIGINAL-LEMMA-NO-LINKS", -- Originally the same as `orig_lemma_no_links`, but if the term is a plural-only noun, this will be the corresponding -- singular lemma, and if the term is an adjective form, this will be the corresponding lemma (strong nominative -- masculine singular form). lemma = "LEMMA", -- Generated per-slot forms. After calling `inflect_multiword_or_alternant_multiword_spec`, the forms will be filled -- in with the format as given below, where the value of each slot is a form object. After calling `show_forms`, the -- value of each slot will be a formatted string listing all of the forms of that slot, or "—" if there are none. forms = { SLOT = { { form = "FORM", footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}, }, ... }, ... }, -- Specs for control groups as specified by the user. CONTROL_GROUP is as below and CONTROL_SPEC is -- {form = "FORM", footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}, defaulted = BOOLEAN}, where FORM is as specified -- by the user (e.g. "uUmut", "-unumut") or set as a default by the code (in which case `defaulted` will be set to -- true for control groups "umut" and "unumut"). The control groups are as follows: -- * umut (u-mutation); -- * imut (i-mutation); -- * unumut (reverse u-mutation); -- * unimut (reverse i-mutation); -- * con (stem contraction before vowel-initial endings); -- * defcon (stem contraction before vowel-initial definite clitics when the ending itself is null); -- * j (j-infix before vowel-initial endings not beginning with an i); -- * v (v-infix before vowel-initial endings). CONTROL_GROUP = { CONTROL_SPEC, CONTROL_SPEC, ... }, -- Property sets containing computed stems, one per each combination of control group values. Described in more detail -- below. prop_sets = { PROPSET, -- see below ..., }, -- Per-slot overrides, which override forms generated by the auto-determined or specified declension pattern. SLOT is -- the actual name of the slot, normally without the definiteness prefix, such as "dat_s" (NOT the slot name as -- specified by the user, which would be just "dat" for "dat_s") and OVERRIDE is of the form -- {indef = {FORMOBJ, FORMOBJ, ...}, def = nil or false or {FORMOBJ, FORMOBJ, ...}}, where FORMOBJ is of the form -- {form = FORM, footnotes = FOOTNOTES} as in the `forms` table ("-" means to suppress the slot entirely and is -- signaled by "--" as the user-specified form value; normally FORM values are endings, but a value preceded by ! -- means it's a full form rather than an ending; in such forms you can use # to indicate the lemma and ## to indicate -- the lemma minus -ur or -r, as with stems); `indef` means the override(s) of the indefinite variant of the slot and -- is specified by the user before a slash; `def` means the override(s) of the definite variant of the slot and come -- after a slash, and `false` for either means that the user left the value before or after the slash completely -- blank, meaning not to override the indefinite or definite forms. Sometimes the slot itself has def_ in it; this -- happens when the user preceded the slot spec by 'def', e.g. 'defdat' or 'defgenpl'. overrides = { SLOT = OVERRIDE, SLOT = OVERRIDE, ... }, -- Overrides for the genitive singular, specified after a comma after the gender. OVERRIDE is in the same format as -- above. gens = nil or OVERRIDE, -- Overrides for the nominative and accusative plural, specified after a comma after the gender. OVERRIDE is in the -- same format as above. The actual values given are for the nominative plural, and the accusative plural is derived -- automatically from these values. pls = nil or OVERRIDE, -- "sg", "pl", "both" or "none" (for certain pronouns); may be missing and if so is defaulted number = "NUMBER", -- "m", "f", "n" or "none" (for certain pronouns); always specified by the user gender = "GENDER", -- "def", "indef", "bothdef" or "none" (for pronouns); may be missing and if so is defaulted definiteness = "DEFINITENESS", -- decline like the specified lemma decllemma = nil or "DECLLEMMA", -- decline like the specified gender declgender = nil or "DECLGENDER", -- decline like the specified number declnumber = nil or "DECLNUMBER", -- override the stem; may have # (= lemma) or ## (= lemma minus -ur or -r) stem = nil or "STEM", -- override the stem used before vowel-initial endings; same format as `stem` vstem = nil or "STEM", -- override the plural stem; same format as `stem` plstem = nil or "STEM", -- override the plural stem used before vowel-initial endings; same format as `stem` plvstem = nil or "STEM", -- decline like an adjective; will be present if the user gave a spec starting with 'adj' adjspec = { -- User explicitly specified the lemma using a colon + lemma. lemma = nil or LEMMA -- User gave a one-part or two-part substitution spec such as 'tvöfalt<adj/dur>' or 'ryðfrítt<adj/tt/r>'. subspec = nil or { from = nil or FROM, to = TO, }, }, -- misc Boolean properties: -- * "proper" (a lowercase noun that behaves like a proper noun, i.e. defaults to no plural or definite forms); -- * "common" (a capitalized noun that behaves like a common noun, i.e. defaults to plural and definite forms); -- * "dem" (a demonym, i.e. a capitalized noun such as [[Svisslendingur]] "Swiss person" that behaves like a common -- noun; currently behaves like "common"); -- * "builtin" (for built-in terms such as pronouns); -- * "indecl" (noun is indeclinable); -- * "decl?" (declension is unknown); -- * "iending" (a definite-only noun whose lemma ends in -i, which is elided before a definite clitic beginning with -- i-); -- * "rstem" (an r-stem like [[bróðir]] "brother" or [[dóttir]] "daughter"); -- * "já" (a neuter in -é whose stem alternates with -já, such as [[tré]] "tree" and [[hné]]/[[kné]] "knee"); -- * "weak" (the noun should decline like an ordinary weak noun; used in the declension of [[fjandi]] to disable the -- special -ndi declension); -- * "linkasis" (when linking definite-only and plural-only lemmas in the headword, link as-is instead of -- linking the singular indefinite version); props = { PROP = true, PROP = true, ... }, -- Alternant-level footnotes, specified using `.[footnote]`, i.e. a footnote by itself. footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}, -- ADDNOTE_SPEC is {slot_specs = {"SPEC", "SPEC", ...}, footnotes = {"FOOTNOTE", "FOOTNOTE", ...}}; SPEC is a Lua -- pattern matching slots (anchored on both sides) and FOOTNOTE is a footnote to add to those slots. addnote_specs = { ADDNOTE_SPEC, ADDNOTE_SPEC, ... }, } There is one PROPSET (property set) for each combination of control specs; in the lower limit, there is a single property set. There may be more than one property set e.g. if the user specified 'umut,uUmut' or '-j,j' or '-imut,imut' or some combination of these. The properties in a given property set specify the values themselves of each control group, as well as stems (derived from the control specs) that are used to construct the various forms and populate the slots in `forms` with these values. The information found in the property sets cannot be stored in `base` because it depends on a particular combination of control specs, of which there may be more than one (see above). The decline_noun() function iterates over all property sets and calls the appropriate declension function on each one in turn, which adds forms to each slot in `base.forms`, automatically deduplicating. The properties in each property set are: * Control specs: These are copied from the control specs at the base level. The key is one of the possible control groups ("umut", "imut", "con", etc.), but the value is a single form object {form = "FORM", footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}}. These are set by expand_property_sets(). * Stems (each stem is either a string or a form object; stems in general may be missing, i.e. nil, unless otherwise specified, and default to more general variants): ** `stem`: The basic stem. Always set. May be overridden by more specific variants. ** `nonvstem`: The stem used when the ending is null or starts with a consonant, unless overridden by a more specific variant. Defaults to `stem`. Not currently used, but could be if e.g. a user stem override `nonvstem:...` were supported. ** `umut_nonvstem`: The stem used when the ending is null or starts with a consonant and u-mutation is in effect, unless overridden by a more specific variant. Defaults to `nonvstem`. Will only be present when the result of u-mutation is different from the stem to which u-mutation is applied. (In this case, it will be present even if `nonvstem` is missing, because there is no generic `umut_stem`.) ** `imut_nonvstem`: The stem used when the ending is null or starts with a consonant and i-mutation is in effect. If i-mutation is in effect, this should always be specified (otherwise an internal error will occur); hence it has no default. Note that i-mutation is only in effect when either (a) `imut` or `unimut` was specified; (b) a user-specified override is given that begins with a single ^ (indicating i-mutation); or (c) a declension type is in effect that contains default endings beginning with a single ^ (examples are `f-long-vowel` for lemmas in -ó and `f-long-umlaut-vowel-r`). Note also that this will be present even if `nonvstem` is missing, because there is no generic `imut_stem`. ** `vstem`: The stem used when the ending starts with a vowel, unless overridden by a more specific variant. Defaults to `stem`. Will be specified when contraction is in effect or the user specified `vstem:...`. ** `umut_vstem`: The stem(s) used when the ending starts with a vowel and u-mutation is in effect. Defaults to `vstem`. Note that u-mutation applies to the contracted stem if both u-mutation and contraction are in effect. Will only be present when the result of u-mutation is different from the stem to which u-mutation is applied. (In this case, it will be present even if `vstem` is missing, because there is no generic `umut_stem`.) ** `imut_vstem`: The stem(s) used when the ending starts with a vowel and i-mutation is in effect. If i-mutation is in effect, this should always be specified (otherwise an internal error will occur); hence it has no default. Note that i-mutation applies to the contracted stem if both i-mutation and contraction are in effect. See `imut_nonvstem` for comments on when this stem will be present. ** `null_defvstem`: The stem(s) used when the ending is null and is followed by a definite ending that begins with a vowel, unless overridden by a more specific variant. Defaults to `nonvstem`. This is normally set when `defcon` is specified. ** `umut_null_defvstem`: The stem(s) used when the ending is null and is followed by a definite ending that begins with a vowel, and u-mutation is in effect. Defaults to `null_defvstem`. This is normally set when `defcon` is specified and u-mutation is needed, as in the nom/acc pl of neuter [[mastur]] "mast". Will only be present when the result of u-mutation is different from the stem to which u-mutation is applied. ** `pl_stem`: The basic stem used for plural inflections. Only set when `plstem:...` is specified by the user. If this is set, the alternative plural-specific stem variants are used, where each of the above stems has a plural-specific counterpart, and the identical algorithms and fallbacks are used to determine the correct stem. ** `pl_nonvstem`, `pl_umut_nonvstem`, `pl_imut_nonvstem`, `pl_vstem`, `pl_umut_vstem`, `pl_imut_vstem`, `pl_null_defvstem`, `pl_umut_null_defvstem`: Plural-specific counterparts of the above stems. See the comment under `pl_stem` for when these are used. * Other properties: ** `jinfix`: If present, either "" or "j". Inserted between the stem and ending when the ending begins with a vowel other than "i". Note that j-infixes don't apply to ending overrides. ** `jinfix_footnotes`: Footnotes to attach to forms where j-infixing is possible (even if it's not present). ** `vinfix`: If present, either "" or "v". Inserted between the stem and ending when the ending begins with a vowel. Note that v-infixes don't apply to ending overrides. `jinfix` and `vinfix` cannot both be specified. ** `vinfix_footnotes`: Footnotes to attach to forms where v-infixing is possible (even if it's not present). ** `imut`: If specified (i.e. not nil), either true or false. If specified, there may be associated footnotes in `imut_footnotes`. If true, i-mutation and associated footnotes are in effect before endings starting with "i". If false, associated footnotes still apply before endings starting with "i". Note that i-mutation is also in effect if the ending has ^ prepended, but the associated footnotes don't apply here. ** `imut_footnotes`: See `imut`. ** `unumut`: If specified (i.e. not nil), the type of un-u-mutation requested (either "unumut" or a variant, or the negation of the same using "-unumut" or a variant for no un-u-mutation; "unumut" and variants differ in which slots any associated footnote are placed). If specified, there may be associated footnotes in `unumut_footnotes`. If "unumut" itself, u-mutation is in effect *except* before an ending that starts with an "a" or "i" (unless i-mutation is in effect, which takes precedence). If any other variant, the rules are different: when masculine, u-mutation is in effect *except* in the gen sg and pl (examples are [[söfnuður]] "congregation" and [[mánuður]] "month"); when feminine, u-mutation is in effect except in the nom/acc/gen pl (examples are [[verslun]] "trade, business; store, shop" and [[kvörtun]] "complaint"). When u-mutation is *not* in effect, and i-mutation is also not in effect, the associated footnotes in `unumut_footnotes` apply. If `unumut` is "-unumut" or a variant, there is no un-u-mutation (i.e. there are no special u-mutated stems, and the basic stems, which typically have u-mutation built into them, apply throughout), but the associated footnotes in `unumut_footnotes` still apply in the same circumstances where they would apply if `unumut` were the non-negated counterpart. ** `unumut_footnotes`: See `unumut`. ** `unimut`: If specified (i.e. not nil), either true or false. If specified, there may be associated footnotes in `unimut_footnotes`. If true, i-mutation is in effect *except* in certain case/num combinations that depend on the gender. Specifically: (1) for masculine nouns e.g. [[ketill]] "kettle" and proper names [[Egill]] and [[Ketill]], i-mutation does not apply in the dat sg and throughout the plural; (2) for feminine nouns e.g. [[kýr]] "cow", [[sýr]] "sow (archaic)" and [[ær]] "ewe", i-mutation does not apply in the acc and dat sg and in the dat and gen pl. Cf. also feminine pl-only [[hættur]] "bedtime, quitting time" and [[mætur]] "appreciation, liking", which use 'unimut' to get e.g. dat pl [[háttum]] and gen pl [[hátta]]; but these are handled by synthesizing a singular without i-mutation in the lemma. Very similar are neuter pl [[læti]] "behavior, demeanor" and [[ólæti]] "noise, racket", with e.g. dat pl [[látum]] and gen pl [[láta]], which are handled in the same way. When i-mutation is *not* in effect, the associated footnotes in `unimut_footnotes` apply. If false, the associated footnotes in `unimut_footnotes` still apply in the same circumstances where they would apply if `unimut` where true. ** `unimut_footnotes`: See `unimut`. ]=] local function create_base() return { forms = {}, overrides = {}, props = {}, addnote_specs = {}, } end -- Return true if `stem` refers to a proper noun (first character is uppercase, second character is lowercase). local function is_proper_noun(base, stem) if base.props.common or base.props.dem then return false end if base.props.proper then return true end if base.source_template == "is-noun" then return false end if base.source_template == "is-proper noun" then return true end local first_letter = usub(stem, 1, 1) local second_letter = usub(stem, 2, 2) return ulower(first_letter) ~= first_letter and ((not second_letter or second_letter == "") or uupper(second_letter) ~= second_letter) end --[=[ Basic function to combine stem(s) and other properties with ending(s) and insert the result into the appropriate slot. `base` is the object describing all the properties of the word being inflected for a single alternant (in case there are multiple alternants specified using `((...))`). `slot_prefix` is either "ind_" or "def_" and is prefixed to the slot value in `slot` to get the actual slot to add the resulting forms to. (`slot_prefix` is separated out because the code below frequently needs to conditionalize on the value of `slot` and should not have to worry about the definite and indefinite slot variants). `props` is a property set object containing computed stems and other information (such as whether i-mutation is active) about a particular combination of control specs. See the comment above create_base() for more information. The information found in `props` cannot be stored in `base` because there may be more than one set of such properties per `base` (e.g. if the user specified 'umut,uUmut' or '-j,j' or '-imut,imut' or some combination of these; in such a case, the caller will iterate over all possible combinations, and ultimately invoke add() multiple times, one per combination). `endings` is the ending or endings added to the appropriate stem (after any j or v infix) to get the form(s) to add to the slot. Its value can be a single string, a list of strings, or a list of form objects (i.e. in general list form). `clitics` is the clitic or clitics to add after the endings to form the actual form value inserted into definite slots; it should be nil for indefinite slots. Its format is the same as for `endings`. `ending_override`, if true, indicates that the ending(s) supplied in `endings` come from a user-specified override, and hence j and v infixes should not be added as they are already included in the override if needed. ]=] local function add_slotval(base, slot_prefix, slot, props, endings, clitics, ending_override) if not endings then return end -- Call skip_slot() based on the declined number and definiteness; if the actual number is different, we correct -- this in decline_noun() at the end. if skip_slot(base.number, base.definiteness, slot) then return end if not clitics then clitics = { "" } elseif type(clitics) == "string" then clitics = { clitics } end if type(endings) == "string" then endings = { endings } end -- Loop over each ending and clitic. for _, endingobj in ipairs(endings) do for _, cliticobj in ipairs(clitics) do -- Do the following inside of the innermost loop even though it does not depend on the value of `cliticobj`, -- because that way we are free to mutate `ending` below. local ending, ending_footnotes if type(endingobj) == "string" then ending = endingobj else ending = endingobj.form ending_footnotes = endingobj.footnotes end -- Ending of "-" means the user used -- to indicate there should be no form here. if ending == "-" then return end local function interr(msg) error(("Internal error: For lemma '%s', slot '%s%s', ending '%s', %s: %s"):format(base.lemma, slot_prefix, slot, ending, msg, dump(props))) end local clitic, clitic_footnotes if type(cliticobj) == "string" then clitic = cliticobj else clitic = cliticobj.form clitic_footnotes = cliticobj.footnotes end -- Compute whether i-mutation or u-mutation is in effect, and compute the "mutation footnotes", which are -- footnotes attached to a mutation-related indicator and which may need to be added even if no mutation is -- in effect (specifically when dealing with an ending that would trigger a mutation if in effect). AFAIK -- you cannot have both mutations in effect at once, and i-mutation overrides u-mutation if both would be in -- effect. -- Single ^ at the beginning of an ending indicates that the i-mutated version of the stem should apply, and -- double ^^ at the beginning indicates that the u-mutated version should apply. local explicit_imut, explicit_umut -- % at the end of a definite ending indicates that the following i- of the clitic should drop, as with -- neuter [[tré]], [[kné]], [[fé]]. There's no counterpart to force irregular inclusion of an i- that would -- normally drop; just include it in the ending (as with acc/dat sg of [[eygló]] "eyeball???" and [[sígó]] -- "cig"). local clitic_i_drops ending, explicit_umut = rsubb(ending, "^%^%^", "") if not explicit_umut then ending, explicit_imut = rsubb(ending, "^%^", "") end ending, clitic_i_drops = rsubb(ending, "%%$", "") local is_vowel_ending = rfind(ending, "^" .. com.vowel_c) local is_vowel_clitic = rfind(clitic, "^" .. com.vowel_c) local mut_in_effect, mut_not_in_effect, mut_footnotes local ending_in_a = not not ending:find("^a") local ending_in_i = not not ending:find("^i") local ending_in_u = not not ending:find("^u") if props.unimut ~= nil and props.unumut ~= nil then interr("Cannot have both 'unimut' and 'unumut' in effect at the same time") end if props.unimut ~= nil and props.imut ~= nil then interr("Cannot have both 'unimut' and 'imut' in effect at the same time") end if props.unumut ~= nil and props.umut ~= nil then interr("Cannot have both 'unumut' and 'umut' in effect at the same time") end if explicit_imut then mut_in_effect = "i" elseif explicit_umut then mut_in_effect = "u" else if props.unimut ~= nil then local is_unimut_slot if base.gender == "m" then is_unimut_slot = slot == "dat_s" or slot:find("_p") elseif base.gender == "f" then is_unimut_slot = slot == "acc_s" or slot == "dat_s" or slot == "dat_p" or slot == "gen_p" else interr( "'unimut' shouldn't be specified with neuter nouns; don't know what slots would be affected; neuter pluralia tantum nouns using 'unimut' should have synthesized a singular without i-mutation") end if is_unimut_slot then mut_not_in_effect = "i" mut_footnotes = props.unimut_footnotes elseif props.unimut then mut_in_effect = "i" end elseif props.imut ~= nil then if ending_in_i then if props.imut then mut_in_effect = "i" mut_footnotes = props.imut_footnotes elseif props.imut == false then mut_not_in_effect = "i" mut_footnotes = props.imut_footnotes end end end if props.unumut ~= nil then local is_unumut_slot if props.unumut == "unumut" or props.unumut == "-unumut" then is_unumut_slot = ending_in_a or ending_in_i elseif base.gender == "m" then is_unumut_slot = slot == "gen_s" or slot == "gen_p" elseif base.gender == "f" then is_unumut_slot = slot == "nom_p" or slot == "acc_p" or slot == "gen_p" else interr( "'unumut' and variants shouldn't be specified with neuter nouns; don't know what slots would be affected; neuter pluralia tantum nouns using 'unumut'and variants should have synthesized a singular without u-mutation") end if not mut_in_effect and not mut_not_in_effect then -- Do nothing if mut_in_effect or mut_not_in_effect because i-mut takes precedence over u-mut; -- FIXME: I hope this is correct in all cases. if is_unumut_slot then mut_not_in_effect = "u" mut_footnotes = props.unumut_footnotes elseif props.unumut then mut_in_effect = "u" end end end if ending_in_u and not mut_in_effect then mut_in_effect = "u" -- umut and uUmut footnotes are incorporated into the appropriate umut_* stems end end local ending_was_asterisk = ending == "*" -- Now compute the appropriate stem to which the ending and clitic are added. `prefix` is either an empty -- string or "pl_" and selects the set of stems to consider when computing the stem in effect. See the -- comment above for `pl_stem`. local function compute_stem_in_effect(prefix) local stem_in_effect if mut_in_effect == "i" then -- NOTE: It appears that imut and defcon never co-occur; otherwise we'd need to flesh out the set of -- stems to include i-mutation versions of defcon stems, similar to what we do for u-mutation. if is_vowel_ending then if not props[prefix .. "imut_vstem"] then interr(("i-mutation in effect and ending begins with a vowel but '.%simut_vstem' not defined") : format(prefix)) end stem_in_effect = props[prefix .. "imut_vstem"] else if not props[prefix .. "imut_nonvstem"] then interr(("i-mutation in effect and ending does not begin with a vowel but '.%simut_nonvstem' not defined") : format(prefix)) end stem_in_effect = props[prefix .. "imut_nonvstem"] end else -- Careful with the following logic; it is written carefully and should not be changed without a -- thorough understanding of its functioning. local has_umut = mut_in_effect == "u" -- First, if the ending is null (or "*", which eventually turns into a null ending; see below), and -- we have a vowel-initial definite-article clitic, use the special 'defcon' stem if available. if (ending == "" or ending == "*") and is_vowel_clitic then stem_in_effect = has_umut and props[prefix .. "umut_null_defvstem"] or props[prefix .. "null_defvstem"] end -- If the stem is still unset, then use the vowel or non-vowel stem if available. When u-mutation is -- active, we first check for the u-mutated version of the vowel or non-vowel stem before falling -- back to the regular vowel or non-vowel stem. Note that an expression like `has_umut and -- props[prefix .. "umut_vstem"] or props[prefix .. "vstem"]` here is NOT equivalent to an if-else -- or ternary operator expression because if `has_umut` is true and `umut_vstem` is missing, it will -- still fall back to `vstem` (which is what we want). if not stem_in_effect then if is_vowel_ending then stem_in_effect = has_umut and props[prefix .. "umut_vstem"] or props[prefix .. "vstem"] else stem_in_effect = has_umut and props[prefix .. "umut_nonvstem"] or props[prefix .. "nonvstem"] end end -- Finally, fall back to the basic stem, which is always defined. stem_in_effect = stem_in_effect or props[prefix .. "stem"] end -- If the ending is "*", it means to use the lemma as the form directly (before adding any definite -- clitic) rather than try to construct the form from a stem and ending. We need to do this for the -- lemma slot and especially for the nominative singular, because we don't have the nominative singular -- ending available and it may vary (e.g. it may be -ur, -l, -n, -a, etc. especially in the masculine). -- Not trying to construct the form from stem + ending also avoids complications from the nominative -- singular in -ur, which exceptionally does not trigger u-mutation. However, when 'defcon' is active -- and we're processing a definite form beginning with a vowel (i.e. is_vowel_clitic is set), we can't -- do this, because the form to which the clitic is added is not the lemma but the contracted version. -- As it happens, this works out because in all situations where 'defcon' is active, the nominative -- singular has a null ending. (If this weren't the case, we'd have to change all the declension -- functions to pass in the nominative singular ending in addition to other endings.) An example where -- 'defcon' is active is neuter [[mastur]] "mast" with definite nominative singular [[mastrið]]; here, -- using the lemma would incorrectly produce #[[masturið]]. -- Finally, however, if there is a footnote associated with the computed stem in effect, we need to -- preserve it. if ending == "*" then if not is_vowel_clitic or not props.defcon or props.defcon.form ~= "defcon" then local stem_in_effect_footnotes if type(stem_in_effect) == "table" then stem_in_effect_footnotes = stem_in_effect.footnotes end stem_in_effect = iut.combine_form_and_footnotes(base.actual_lemma, stem_in_effect_footnotes) end -- See comment above. When 'defcon' is not in effect, we changed the stem to be the lemma and -- want to use a null ending; otherwise, the ending is always null anyway, so it's safe to set -- it thus. ending = "" end return stem_in_effect end local stem_in_effect = props.pl_stem and slot:find("_p$") and compute_stem_in_effect("pl_") or compute_stem_in_effect("") local infix, infix_footnotes -- Compute the infix (j, v or nothing) that goes between the stem and ending. if not ending_override and is_vowel_ending then if props.vinfix and props.jinfix then interr("Can't have specifications for both '.vinfix' and '.jinfix'; should have been caught above") end if props.vinfix then infix = props.vinfix infix_footnotes = props.vinfix_footnotes elseif props.jinfix and not ending_in_i then infix = props.jinfix infix_footnotes = props.jinfix_footnotes end end -- If base-level footnotes specified, they go before any stem footnotes, so we need to extract any footnotes -- from the stem in effect and insert the base-level footnotes before. In general, we want the footnotes to -- be in the order [base.footnotes, stem.footnotes, mut_footnotes, infix_footnotes, ending.footnotes, -- clitic.footnotes]. if base.footnotes then local stem_in_effect_footnotes if type(stem_in_effect) == "table" then stem_in_effect_footnotes = stem_in_effect.footnotes stem_in_effect = stem_in_effect.form end stem_in_effect = iut.combine_form_and_footnotes(stem_in_effect, iut.combine_footnotes(base.footnotes, stem_in_effect_footnotes)) end local ending_is_full ending, ending_is_full = rsubb(ending, "^!", "") local function combine_stem_ending(stem, clitic) if stem == "?" then return "?" end local function drop_clitic_i() clitic = clitic:gsub("^i", "") end -- If we're definite-only and using the actual lemma as the stem, the clitic is already incorporated -- into the stem. if base.definiteness == "def" and ending_was_asterisk then return stem end -- % at the end of a definite ending indicates that the following i- of the clitic should drop; see -- above. if clitic_i_drops then drop_clitic_i() end local stem_with_infix = ending_is_full and "" or stem .. (infix or "") -- Drop final -j- of stem before an ending beginning with a consonant. This happens e.g. in [[kirkja]] -- "church" with genitive plural -na, producing [[kirkna]]. It does not happen with a null ending; cf. -- neuter [[emj]] "cries, shouting" and [[gremj]] "anger, irritation" (the latter not in BÍN). if stem_with_infix:find("j$") and rfind(ending, "^" .. com.cons_c) then stem_with_infix = stem_with_infix:gsub("j$", "") end local stem_with_ending -- An initial s- of the ending drops after a cluster of cons + s (including written <x>). if ending:find("^s") and (stem_with_infix:find("x$") or rfind(stem_with_infix, com.cons_c .. "s$")) then stem_with_ending = stem_with_infix .. ending:gsub("^s", "") else stem_with_ending = stem_with_infix .. ending end if clitic == "" then return stem_with_ending end if slot == "dat_p" then stem_with_ending = stem_with_ending:gsub("m$", "") end if clitic:find("^i.*[aiu]") then -- disyllabic clitics in i- -- in practice, fem acc_s -ina, dat_s -inni, gen_s -innar if rfind(stem_with_ending, com.vowel_c .. "$") then drop_clitic_i() end elseif clitic:find("^i") then -- monosyllabic clitics in i- local ending_for_clitic_dropping = ending_was_asterisk and base.lemma_ending or ending if ending_for_clitic_dropping:find("[aiu]$") then drop_clitic_i() end end return stem_with_ending .. clitic end local combined_footnotes = iut.combine_footnotes( iut.combine_footnotes(mut_footnotes, infix_footnotes), iut.combine_footnotes(ending_footnotes, clitic_footnotes) ) local clitic_with_notes = iut.combine_form_and_footnotes(clitic, combined_footnotes) if not stem_in_effect then interr("stem_in_effect is nil") end iut.add_forms(base.forms, slot_prefix .. slot, stem_in_effect, clitic_with_notes, combine_stem_ending) end end end -- Add the definite and indefinite variants of a slot by combining the appropriate stem in `props` with (optionally) an -- infix in `props` and the endings in `endings`, tacking on the definite article clitic in the definite slot variant. -- This calls the underlying function add_slotval() twice, once for indefinite forms and once for definite forms, and is -- normally called by add_decl() or similar function to add an entire declension. `endings` can be nil (no endings are -- added), a single string, a list of strings, a list of form objects (i.e. in general list form), or a table containing -- fields `indef` and `def` (each of which can be any of the previous formats) to add separate sets of endings for the -- indefinite and definite slot variants. If any of the formats for `endings` is supplied other than the separate -- indefinite/definite table, the supplied set of endings is used for both indefinite and definite slot variants. -- `ending_override` and `endings_are_full` are as in add_slotval(). local function add(base, slot, props, endings, ending_override, endings_are_full) if not endings then return end local indef_endings, def_endings if type(endings) == "table" and (endings.indef or endings.def) then indef_endings = endings.indef def_endings = endings.def else indef_endings = endings def_endings = endings end if indef_endings and base.definiteness ~= "def" then add_slotval(base, "ind_", slot, props, indef_endings, nil, ending_override, endings_are_full) end if def_endings and (base.definiteness ~= "indef" and base.definiteness ~= "none") then local clitic = clitic_articles[base.gender] if not clitic then error(("Internal error: Unrecognized value for base.gender: %s"):format(dump(base.gender))) end clitic = clitic[slot] if not clitic then error(("Internal error: Unrecognized value for `slot` in add(): %s"):format(dump(slot))) end add_slotval(base, "def_", slot, props, def_endings, clitic, ending_override, endings_are_full) end end -- Generate the accusative plural ending from the nominative plural. For feminines and neuters, both are the same. -- For masculines, drop the -r except in -ur. local function acc_p_from_nom_p(base, nom_p) if base.gender == "f" or base.gender == "n" then return nom_p end if not nom_p then return nom_p -- this is correct as `nom_p` could be nil or false and we want to return the same thing end local function form_masc_acc_p(ending) -- Form the masculine accusative by dropping -r unless the form ends in -ur, which is kept. If the ending is *, -- we substitute the entire actual lemma. In that case, if the lemma is definite-only, we have to strip off -- the nominative plural clitic -nir before generating the accusative. We don't add the clitic -na because it -- will be added in add_slotval(). if ending == "*" then ending = "!" .. base.actual_lemma end if base.definiteness == "def" and ending:find("^!") then ending = ending:match("^(.*)nir$") if not ending then error(("Masculine plural definite-only lemma '%s' does not end in expected clitic '-nir'; " .. "don't know how to compute the corresponding accusative plural"):format(base.actual_lemma)) end end -- If the ending is full (begins with !), check the whole thing for -ur at the end. if ending:find("^%^*ur$") or ending:find("^!.*[^Aa]ur$") then -- as-is else ending = ending:gsub("r$", "") end return ending end if type(nom_p) == "string" then return form_masc_acc_p(nom_p) end local acc_p = {} for _, ending in ipairs(nom_p) do if type(ending) == "string" then table.insert(acc_p, form_masc_acc_p(ending)) else table.insert(acc_p, { form = form_masc_acc_p(ending.form), footnotes = ending.footnotes }) end end return acc_p end local function process_one_slot_override(base, slot, spec) -- Call skip_slot() based on the declined number and definiteness; if the actual number is different, we correct -- this in decline_noun() at the end. if skip_slot(base.number, base.definiteness, slot) then error(("Override specified for invalid slot '%s' due to '%s' number restriction and/or '%s' definiteness restriction") :format( slot, base.number, base.definiteness)) end local defslot = slot:find("^def_") if defslot then base.forms[slot] = nil else if spec.indef ~= false then base.forms["ind_" .. slot] = nil end if spec.def ~= false then base.forms["def_" .. slot] = nil end end if defslot then local slot_prefix -- Don't call add(), like below, because it adds both indefinite and definite variants, including definite -- clitics in the latter. Instead, directly call add_slotval(). But we need to separate the slot into slot -- prefix "def_" and the remainder because add_slotval() expects slots to be missing the prefix when -- checking which stem to use (which may depend on the slot). slot_prefix, slot = slot:match("^(def_)(.*)$") for _, props in ipairs(base.prop_sets) do add_slotval(base, slot_prefix, slot, props, spec.def, nil, "ending override") end else local endings if spec.indef ~= nil and spec.def ~= nil then -- This could include `false` as the value of either `spec.indef` or `spec.def` to not touch those slots. -- Note that specifying something like 'dat/i' is allowed and will only override the definite slot, but -- is different from a definite-slot override 'defdatinum' because the latter includes the clitic in it. endings = { indef = spec.indef, def = spec.def, } elseif not spec.indef then error(("Internal error: Unless both `spec.indef` and `spec.def` have non-nil values (i.e. the user included a slash in the override, `spec.indef` must be defined: %s") :dump(spec)) elseif slot == "acc_p" then -- As a special case, don't carry over literary acc_p ending -u to the definite. local def_endings = {} for _, ending in ipairs(spec.indef) do -- If the ending is full (begins with !), check the whole thing for -u at the end. if not ending.form:find("^%^*u$") and not ending.form:find("^!.*[^Aa]u$") then table.insert(def_endings, ending) end end endings = { indef = spec.indef, def = def_endings, } else endings = spec.indef end for _, props in ipairs(base.prop_sets) do add(base, slot, props, endings, "ending override") end end end local function process_slot_overrides(base) if base.gens then process_one_slot_override(base, "gen_s", base.gens) end if base.pls then local spec = base.pls process_one_slot_override(base, "nom_p", spec) local acc_p_spec = { indef = acc_p_from_nom_p(base, spec.indef), def = acc_p_from_nom_p(base, spec.def), } process_one_slot_override(base, "acc_p", acc_p_spec) end for slot, spec in pairs(base.overrides) do process_one_slot_override(base, slot, spec) end end -- Generate the full declension for the term given the endings for each slot. acc_p, dat_p and gen_p can be omitted and -- will be defaulted: dat_p defaults to "um", gen_p defaults to "a", and acc_p defaults to the nom_p except for masculines -- not in -ur, where the -r is dropped. Use `false` as the value of an ending to disable generating any value for that -- slot. local function add_decl_with_nom_sg(base, props, nom_s, acc_s, dat_s, gen_s, nom_p, acc_p, dat_p, gen_p) add(base, "nom_s", props, nom_s) add(base, "acc_s", props, acc_s) add(base, "dat_s", props, dat_s) add(base, "gen_s", props, gen_s) if base.number == "pl" then -- If this is a plurale tantum noun and we're processing the nominative plural, use the user-specified lemma -- rather than generating the plural from the synthesized singular, which may not match the specified lemma. -- This is both because we don't set a plural override to specify what the plural should look like and because -- of exceptional cases like [[dyr]], which is plural-only and uses 'decllemma:dyrir'. nom_p = "*" end add(base, "nom_p", props, nom_p) -- Generate defaults for acc_p, dat_p, gen_p if nil was specified; but be careful not to do so for false, which -- means to generate no form. if acc_p == nil then acc_p = acc_p_from_nom_p(base, nom_p) end if dat_p == nil then dat_p = "um" end if gen_p == nil then gen_p = "a" end add(base, "acc_p", props, acc_p) add(base, "dat_p", props, dat_p) add(base, "gen_p", props, gen_p) end -- Generate the full declension for the term given the endings for each slot except the nom_s. This is like -- add_decl_with_nom_sg() but takes the nom sg directly from the lemma instead of trying to reconstruct it from a stem, -- which is more correct in the vast majority of circumstances. The * below is a signal to the underlying add() function -- to use the actual lemma (not any stem, and not the value of 'decllemma:' if given) for the nom sg. Note that add() is -- smart enough to ignore this for the definite nom sg when the 'defcon' indicator is given, because in that case the stem -- for the def nom sg is contracted compared with the lemma. (Specifically, it uses the correct contracted stem and a null -- ending; AFAIK all cases of 'defcon' occur with lemmas with a null ending in the nom sg.) local function add_decl(base, props, acc_s, dat_s, gen_s, nom_p, acc_p, dat_p, gen_p) add_decl_with_nom_sg(base, props, "*", acc_s, dat_s, gen_s, nom_p, acc_p, dat_p, gen_p) end local function add_sg_decl(base, props, acc_s, dat_s, gen_s) add_decl(base, props, acc_s, dat_s, gen_s, false, false, false, false) end local function add_pl_only_decl(base, props, acc_p, dat_p, gen_p) add_decl(base, props, false, false, false, "*", acc_p, dat_p, gen_p) end -- Table mapping declension types to functions to decline the noun. The function takes two arguments, `base` and -- `props`; the latter specifies the computed stems (vowel vs. non-vowel, singular vs. plural) and whether the noun -- is reducible and/or has vowel alternations in the stem. Most of the specifics of determining which stem to use -- and how to modify it for the given ending are handled in add_decl(); the declension functions just need to generate -- the appropriate endings. local decls = {} decls["indecl"] = function(base, props) add_decl(base, props, "", "", "", "", "", "", "") end decls["decl?"] = function(base, props) add_decl(base, props, "?", "?", "?", "?", "?", "?", "?") end decls["m"] = function(base, props) -- The default dative singular is computed below in determine_default_masc_dat_sg(). local dat = props.default_dat_sg add_decl(base, props, "", dat, "s", "ar") end decls["m-ir"] = function(base, props) add_decl(base, props, "i", "i", "is", "ar") end decls["m-skapur"] = function(base, props) -- Nouns in -skapur; default gen is -ar, default dat is -/-, default num is sg. add_decl(base, props, "", "", "ar", "ar") end decls["m-naður"] = function(base, props) -- Nouns in -naður; default gen is -ar, default dat is dati/i:-, default nom pl is -ir, default num is sg, -- default u-mutation is uUmut. add_decl(base, props, "", { indef = "i", def = { "i", "" } }, "ar", "ir") end decls["m-kell"] = function(base, props) -- Proper nouns in -kell; [[Þorkell]], [[Grímkell]], etc. local alt_dat_s = base.stem:gsub("kel$", "katli") add_decl(base, props, "", { "i", { form = "!" .. alt_dat_s, footnotes = { "[archaic]" } } }, "s", false, false, false, false) end decls["m-ó"] = function(base, props) -- abbreviations of school names generally have null genitive: [[Kennó]] from [[Kennaraskóla]] "Teachers' College"), -- [[Astró]], [[Borgó]] (from [[Borgarholtsskóli]]), [[Bríó]], [[Foldó]] (from [[Foldaskóli]]), [[Hafró]] (from -- [[Hafrannsóknastofnun]] "Marine Research Institute" (of Norway), [[Hagó]] (from [[Hagaskóli]]), [[Húsó]], -- [[Kvennó]] (from [[Kvennaskóli]]), [[Meló]] (from [[Melaskóli]]), [[Menntó]] (from [[Menntaskóli]]), [[Tónó]] -- (from [[Tónlistarskóli]]), [[Való]] (from [[Valhúsaskóli]]), [[Versló]]/[[Verzló]] (from -- [[Verslunarskóli Íslands|Iceland Business School]]); but these are completely outweighed by male given names, -- nicknames and historical names of men in -ó (e.g. [[Bó]], [[Bóbó]], [[Brúnó]], [[Dittó]], [[Filpó]], [[Galíleó]], -- [[Jagó]], [[Kató]], [[Kristó]], [[Leó]], [[Leónardó]], [[Markó]], etc.) as well as common nouns in -ó (e.g. -- [[bóleró]] "bolero", [[evró]] "Euro (dated)", [[faraó]] "pharaoh", [[kanó]] "canoe", [[kímonó]] "kimono", -- [[mambó]] "mambo", [[pesó]] "peso", [[pikkóló]] "piccolo", [[róló]] "playground", [[sleikjó]] "lollipop", -- etc.) add_decl(base, props, "", "", "s", "ar") end decls["m-rstem"] = function(base, props) local imut = "^" add_decl(base, props, "ur", "ur", { "ur", { form = "urs", footnotes = { "[proscribed]" } } }, imut .. "ur", nil, imut .. "rum", imut .. "ra") end decls["m-ndi"] = function(base, props) -- Words in -ndi, mostly derived from present participles and mostly in [[andi]]; but cf. [[bóndi]], [[frændi]], -- and [[fjandi]] with two plurals with different meanings. local imut if props.stem:find("ænd$") then imut = "" else imut = "^" end add_decl(base, props, "a", "a", "a", imut .. "ur", nil, { imut .. "um", { form = "um", footnotes = "[rare/obsolete]" } }, { imut .. "a", { form = "a", footnotes = "[rare/obsolete]" } }) end decls["m-weak"] = function(base, props) -- Words in -i like [[tími]] "time, hour"; also words in -a e.g. [[herra]] "gentleman; sir, Mr. (term of address)", -- [[séra]]/[[síra]] "reverend" add_decl(base, props, "a", "a", "a", "ar") end decls["f"] = function(base, props) -- Normal strong feminine nouns; default to genitive -ar, plural -ir. add_decl(base, props, "", "", "ar", "ir") end decls["f-ung"] = function(base, props) -- Strong feminine nouns in -ung, e.g. [[nýjung]] "newness, novelty; piece of news", [[nauðung]] -- "constraint, compulsion". Most such nouns are singular-only, e.g. [[djörfung]] "boldness, daring", [[launung]] -- "secrecy". Occasional nouns need overrides, e.g. [[sundrung]] "scattering; dissension, division, disunity" with -- acc/dat sg either - or -u (but only - in the definite acc/dat sg). add_decl(base, props, "", "", "ar", "ar") end decls["f-ing"] = function(base, props) -- Strong feminine nouns in -ing, e.g. [[kerling]] "old woman", [[eining]] "unity; unit". Singular-only: e.g. -- [[málning] "paint", [[menning]] "culture", [[örvænting]] "despair". add_decl(base, props, "u", "u", "ar", "ar") end decls["f-ur"] = function(base, props) add_decl(base, props, "i", "i", "ar", "ir") end decls["f-i"] = function(base, props) add_decl(base, props, "i", "i", "i", "ir") end decls["f-long-vowel"] = function(base, props) -- nouns in -á, e.g. [[á]] "river", [[gjá]] "gorge, canyon", [[skuggská]] "mirror", [[slá]] "door bolt"; -- nouns in -ó, e.g. [[fló]] "flea", [[kónguló]] "spider", [[kló]] "claw"; -- nouns in -ú, e.g. [[frú]] "married woman", [[trú]] "faith, belief". -- Each is slightly different. local gen, nompl if props.stem:find("á$") then gen = "r" nompl = "r" elseif props.stem:find("ó$") then gen = "ar" nompl = "^r" elseif props.stem:find("ú$") then gen = "ar" nompl = "r" else error(("Unrecognized stem '%s' for long-vowel feminine; should end in -á, -ó or -ú")) end add_decl(base, props, "", "", gen, nompl, nompl, "m", { indef = "a", def = "" }) end decls["f-long-umlaut-vowel-r"] = function(base, props) -- nouns in long umlauted vowel + -r: [[kýr]] "cow", [[sýr]] "sow (archaic)", [[ær]] and compounds. add_decl(base, props, "", "", "^r", "^r", "^r", "m", { indef = "a", def = "" }) end decls["f-acc-dat-i"] = function(base, props) -- Some proper female names with -i in the acc and dat sg add_decl(base, props, "i", "i", "ar", "ar") end decls["f-rstem"] = function(base, props) local imut if props.stem:find("syst$") then imut = "" else imut = "^" end local sg_ending = { "ur", { form = "ir", footnotes = { "[proscribed]" } } } add_decl(base, props, sg_ending, sg_ending, sg_ending, imut .. "ur", nil, imut .. "rum", imut .. "ra") end decls["f-weak"] = function(base, props) add_decl(base, props, "u", "u", "u", "ur") end decls["n"] = function(base, props) -- Normal (strong) neuter nouns. add_decl(base, props, "", "i", "s", "^^") end decls["n-já"] = function(base, props) -- [[tré]] "tree; wood"; [[hné]]/[[kné]] "knee"; [[fé]] "sheep; cattle; money"; the stem has previously been set -- to not include final -é; fé has genitive fjár while the others have genitive in -és. local gen = props.stem:find("f$") and "jár" or "és" add_decl_with_nom_sg(base, props, "é%", "é%", "é", gen, "é%", "é%", "jám", { indef = "jáa", def = "já" }) end decls["n-i"] = function(base, props) -- Neuter nouns in -i, e.g. [[kvæði]] "poem, song". Nouns in -ki and -gi e.g. [[ríki]] "state, kingdom" and [[engi]] -- "meadow" have j-insertion by default, which is set elsewhere. add_decl(base, props, "i", "i", "is", "i") end decls["n-weak"] = function(base, props) -- "Weak" neuter nouns in -a, e.g. [[auga]] "eye", [[hjarta]] "heart". U-mutation occurs in the nom/acc/dat pl but -- doesn't need to be indicated explicitly because the ending begins with u-. add_decl(base, props, "a", "a", "a", "u") end local function reconstruct_control_spec(control_specs) local parts = {} local function ins(txt) table.insert(parts, txt) end for i, spec in ipairs(control_specs) do if i > 1 then ins(",") end ins(spec.form) if spec.footnotes then for _, footnote in ipairs(spec.footnotes) do ins(footnote) -- already has brackets around it end end end return table.concat(parts) end decls["adj"] = function(base, _props) -- This maps from a slot name constructed from the individual state, case, gender and number properties to the -- actual syncretic slot name used in [[Module:is-adjective]]. local slot_to_syncretic_slot_mapping = { str_nom_m_s = "str_nom_m", str_nom_f_s = "str_nom_f", str_nom_n_s = "str_nom_n", str_acc_m_s = "str_acc_m", str_acc_f_s = "str_acc_f", str_acc_n_s = "str_nom_n", str_dat_m_s = "str_dat_m", str_dat_f_s = "str_dat_f", str_dat_n_s = "str_dat_n", str_gen_m_s = "str_gen_m", str_gen_f_s = "str_gen_f", str_gen_n_s = "str_gen_n", str_nom_m_p = "str_nom_mp", str_nom_f_p = "str_nom_fp", str_nom_n_p = "str_nom_np", str_acc_m_p = "str_acc_mp", str_acc_f_p = "str_nom_fp", str_acc_n_p = "str_nom_np", str_gen_m_p = "str_gen_p", str_gen_f_p = "str_gen_p", str_gen_n_p = "str_gen_p", str_dat_m_p = "str_dat_p", str_dat_f_p = "str_dat_p", str_dat_n_p = "str_dat_p", wk_nom_m_s = "wk_nom_m", wk_nom_f_s = "wk_nom_f", wk_nom_n_s = "wk_n", wk_acc_m_s = "wk_obl_m", wk_acc_f_s = "wk_obl_f", wk_acc_n_s = "wk_n", wk_dat_m_s = "wk_obl_m", wk_dat_f_s = "wk_obl_f", wk_dat_n_s = "wk_n", wk_gen_m_s = "wk_obl_m", wk_gen_f_s = "wk_obl_f", wk_gen_n_s = "wk_n", wk_nom_m_p = "wk_p", wk_nom_f_p = "wk_p", wk_nom_n_p = "wk_p", wk_acc_m_p = "wk_p", wk_acc_f_p = "wk_p", wk_acc_n_p = "wk_p", wk_gen_m_p = "wk_p", wk_gen_f_p = "wk_p", wk_gen_n_p = "wk_p", wk_dat_m_p = "wk_p", wk_dat_f_p = "wk_p", wk_dat_n_p = "wk_p", } local props = {} local function ins(prop) table.insert(props, prop) end for _, spectype in ipairs(m_is_adjective.control_specs) do if base[spectype] then ins(reconstruct_control_spec(base[spectype])) end end -- If a specific reverse u-mutation type was specified and no u-mutation was given, convert the reverse -- u-mutation into a regular u-mutation by chopping off the "un" at the beginning. if base.adj_unumut and not base.umut then ins(base.adj_unumut:sub(3)) end for k, _ in pairs(base.props) do if m_is_adjective.boolean_property_set[k] then ins(k) end end if not base.props.builtin then ins(base.props.iscomp and "-pos" or "-comp") end if base.stem == "#" or base.stem == "##" then ins(base.stem) elseif base.stem then ins("stem:" .. base.stem) end for _, stem in ipairs(m_is_adjective.overridable_stems) do if stem ~= "stem" and base[stem] then ins(("%s:%s"):format(stem, base.stem)) end end local propspec = table.concat(props, ".") if propspec ~= "" then propspec = "<" .. propspec .. ">" end local argspec = base.lemma .. propspec local adj_alternant_multiword_spec = m_is_adjective.do_generate_forms({ argspec }, argspec, "is-ndecl") local function copy(from_slot, to_slot, do_clone) -- We want to avoid sharing form objects (although sharing footnotes is OK, but we don't avoid cloning them -- here) so we can later side-effect form objects as needed. `do_clone` is set to avoid such sharing, -- specifically when the weak form of the adjective is used for both definite and indefinite slots. local source = adj_alternant_multiword_spec.forms[from_slot] if do_clone then source = m_table.deepCopy(source) end base.forms[to_slot] = source end local function copy_gender_number_forms(gender, number) local state = base.adj_is_weak and "wk" or "str" local degree_pref = base.props.iscomp and "comp_" or "" for _, case in ipairs(cases) do local individual_slot = state .. "_" .. case .. "_" .. gender .. "_" .. number local wk_individual_slot = "wk_" .. case .. "_" .. gender .. "_" .. number local syncretic_slot = slot_to_syncretic_slot_mapping[individual_slot] local wk_syncretic_slot = slot_to_syncretic_slot_mapping[wk_individual_slot] if not syncretic_slot then error(("Internal error: Constructed bad individual slot '%s' with no entry in syncretic slot mapping"): format(individual_slot)) end syncretic_slot = degree_pref .. syncretic_slot if not wk_syncretic_slot then error(("Internal error: Constructed bad weak individual slot '%s' with no entry in syncretic slot mapping") : format(wk_individual_slot)) end wk_syncretic_slot = degree_pref .. wk_syncretic_slot copy(syncretic_slot, "ind_" .. case .. "_" .. number) copy(wk_syncretic_slot, "def_" .. case .. "_" .. number, syncretic_slot == wk_syncretic_slot) end end if base.number ~= "pl" then copy_gender_number_forms(base.gender, "s") end if base.number ~= "sg" then copy_gender_number_forms(base.gender, "p") end end local function set_builtin_defaults(base) if base.gender or base.number or base.definiteness then error("Can't specify gender, number or definiteness for built-in terms") end local function builtin_props() -- Return values are GENDER, NUMBER if base.lemma == "ég" or base.lemma == "þú" then return "none", "sg" elseif base.lemma == "við" or base.lemma == "þið" then return "none", "pl" elseif base.lemma == "hann" then return "m", "sg" elseif base.lemma == "hún" then return "f", "sg" elseif base.lemma == "það" then return "n", "sg" elseif base.lemma == "þeir" then return "m", "pl" elseif base.lemma == "þær" then return "f", "pl" elseif base.lemma == "þau" then return "n", "pl" elseif base.lemma == "sig" then return "none", "none" else error(("Unrecognized pronoun '%s'"):format(base.lemma)) end end local gender, number = builtin_props() base.gender = gender base.actual_gender = gender base.number = number base.actual_number = number base.definiteness = "none" end local function determine_builtin_props(base) base.prop_sets[1].stem = { form = "" } base.decl = "builtin" end decls["builtin"] = function(base, props) if base.lemma == "ég" then add_sg_decl(base, props, "mig", "mér", "mín") elseif base.lemma == "þú" then add_sg_decl(base, props, "þig", "þér", "þín") elseif base.lemma == "hann" then add_sg_decl(base, props, "hann", "honum", "hans") elseif base.lemma == "hún" then add_sg_decl(base, props, "hana", "henni", "hennar") elseif base.lemma == "það" then add_sg_decl(base, props, "það", "því", "þess") elseif base.lemma == "við" then add_pl_only_decl(base, props, "okkur", "okkur", "okkar") elseif base.lemma == "þið" then add_pl_only_decl(base, props, "ykkur", "ykkur", "ykkar") elseif base.lemma == "þeir" then add_pl_only_decl(base, props, "þá", "þeim", "þeirra") elseif base.lemma == "þær" then add_pl_only_decl(base, props, "þær", "þeim", "þeirra") elseif base.lemma == "þau" then add_pl_only_decl(base, props, "þau", "þeim", "þeirra") elseif base.lemma == "sig" then -- Underlyingly we handle [[sig]]'s slots as singular. add_decl_with_nom_sg(base, props, false, "*", "sér", "sín", false, false, false, false) else error(("Internal error: Unrecognized pronoun lemma '%s'"):format(base.lemma)) end end -- Return the lemmas for this term. The return value is a list of {form = FORM, footnotes = FOOTNOTES}. -- If `linked_variant` is given, return the linked variants (with embedded links if specified that way by the user), -- otherwies return variants with any embedded links removed. If `remove_footnotes` is given, remove any -- footnotes attached to the lemmas. function export.get_lemmas(alternant_multiword_spec, linked_variant, remove_footnotes) local slots_to_fetch = potential_lemma_slots local linked_suf = linked_variant and "_linked" or "" for _, slot in ipairs(slots_to_fetch) do if alternant_multiword_spec.forms[slot .. linked_suf] then local lemmas = alternant_multiword_spec.forms[slot .. linked_suf] if remove_footnotes then local lemmas_no_footnotes = {} for _, lemma in ipairs(lemmas) do table.insert(lemmas_no_footnotes, { form = lemma.form }) end return lemmas_no_footnotes else return lemmas end end end return {} end local function handle_derived_slots_and_overrides(base) -- Process slot overrides: First slots specified after the gender, then individual slot overrides specified as -- separate indicators. process_slot_overrides(base) -- Compute linked versions of potential lemma slots, for use in {{is-noun}}. We substitute the original lemma -- (before removing links) for forms that are the same as the lemma, if the original lemma has links. for _, slot in ipairs(potential_lemma_slots) do iut.insert_forms(base.forms, slot .. "_linked", iut.map_forms(base.forms[slot], function(form) if form == base.orig_lemma_no_links then if base.orig_lemma:find("%[%[") then return base.orig_lemma elseif not base.is_multiword then return form elseif not base.props.linkasis and (base.lemma ~= base.orig_lemma_no_links or base.link_lowercase) then local lemma_for_linking = base.lemma if base.link_lowercase then local init, rest = rmatch(lemma_for_linking, "^(.)(.*)$") lemma_for_linking = ulower(init) .. rest end return ("[[%s|%s]]"):format(lemma_for_linking, base.orig_lemma_no_links) else return ("[[%s]]"):format(form) end else return form end end)) end end -- Process specs given by the user using 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'. local function process_addnote_specs(base) for _, spec in ipairs(base.addnote_specs) do for _, slot_spec in ipairs(spec.slot_specs) do slot_spec = "^" .. slot_spec .. "$" for slot, forms in pairs(base.forms) do if rfind(slot, slot_spec) then -- To save on memory, side-effect the existing forms. for _, form in ipairs(forms) do form.footnotes = iut.combine_footnotes(form.footnotes, spec.footnotes) end end end end end end local function is_regular_noun(base) return not base.adjspec and not base.props.builtin end local function process_declnumber(base) base.actual_number = base.number if base.declnumber then if base.declnumber == "sg" or base.declnumber == "pl" then base.number = base.declnumber else error(("Unrecognized value '%s' for 'declnumber', should be 'sg' or 'pl'"):format(base.declnumber)) end end end -- Map `fn` over an override spec (either `gens`, `pls` or one of the overrides in `overrides`). `fn` is passed one -- item (the form object of the override), which it can mutate if needed. If it ever returns non-nil, mapping stops -- and that value is returned as the return value of `map_override`; otherwise mapping runs to completion and nil is -- returned. local function map_override(override, fn) if not override then return nil end local function map_one_list(list) if not list then return nil end for _, formobj in ipairs(list) do local retval = fn(formobj) if retval ~= nil then return retval end end return nil end local retval = map_one_list(override.indef) if retval ~= nil then return retval end return map_one_list(override.def) end -- Map `fn` over all override specs in `base` (`gens`, `pls` and the overrides in `overrides`). `fn` is passed one -- item (the form object of the override), which it can mutate if needed. If it ever returns non-nil, mapping stops -- and that value is returned as the return value of `map_override`; otherwise mapping runs to completion and nil is -- returned. local function map_all_overrides(base, fn) for slot, override in pairs(base.overrides) do local retval = map_override(override, fn) if retval ~= nil then return retval end end local retval = map_override(base.gens, fn) if retval ~= nil then return retval end return map_override(base.pls, fn) end -- Like put.split_alternating_runs_and_strip_spaces(), but ensure that backslash-escaped commas and periods are not -- treated as separators. local function split_alternating_runs_with_escapes(segments, splitchar) for i, segment in ipairs(segments) do segment = rsub(segment, "\\,", SUB_ESCAPED_COMMA) segments[i] = rsub(segment, "\\%.", SUB_ESCAPED_PERIOD) end local separated_groups = put.split_alternating_runs_and_strip_spaces(segments, splitchar) for _, separated_group in ipairs(separated_groups) do for i, segment in ipairs(separated_group) do segment = rsub(segment, SUB_ESCAPED_COMMA, ",") separated_group[i] = rsub(segment, SUB_ESCAPED_PERIOD, ".") end end return separated_groups end local function fetch_footnotes(separated_group, parse_err) local footnotes for j = 2, #separated_group - 1, 2 do if separated_group[j + 1] ~= "" then parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'") end if not footnotes then footnotes = {} end table.insert(footnotes, separated_group[j]) end return footnotes end -- Fetch and parse a slot override, e.g. "ar:s" or "um:m[archaic]/um" or "i:!Þorkatli[archaic]" (where ! indicates that -- the override is the full form including the stem); that is, everything after the slot name(s). `segments` is the -- input in the form of a list where the footnotes have been separated out (see `parse_override` below); `spectype` is -- used in error messages and specifies e.g. "genitive" or "dat+gen slot override"; `allow_blank` indicates that a -- completely blank override spec is allowed (in that case, nil will be returned); `defslot`, if true, indicates that -- we're processing a definite slot override, i.e. two slash-separated specs (indefinite and definite) are not allowed -- and the return overrides will be stored into `def`; and `parse_err` is a function of one argument to throw a parse -- error. The return value is an object containing fields `indef` and/or `def`, of the format described below in the -- comment above `parse_override`. local function fetch_slot_override(segments, spectype, allow_blank, defslot, parse_err) if allow_blank and #segments == 1 and segments[1] == "" then return nil end local slash_separated_groups = put.split_alternating_runs_and_strip_spaces(segments, "/") if #slash_separated_groups > 2 then parse_err(("Can specify at most two slash-separated override groups for %s, but saw %s"):format( spectype, #slash_separated_groups)) end if slash_separated_groups[2] and defslot then parse_err(("Can't specify two slash-separated override groups for %s; the second override group is for the definite slot variant, but the slot is already definite") :format( spectype)) end local ret = {} for i, slash_separated_group in ipairs(slash_separated_groups) do local retfield = defslot and "def" or i == 1 and "indef" or "def" if #slash_separated_group == 1 and slash_separated_group[1] == "" then ret[retfield] = false else local colon_separated_groups = put.split_alternating_runs_and_strip_spaces(slash_separated_group, ":") local specs = {} for _, colon_separated_group in ipairs(colon_separated_groups) do local form = colon_separated_group[1] if form == "" then parse_err(("Use - to indicate an empty ending for %s: '%s'"):format(spectype, table.concat(segments))) elseif form == "-" then form = "" elseif form == "--" then -- missing form = "-" end local new_spec = { form = form, footnotes = fetch_footnotes(colon_separated_group, parse_err) } for _, existing_spec in ipairs(specs) do if existing_spec.form == new_spec.form then parse_err("Duplicate " .. spectype .. " spec '" .. table.concat(colon_separated_group) .. "'") end end table.insert(specs, new_spec) end ret[retfield] = specs end end return ret end --[=[ Parse a single override spec (e.g. 'dat-:i/-' or 'nompl+accpl^/' or 'defnompl+defaccpl!sumrin[when referring to summers in general]:!sumurin[when referring to a specific number of summers]') and return two values: the slot(s) the override applies to, and an object describing the override spec. The input is actually a list where the footnotes have been separated out; for example, given the third example spec above, the input will be a list {"defnompl+defaccpl!sumrin", "[when referring to summers in general]", ":!sumurin", "[when referring to a specific number of summers]", ""}. The object returned for 'dat-:i[mostly in the context of violent actions]/-' looks like this: { indef = { { form = "" }, { form = "i", footnotes = {"[mostly in the context of violent actions]"} } }, def = { { form = "" } } } The object returned for '!nompl+accpl^/' looks like this: { indef = { { form = "^" }, }, def = false } The object returned for 'defnompl+defaccpl!sumrin[when referring to summers in general]:!sumurin[when referring to a specific number of summers]' looks like this: { def = { { form = "!sumrin", footnotes = {"[when referring to summers in general]"} }, { form = "!sumurin", footnotes = {"[when referring to a specific number of summers]"} } } } ]=] local function parse_override(segments, parse_err) local part = segments[1] local slots = {} local defslot while true do local this_defslot if part:find("^def") then this_defslot = true part = usub(part, 4) else this_defslot = false end if defslot == nil then defslot = this_defslot elseif defslot ~= this_defslot then parse_err(("When multiple slot overrides are combined with +, all must be definite or indefinite: '%s'"): format(table.concat(segments))) end local case = usub(part, 1, 3) if case_set[case] then -- ok else parse_err(("Unrecognized case '%s' in override: '%s'"):format(case, table.concat(segments))) end part = usub(part, 4) local slot = defslot and "def_" or "" if part:find("^pl") then part = usub(part, 3) slot = slot .. case .. "_p" else slot = slot .. case .. "_s" end table.insert(slots, slot) if part:find("^%+") then part = usub(part, 2) else break end end segments[1] = part local retval = fetch_slot_override(segments, ("%s slot override"):format(table.concat(slots, "+")), false, defslot, parse_err) return slots, retval end local function parse_adjspec(_base, spec, parse_err) local ret = {} local origspec = spec if spec:find("^:") then ret.lemma = spec:sub(2) elseif spec:find("^/") then local from, to = spec:match("^/([^/]*)/([^/]*)$") if from then ret.subspec = { from = from, to = to } else to = spec:match("^/([^/]*)$") if to then ret.subspec = { to = to } else parse_err(("Syntax error in adjective spec 'adj%s': too many slashes"):format(origspec)) end end elseif spec ~= "" then parse_err(("Syntax error in adjective spec 'adj%s'; should be followed only by a colon + lemma or slash " .. "substitution spec, possibly preceded by ^ to indicate lowercasing"):format(origspec)) end return ret end local function parse_inside(base, inside, is_scraped_noun) local function parse_err(msg) error((is_scraped_noun and "Error processing scraped noun spec: " or "") .. msg .. ": <" .. inside .. ">") end local segments = put.parse_balanced_segment_run(inside, "[", "]") local dot_separated_groups = split_alternating_runs_with_escapes(segments, "%.") local isadj = false for i, dot_separated_group in ipairs(dot_separated_groups) do -- Parse a control spec such as "umut,uUmut[rare]" or "-unuUmut,unuUmut" or "imut". This assumes the control -- spec is contained in `dot_separated_group` (already split on brackets) and the result of parsing should go in -- `base[dest]`. `allowed_specs` is a list of the allowed control specs in this group, such as -- {"umut", "Umut", "uumut", "uUmut", "uUUmut", "u_mut"} or {"con", "-con"}. The result of parsing is a list of -- structures of the form { -- form = "FORM", -- footnotes = nil or {"FOOTNOTE", "FOOTNOTE", ...}, -- }. local function parse_control_spec(dest, allowed_specs) if base[dest] then parse_err(("Can't specify '%s'-type control spec twice; second such spec is '%s'"):format( dest, table.concat(dot_separated_group))) end base[dest] = {} local comma_separated_groups = split_alternating_runs_with_escapes(dot_separated_group, ",") for _, comma_separated_group in ipairs(comma_separated_groups) do local specobj = {} local spec = comma_separated_group[1] if not m_table.contains(allowed_specs, spec) then parse_err(("For '%s'-type control spec, saw unrecognized spec '%s'; valid values are %s"): format(dest, spec, generate_list_of_possibilities_for_err(allowed_specs))) else specobj.form = spec end specobj.footnotes = fetch_footnotes(comma_separated_group, parse_err) table.insert(base[dest], specobj) end end local part = dot_separated_group[1] while true do if i == 1 and not part:find("^adj") and not part:find("^@") and part ~= "builtin" then local comma_separated_groups = split_alternating_runs_with_escapes(dot_separated_group, ",") if #comma_separated_groups > 3 then parse_err(("At most three comma-separated specs are allowed but saw %s"):format( #comma_separated_groups)) end if comma_separated_groups[1][2] then parse_err("Footnotes not allowed on gender indicator") end base.gender = comma_separated_groups[1][1] if not base.gender:find("^[mfn]$") then parse_err(("Unrecognized gender '%s', should be 'm', 'f' or 'n'"):format(base.gender)) end if comma_separated_groups[2] then base.gens = fetch_slot_override(comma_separated_groups[2], "genitive", true, false, parse_err) end if comma_separated_groups[3] then base.pls = fetch_slot_override(comma_separated_groups[3], "nominative plural", true, false, parse_err) end break elseif part == "" then if not dot_separated_group[2] then parse_err("Blank indicator; not allowed without attached footnotes") end base.footnotes = fetch_footnotes(dot_separated_group, parse_err) break elseif part == "addnote" then local spec_and_footnotes = fetch_footnotes(dot_separated_group, parse_err) if #spec_and_footnotes < 2 then parse_err("Spec with 'addnote' should be of the form 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'") end local slot_spec = table.remove(spec_and_footnotes, 1) local slot_spec_inside = rmatch(slot_spec, "^%[(.*)%]$") if not slot_spec_inside then parse_err("Internal error: slot_spec " .. slot_spec .. " should be surrounded with brackets") end local slot_specs = rsplit(slot_spec_inside, ",") -- FIXME: Here, [[Module:it-verb]] called strip_spaces(). Generally we don't do this. Should we? table.insert(base.addnote_specs, { slot_specs = slot_specs, footnotes = spec_and_footnotes }) break elseif ulen(part) > 3 and case_set[usub(part, 1, 3)] or ( ulen(part) > 6 and usub(part, 1, 3) == "def" and case_set[usub(part, 4, 6)]) then local slots, override = parse_override(dot_separated_group, parse_err) for _, slot in ipairs(slots) do if base.overrides[slot] then error(("Two overrides specified for slot '%s'"):format(slot)) else base.overrides[slot] = override end end break end if isadj then if m_is_adjective.parse_for_control_specs(part, parse_control_spec) then break end else if part:find("^[Uu]+_?mut") then parse_control_spec("umut", com.umut_types) break elseif not part:find("^imutval") and part:find("^%-?imut") then parse_control_spec("imut", { "imut", "-imut" }) break elseif part:find("^%-?un[uU]+_?mut") then local unumut_types_and_negated = {} for _, typ in ipairs(com.unumut_types) do table.insert(unumut_types_and_negated, typ) table.insert(unumut_types_and_negated, "-" .. typ) end parse_control_spec("unumut", unumut_types_and_negated) break elseif not part:find("^unimutval") and part:find("^%-?unimut") then parse_control_spec("unimut", { "unimut", "-unimut" }) break elseif part:find("^%-?con") then parse_control_spec("con", { "con", "-con" }) break elseif part:find("^%-?defcon") then parse_control_spec("defcon", { "defcon", "-defcon" }) break elseif not part:find("^já") and part:find("^%-?j") then -- don't trip over .já indicator parse_control_spec("j", { "j", "-j" }) break elseif not part:find("^vstem") and part:find("^%-?v") then parse_control_spec("v", { "v", "-v" }) break end end if #dot_separated_group > 1 then parse_err( ("Footnotes only allowed with slot overrides, negatable indicators and by themselves: '%s'"): format(table.concat(dot_separated_group))) elseif part:find("^adj") then if i > 1 then parse_err("Adjective spec must be the first indicator") end if base.adjspec then parse_err("Can't specify two adjective specs") end isadj = true base.adjspec = parse_adjspec(base, part:sub(4), parse_err) break elseif part:find("^[mfn]$") then if base.gender then parse_err("Can't specify gender twice") end base.gender = part break elseif not isadj and (part:find("^decllemma%s*:") or part:find("^declgender%s*:") or part:find("^declnumber%s*:")) then local field, value = part:match("^(decl[a-z]+)%s*:%s*(.+)$") if not value then parse_err(("Syntax error in decllemma/declgender/declnumber indicator: '%s'"):format(part)) end if base[field] then parse_err(("Can't specify '%s:' twice"):format(field)) end base[field] = value break elseif part:find("^q%s*:") or part:find("header%s*:") then local field, value = part:match("^(q)%s*:%s*(.+)$") if not value then field, value = part:match("^(header)%s*:%s*(.+)$") end if not value then parse_err(("Syntax error in q/header indicator: '%s'"):format(part)) end if base[field] then parse_err(("Can't specify '%s:' twice"):format(field)) end base[field] = value break elseif not isadj and part:find("^@") then -- FIXME: Implement adjective scraping if base.scrape_spec then parse_err("Can't specify scrape directive '@...' twice") end if part:find(":") then base.scrape_is_suffix, base.scrape_spec, base.scrape_id = part:match("^@(%-?)(.-)%s*:%s*(.+)$") else base.scrape_is_suffix, base.scrape_spec = part:match("^@(%-?)(.-)$") end -- If we saw a hyphen, set `scrape_is_suffix` to true, otherwise false base.scrape_is_suffix = base.scrape_is_suffix == "-" if not base.scrape_spec or base.scrape_spec == "" then parse_err(("Syntax error in scrape directive '%s"):format(part)) end local scrape_init, scrape_rest = rmatch(base.scrape_spec, "^(.)(.*)$") local lower_scrape_init = ulower(scrape_init) if ulower(scrape_init) ~= scrape_init then base.scrape_is_uppercase = true base.scrape_spec = lower_scrape_init .. scrape_rest end break elseif part:find(":") then local spec, value = part:match("^([a-z]+)%s*:%s*(.+)$") if not spec then parse_err(("Syntax error in indicator with value, expecting alphabetic slot or stem/lemma " .. "override indicator: '%s'"):format(part)) end local stem_set = isadj and m_is_adjective.overridable_stem_set or overridable_stem_set if not stem_set[spec] then parse_err(("Unrecognized stem override indicator '%s', should be %s"):format( part, generate_list_of_possibilities_for_err( isadj and m_is_adjective.overridable_stems or overridable_stems))) end if base[spec] then if spec == "stem" then parse_err("Can't specify spec for 'stem:' twice (including using 'stem:' along with # or ##)") else parse_err(("Can't specify '%s:' twice"):format(spec)) end end base[spec] = value break elseif part == "#" or part == "##" then if base.stem then parse_err("Can't specify a stem spec ('stem:', # or ##) twice") end base.stem = part break elseif part == "sg" or part == "pl" or part == "both" then if base.number then if base.number ~= part then parse_err("Can't specify '" .. part .. "' along with '" .. base.number .. "'") else parse_err("Can't specify '" .. part .. "' twice") end end base.number = part break elseif part == "indef" or part == "def" or part == "bothdef" then if base.definiteness then if base.definiteness ~= part then parse_err(("Can't specify two conflicting definiteness values; saw '%s' (%s) when existing " .. "definiteness is %s"):format(part, definiteness_code_to_desc[part], definiteness_code_to_desc[base.definiteness])) else parse_err("Can't specify '" .. part .. "' twice") end end base.definiteness = part break elseif not isadj and (part == "weak" or part == "iending" or part == "rstem" or part == "já" or part == "linkasis") or isadj and (m_is_adjective.boolean_property_set[part] or part == "iscomp") or part == "proper" or part == "common" or part == "dem" or part == "builtin" or part == "indecl" or part == "decl?" then if base.props[part] then parse_err("Can't specify '" .. part .. "' twice") end base.props[part] = true break elseif part == "~" then if base.link_lowercase then parse_err("Can't specify '~' twice") end base.link_lowercase = true break elseif isadj and m_table.contains(com.unumut_types, part) then if base.adj_unumut then parse_err("Can't specify two values for reverse u-mutation spec with adjectives") end base.adj_unumut = part break end parse_err("Unrecognized indicator '" .. part .. "'") end end return base end -- Set some defaults (e.g. number and definiteness) now, because they (esp. the number) may be needed -- below when determining how to merge scraped and user-specified properies. local function set_early_base_defaults(base) if is_regular_noun(base) then local function check_err(msg) error(("Lemma '%s': %s"):format(base.lemma, msg)) end if not base.gender then check_err("Internal error: For nouns, gender must be specified") end base.number = base.number or is_proper_noun(base, base.lemma) and "sg" or base.gender == "m" and (base.lemma:find("skapur$") or base.lemma:find("naður$")) and not base.stem and "sg" or "both" base.definiteness = base.definiteness or is_proper_noun(base, base.lemma) and "indef" or "bothdef" process_declnumber(base) base.actual_gender = base.gender if base.declgender then if not base.declgender:find("^[mfn]$") then check_err(("Unrecognized gender '%s' for 'declgender:', should be 'm', 'f' or 'n'"):format( base.declgender)) end base.gender = base.declgender end end end local function parse_inside_and_merge(inside, lemma, scrape_chain) local function parse_err(msg) error(msg .. ": <" .. inside .. ">") end if #scrape_chain >= 10 then local linked_scrape_chain = {} for _, element in ipairs(scrape_chain) do table.insert(linked_scrape_chain, "[[" .. element .. "]]") end parse_err(("Probable infinite loop in scraping; scrape chain is [[%s]] -> %s"):format(lemma, table.concat(linked_scrape_chain, " -> "))) end local base = create_base() base.lemma = lemma base.scrape_chain = scrape_chain parse_inside(base, inside, #scrape_chain > 0) if not base.scrape_spec then -- If we're not scraping the declension from another noun, just return the parsed `base`. -- But don't set early defaults if we're being scraped because it interferes with overriding the number -- and/or definiteness by the noun that is scraping us. if #scrape_chain == 0 then set_early_base_defaults(base) end return base else local retval = com.find_inflection_given_scrape_spec { lemma = lemma, scrape_spec = base.scrape_spec, scrape_is_suffix = base.scrape_is_suffix, scrape_is_uppercase = base.scrape_is_uppercase, infltemp = "is-ndecl", allow_empty_infl = false, inflid = base.scrape_id, parse_off_ending = com.parse_off_final_nom_ending, } local prefix, base_noun, declspec, errmsg = retval.prefix, retval.base_lemma, retval.infl, retval.errmsg if errmsg then base.prefix = prefix base.base_noun = base_noun base.scrape_error = errmsg return base end -- Parse the inside spec from the scraped noun (merging any sub-scraping specs), and copy over the -- user-specified properties on top of it. table.insert(scrape_chain, base_noun) local inner_base = parse_inside_and_merge(declspec.infl, base_noun, scrape_chain) inner_base.lemma = lemma inner_base.prefix = prefix inner_base.base_noun = base_noun -- Add `prefix` to a full variant of the base noun (e.g. a stem spec or full override). We may need -- to adjust the variant to take into account the base noun being a suffix and/or uppercase (e.g. when -- we use [[-dómur]] to generate the inflection of [[vísdómur]] or [[Björn]] to generate the inflection -- of [[Ásbjörn]]). local function add_prefix(form) if base.scrape_is_suffix then form = form:gsub("^%-", "") end if base.scrape_is_uppercase then local first, rest = rmatch(form, "^(.)(.*)$") if first then form = ulower(first) .. rest end end return prefix .. form end -- If there's a prefix, add it now to all the full overrides in the scraped noun, as well as 'decllemma' -- and all stem overrides. if prefix ~= "" then map_all_overrides(inner_base, function(formobj) -- Not if the override contains # or ##, which expand to the full lemma (possibly minus -r -- or -ur). if formobj.form:find("^!") and not formobj.form:find("#") then formobj.form = "!" .. add_prefix(usub(formobj.form, 2)) end end) if inner_base.decllemma then inner_base.decllemma = add_prefix(inner_base.decllemma) end for _, stem in ipairs(overridable_stems) do -- Only actual stems, not (un)imutval; and not if the stem contains # or ##, which -- expand to the full lemma (possibly minus -r or -ur). if inner_base[stem] and stem:find("stem$") and not inner_base[stem]:find("#") then inner_base[stem] = add_prefix(inner_base[stem]) end end end local function copy_properties(plist) -- Copy various properties. for _, prop in ipairs(plist) do if base[prop] ~= nil then inner_base[prop] = base[prop] end end end copy_properties(control_specs) copy_properties(overridable_stems) copy_properties { "gens", "pls", "gender", "number", "definiteness", "decllemma", "declgender", "declnumber", "q", "header", "link_lowercase" } inner_base.footnotes = iut.combine_footnotes(inner_base.footnotes, base.footnotes) -- Copy addnote specs. for _, prop_list in ipairs { "addnote_specs" } do for _, prop in ipairs(base[prop_list]) do m_table.insertIfNot(inner_base[prop_list], prop) end end -- Now copy remaining user-specified specs into the scraped noun `base`. for _, prop_table in ipairs { "overrides", "props" } do for slot, prop in pairs(base[prop_table]) do inner_base[prop_table][slot] = prop end end -- Now determine the defaulted number and definiteness (after copying relevant settings -- but before the check just below that relies on `inner_base.number` being set). set_early_base_defaults(inner_base) -- If user specified 'sg', cancel out any pl overrides, otherwise we'll get an error. if inner_base.number == "sg" then inner_base.pls = nil for slot, _ in pairs(inner_base.overrides) do if slot:find("_p$") then inner_base.overrides[slot] = nil end end end return inner_base end end --[=[ Parse an indicator spec (text consisting of angle brackets and zero or more dot-separated indicators within them). Return value is an object of the form indicated in the comment above create_base(). ]=] local function parse_indicator_spec(angle_bracket_spec, lemma, pagename) if lemma == "" then lemma = pagename end local inside = rmatch(angle_bracket_spec, "^<(.*)>$") assert(inside) local orig_lemma = lemma local orig_lemma_no_links = m_links.remove_links(lemma) lemma = orig_lemma_no_links local base = parse_inside_and_merge(inside, lemma, {}) base.orig_lemma = orig_lemma base.orig_lemma_no_links = orig_lemma_no_links return base end -- Determine if the term has more than one word in it. Normally we just look at the number of words -- at top level. However, it's possible to have a single alternant at top level with multiple words -- in one of the arms, e.g. the equivalent of ((rēspūblica<>,rēs<>pūblica<>)). So if there's only one -- top-level "word" and it's an alternant, check the length of each arm. We also need to check for -- before-text and post-text if there's only one inflected term. local function compute_is_multiword(alternant_multiword_spec) if #alternant_multiword_spec.alternant_or_word_specs > 1 or alternant_multiword_spec.post_text ~= "" then return true end local alternant_or_word_spec = alternant_multiword_spec.alternant_or_word_specs[1] if alternant_or_word_spec.alternants then for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do if #multiword_spec > 1 or multiword_spec.post_text ~= "" or multiword_spec[1] and multiword_spec[1].before_text ~= "" then return true end end end if alternant_or_word_spec.before_text ~= "" then return true end return false end local function set_defaults_and_check_bad_indicators(base) local function check_err(msg) error(("Lemma '%s': %s"):format(base.lemma, msg)) end -- Set default values. local regular_noun = is_regular_noun(base) if not base.adjspec and base.props.builtin then set_builtin_defaults(base) end if not regular_noun and not base.adjspec then for _, control_spec in ipairs(control_specs) do if base[control_spec] then check_err(("'%s' cannot be specified with pronouns"):format(control_spec)) end end end if not regular_noun then if base.declgender then check_err("'declgender' can only be specified with regular nouns") end return end -- Check for bad indicator combinations. if base.imut and base.unimut then check_err("'imut' and 'unimut' specs cannot be specified together") end if base.umut and base.unumut then check_err("'umut' and 'unumut' specs cannot be specified together") end if base.unimut and base.unumut then check_err("'unimut' and 'unumut' specs cannot be specified together") end if base.declnumber == "pl" and (base.gens or base.pls) then check_err("Cannot set genitive or plural specs after the gender in plural-only lemmas") end if base.plvstem and not base.plstem then check_err("When 'plvstem:' given, 'plstem:' must also be given") end -- Compute whether i-mutation stems are needed. -- First check for 'imut' set by user. if not base.need_imut then -- might be set by the detected declension if base.imut then for _, formobj in ipairs(base.imut) do if formobj.form == "imut" then base.need_imut = true break end end end end -- Then check for 'unimut' set by user. if not base.need_imut then if base.unimut then for _, formobj in ipairs(base.unimut) do if formobj.form == "unimut" then base.need_imut = true break end end end end -- Then check all overrides for any beginning with a single ^. if not base.need_imut then map_all_overrides(base, function(formobj) if formobj.form:find("^%^") and not formobj.form:find("^%^%^") then base.need_imut = true return true end end) end if base.imutval and not base.need_imut then check_err("'imutval:...' specified but 'imut' and 'unimut' not specified and no forms need i-mutation") end if base.unimutval and not base.need_imut then check_err("'unimutval:...' specified but 'imut' and 'unimut' not specified and no forms need i-mutation") end end local function set_all_defaults_and_check_bad_indicators(alternant_multiword_spec) -- Used when determining how to link definite-only and plural-only nouns. alternant_multiword_spec.is_multiword = compute_is_multiword(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) base.is_multiword = alternant_multiword_spec.is_multiword set_defaults_and_check_bad_indicators(base) for _, global_prop in ipairs { "q", "header" } do if base[global_prop] then if alternant_multiword_spec[global_prop] == nil then alternant_multiword_spec[global_prop] = base[global_prop] elseif alternant_multiword_spec[global_prop] ~= base[global_prop] then error(("With multiple words or alternants, set '%s' on only one of them or make them all agree"): format(global_prop)) end end end if base.props.builtin then alternant_multiword_spec.saw_builtin = true else alternant_multiword_spec.saw_non_builtin = true end if base.props.indecl then alternant_multiword_spec.saw_indecl = true else alternant_multiword_spec.saw_non_indecl = true end if base.props["decl?"] then alternant_multiword_spec.saw_unknown_decl = true else alternant_multiword_spec.saw_non_unknown_decl = true end end) end local function expand_property_sets(base) base.prop_sets = { {} } -- Construct the prop sets from all combinations of control specs, in case any given spec has more than one -- possibility. for _, control_spec in ipairs(control_specs) do local specvals = base[control_spec] -- Handle unspecified control specs. if not specvals then specvals = { false } end if #specvals == 1 then for _, prop_set in ipairs(base.prop_sets) do -- Convert 'false' back to nil prop_set[control_spec] = specvals[1] or nil end else local new_prop_sets = {} for _, prop_set in ipairs(base.prop_sets) do for _, specval in ipairs(specvals) do local new_prop_set = m_table.shallowCopy(prop_set) new_prop_set[control_spec] = specval table.insert(new_prop_sets, new_prop_set) end end base.prop_sets = new_prop_sets end end end -- Return the most likely ending to add to a stem form (e.g. from the feminine singular or the plural) to -- to get the lemma form (masculine singular). -- We use the following rules: -- 1. Stems in -nn or -ll take -ur. -- 2. Stems in -Vn or -Vl double the last letter, but not if this will result in contraction (the default -- for nouns in -[aiu]nn and -[aiu]ll, but for adjectives only in -inn), in which case -ur is added. -- 3. Stems in -Cn, -Cl, -r or -s remain unchanged. -- 4. Stems in a vowel add -r. -- 5. Remaining stems add -ur. -- Exceptional lemma forms for adjectives will need to be handled through a slash substitution spec or by -- directly specifying the lemma after a colon. local function stem_to_masc_sg_lemma_ending(stem, isadj) if stem:find("nn$") or stem:find("ll$") then return "ur" elseif not isadj and (stem:find("a[nl]$") or stem:find("[^eE]i[nl]$") or stem:find("[^aA]u[nl]$")) or isadj and stem:find("[^eE]in$") then return "ur" elseif stem:find(com.vowel_c .. "[nl]$") then return stem:sub(-1) elseif stem:find("[nlrs]$") then return "" elseif rfind(stem, com.vowel_c .. "$") then return "r" else return "ur" end end -- For a plural-only lemma, synthesize a likely singular lemma. It doesn't have to be theoretically correct as long as -- it generates all the correct plural forms. local function synthesize_singular_lemma(base) local lemma_determined -- Loop over all property sets in case the user specified multiple ones (e.g. using different control specs). If -- we try to reconstruct different lemmas for different property sets, we'll throw an error below. for _, props in ipairs(base.prop_sets) do local function interr(msg) error(("Internal error: For lemma '%s', %s: %s"):format(base.lemma, msg, dump(props))) end -- `ending` refers to the plural ending but is not currently used much. Instead, in add_decl(), when we process -- pl-only terms, we set the nom_pl to "*" so that the lemma is used directly. local stem, lemma, ending, sg_ending, default_unumut if base.gender == "m" or base.gender == "f" then stem, ending = rmatch(base.lemma, "^(.*)([aiu]r)$") if stem then -- masc: -- -- [[tónleikar]] "concert"; [[feðgar]] "father and son"; [[hafrar]] "oats" (dat pl höfrum); -- [[fjármunir]] "goods, property"; [[Fljótsdælir]] "inhabitants of Fljótsdalur (a valley)" -- (occurs definite, needs 'dem', no unimut); [[Ásmegir]] "sons of the Gods" (occurs definite, dat -- pl Ásmögum, gen pl Ásmaga, i.e. needs 'def' and 'unimut'); similarly [[ljóðmegir]]; -- [[buskuleggir]] "?" (has 'j' in dat pl [[buskuleggjum]], gen pl [[buskuleggja]]; [[Bekkir]] -- (place name; has 'j' in dat pl [[Bekkjum]], gen pl [[Bekkja]]) -- -- fem: -- [[frönskur]] "French fries" (with unumut); [[hjólbörur]] "wheelbarrow" (with unumut); [[buxur]] -- "trousers, pants", [[hættur]] "bedtime; quitting time" (with unimut); [[herðar]] "shoulders"; -- [[limar]] "branches"; [[öfgar]] "exaggeration, extreme" (no unumut); [[drefjar]] -- "stains, traces"; [[viðjar]] "chains, fetters"; many others in -jar, but the -j- is throughout -- the plural; [[svalir]] "balcony; porch"; [[dyr]] "doorway" (uses decllemma:dyrir) if ending == "ur" then -- FIXME: Does -ur as masculine plural ending occur? What should the singular be? sg_ending = base.gender == "f" and "a" or nil default_unumut = "unumut" else sg_ending = base.gender == "f" and "" or nil end if not sg_ending then sg_ending = stem_to_masc_sg_lemma_ending(stem) end elseif base.lemma:find("ær$") then -- [[barnatær]], [[fultær]], proper name [[Tær]] stem = base.lemma sg_ending = "" else error(("Masculine or feminine plural-only lemma '%s' should end in -ar, -ir or -ur"):format(base.lemma)) end elseif base.gender == "n" then -- Neuters in -i. Examples: [[fræði]] "branch of knowledge", [[jafndægri]] "equinox", [[meðmæli]] -- "recommendation", [[sannindi]] "truth", [[skæri]] "pair of scissors", [[vísindi]] "knowedge, learning". -- unimut is possible and occurs in [[læti]] "behavior, demeanor", [[ólæti]] "noise, racket". stem, ending = rmatch(base.lemma, "^(.*[^eE])(i)$") if stem then sg_ending = "i" end if not stem then -- Weak neuters in -u like [[gleraugu]] "glasses/spectacles". stem, ending = rmatch(base.lemma, "^(.*[^aA])(u)$") if stem then sg_ending = "a" default_unumut = "unumut" end end if not stem then -- Generally, plural will look like singular, with no ending in the plural (but there will be umut -- if possible). Examples: [[feðgin]] "father and daughter", [[hjón]] "married couple", [[jól]] -- "Christmas", [[lok]] "end"; [[jarðgöng]] "tunnel" needing 'unumut'. stem = base.lemma sg_ending = "" default_unumut = "unumut" end else interr(("unrecognized gender '%s'"):format(base.gender)) end if default_unumut and not props.unumut and not props.umut and not props.unimut then props.unumut = { form = default_unumut, defaulted = true } end if props.unumut and props.unimut then interr("shouldn't see both 'unumut' and 'unimut' set in plural-only lemma") end if props.unumut and props.unumut.form:find("^un") then stem = apply_reverse_u_mutation(stem, props.unumut.form, not props.unumut.defaulted) if props.umut then interr("shouldn't see both 'unumut' and 'umut' set in plural-only lemma") end props.umut = { form = rsub(props.unumut.form, "^un", ""), footnotes = props.unumut.footnotes, defaulted = props.unumut.defaulted } props.unumut = nil end if props.unimut and props.unimut.form:find("^un") then stem = apply_reverse_i_mutation(stem, base.unimutval, "error if unmatchable") if props.imut then interr("shouldn't see both 'unimut' and 'imut' set in plural-only lemma") end props.imut = { form = rsub(props.unimut.form, "^un", ""), footnotes = props.unimut.footnotes } props.unimut = nil end lemma = stem .. sg_ending if lemma_determined and lemma_determined ~= lemma then error(("Attempt to set two different singular lemmas '%s' and '%s'"):format(lemma_determined, lemma)) end lemma_determined = lemma end base.lemma = lemma_determined base.lemma_ending = ending or "" end -- For a nominative definite lemma, synthesize the corresponding indefinite lemma. Note that a plural definite lemma may -- need to be processed twice, first to convert to plural indefinite and then to convert to singular indefinite using -- synthesize_singular_lemma(). local function synthesize_indefinite_lemma(base) local lemma_determined -- Loop over all property sets in case the user specified multiple ones (e.g. using different control specs). If -- we try to reconstruct different lemmas for different property sets, we'll throw an error below. for _, props in ipairs(base.prop_sets) do local function interr(msg) error(("Internal error: For lemma '%s', %s: %s"):format(base.lemma, msg, dump(props))) end -- There are only 6 clitic articles, depending on the combination of gender and number: -- singular: m = -inn, f = -in, n = -ið; plural: m = -nir, f = -nar, n = -in. The two beginning in n- aren't -- problematic because in all cases they simply append to the actual form. The remaining four, however, drop -- the i- before an ending [aiu]. This means we can uniquely reconstruct the dropped vowel if we see e.g. -- -að or -uð in place of -ið. But if we see -ið, we don't know whether the lemma ended in -i or a consonant. -- And in general it's important to know because it affects some forms; e.g. compare definite neuter 'knippið' -- from [[knippi]] "bundle, bunch" with 'klappið' from [[klapp]] "applause; pat, stroke". The former has -- definite genitive 'knippisins' and the latter 'klappsins'. And in fact, all three genders commonly have -- both consonant-ending and i-ending nouns in the singular. This means we need an indicator to distinguish -- them. Probably easiest is 'iending'; reusing 'weak' won't work so well because neuters in -i, and sometimes -- feminines in -i, are considered strong. local function process_n_clitic(clitic) local lemma = base.lemma:match("^(.*)" .. clitic .. "$") if not lemma then error(("Lemma '%s' declared as %s %s should end in clitic '-%s'"):format(base.lemma, gender_code_to_desc[base.gender] or "NONE", number_code_to_desc[base.number] or "NONE", clitic)) end return lemma end local function process_i_clitic(clitic) local clitic_cons_end = clitic:match("^i(.*)$") if not clitic_cons_end then interr(("clitic '%s' should begin with 'i'"):format(clitic)) end local lemma_begin, ending = base.lemma:match("^(.*)([aiu])" .. clitic_cons_end .. "$") if not lemma_begin then error(("Lemma '%s' declared as %s %s should end in clitic '-%s' or in '-a%s' or '-u%s'"):format( base.lemma, gender_code_to_desc[base.gender] or "NONE", number_code_to_desc[base.number] or "NONE", clitic, clitic_cons_end, clitic_cons_end)) end if ending == "a" or ending == "u" then if base.props.iending then error(("Property 'iending' cannot be specified because definite lemma '%s' does not end in '-%s'"): format(base.lemma, clitic)) end return lemma_begin .. ending end if base.props.iending then return lemma_begin .. "i" else return lemma_begin end end local clitic = clitic_articles[base.gender]["nom_" .. (base.number == "pl" and "p" or "s")] local lemma if clitic:find("^n") then lemma = process_n_clitic(clitic) else lemma = process_i_clitic(clitic) end if lemma_determined and lemma_determined ~= lemma then error(("Attempt to set two different indefinite lemmas '%s' and '%s'"):format(lemma_determined, lemma)) end lemma_determined = lemma end base.lemma = lemma_determined base.lemma_ending = "" end -- For an adjectival lemma, synthesize the masc singular form. local function synthesize_adj_lemma(base) if base.props.indecl then base.decl = "indecl" return elseif base.props["decl?"] then base.decl = "decl?" return else base.decl = "adj" local adjspec = base.adjspec if not adjspec then error("Internal error: synthesize_adj_lemma() called without a parsed adjective spec in `base.adjspec`") end if adjspec.lemma then base.lemma = adjspec.lemma elseif adjspec.subspec then local from, to = adjspec.subspec.from, adjspec.subspec.to if from then local beginpart = base.lemma:match("^(.*)" .. m_string_utilities.pattern_escape(from) .. "$") if not beginpart then error(("Adjective slash substitution spec '/%s/%s' didn't match form '%s'"):format( from, to, base.lemma)) end base.lemma = beginpart .. to else local num_to_remove if base.number == "pl" then num_to_remove = (base.gender == "m" or base.gender == "f") and 2 or 0 elseif base.gender == "m" then error(("Single-part adjective slash substitution spec '/%s' not allowed with masculine-singular " .. "adjective form '%s'; if necessary, use a two-part spec or specify the lemma directly after " .. " a colon"):format(from, base.lemma)) else num_to_remove = base.gender == "f" and 0 or 1 end base.lemma = usub(base.lemma, 1, -num_to_remove - 1) .. to end else local stem, stem_is_lemma if base.props.iscomp then base.adj_is_weak = true if base.number ~= "pl" and base.gender == "n" then stem = base.lemma:match("^(.*)a$") if not stem then error(("Neuter singular weak comparative adjective form should end in -a: %s" ):format(base.lemma)) end stem = stem .. "i" else if not base.lemma:find("i$") then error(("Plural or masculine/feminine singular weak comparative adjective form should " .. "end in -i: %s"):format(base.lemma)) end stem = base.lemma end stem_is_lemma = true elseif base.number == "pl" then stem = base.lemma:match("^(.*[^Aa])u$") if stem then base.adj_is_weak = true end if not stem then if base.gender == "m" then stem = base.lemma:match("^(.*)ir$") if not stem then error(("Masculine plural strong adjective form should end in -ir: %s"):format(base.lemma)) end elseif base.gender == "f" then stem = base.lemma:match("^(.*)ar$") if not stem then error(("Feminine plural strong adjective form should end in -ar: %s"):format(base.lemma)) end else stem = base.lemma end end else if base.gender == "m" then stem = base.lemma:match("^(.*[^Ee])i$") if stem then base.adj_is_weak = true else -- Otherwise the form is strong and should remain as is. stem = base.lemma stem_is_lemma = true end elseif base.gender == "f" or base.gender == "n" then stem = base.lemma:match("^(.*)a$") if stem then base.adj_is_weak = true end if not stem then if base.gender == "n" then error(("No automatic rules for inferring the adjective lemma from strong neuter form " .. "'%s'; you must use a slash substitution spec such as 'tvöfalt<adj/dur>' (which " .. "chops off the last letter and replaces it with 'dur') or 'ryðfrítt<adj/tt/r>' " .. "(which chops off 'tt' and replaces it with 'r'), or directly specify the lemma " .. "using e.g. 'tvö<adj:tveir>'" ):format(base.lemma)) else stem = base.lemma end end end end if not stem_is_lemma then if base.adj_unumut then stem = apply_reverse_u_mutation(stem, base.adj_unumut, "error if unmatchable") end base.lemma = stem .. stem_to_masc_sg_lemma_ending(stem) else base.lemma = stem end end end end -- Determine the declension and stem based on the lemma and gender. The declension is set in base.decl and the stem in -- base.stem if not already set by the user. local function determine_declension(base) local stem = nil local ending local default_props = {} -- Determine declension if base.props.indecl then base.decl = "indecl" stem = base.lemma elseif base.props["decl?"] then base.decl = "decl?" stem = base.lemma elseif base.gender == "m" then if not stem then stem, ending = rmatch(base.lemma, "^(.*[ÁáÆæ])(r)$") if stem then -- in -ár: -- [[nár]] "corpse", [[sár]] "tub (archaic)", [[hár]] "thole, oarlock (archaic)", [[hár]] -- "spiny dogfish (archaic)" (with v-infix), [[kljár]] "weaving stone (archaic)", [[ljár]] "scythe", -- [[skjár]] "video screen, display", [[már]] "seagull", [[sjár]] "sea", [[snjár]] "snow" (with -- v-infix); vs. stems ending in -r: [[ár]] "? (archaic)", [[lár]] "wooden box for wool", [[klár]] -- "inferior horse, nag", [[pílár]] "slat, fence post; spoke (dated)", [[kentár]] "centaur" -- -- in -ær: -- [[glær]] "sea", [[skær]] "? (obsolete)", [[blær]] "gentle breeze", [[bær]] "farm; town", [[óbær]] -- "?", [[sær]] "sea", [[snær]] "snow" -- -- We used to also drop -r by default from the stem in -ýr words, but this doesn't make sense for -- adjectives and only half makes sense for nouns, so we don't do it any more. We have stems without -r: -- [[ýr]] "yew", [[býr]] "town, farm", [[gnýr]] "clash, rumble; blue wildebeest", [[týr]] "hero; god", -- also many proper names; vs. stems ending in -r: [[fýr]] "dude, guy", [[lýr]] "pollock", [[sýr]] -- "? (poetic)", [[ýr]] "? (obsolete)", [[hlýr]] "? (obsolete)", [[glýr]] "? (obsolete)" base.decl = "m" end end if not stem then stem = rmatch(base.lemma, "^(.*[Aa]ur)$") if stem then -- [[maur]] "ant", [[aur]] "loam, mud", [[gaur]] "ruffian", [[paur]] "devil; enmity", -- [[saur]] "dirt; excrement", [[staur]] "post", [[ljósastaur]] "lamp post" base.decl = "m" end end if not stem then -- There must be at least one vowel; lemmas like [[bur]] don't count. stem, ending = rmatch(base.lemma, "^(.*" .. com.vowel_or_hyphen_c .. ".*)(ur)$") if stem then if stem:find("skap$") and not base.stem then -- tons of words in -skapur base.decl = "m-skapur" elseif stem:find("nað$") and not base.stem then -- lots of words in -naður base.decl = "m-naður" default_props.umut = "uUmut" else if base.stem == base.lemma then -- [[akur]] "field" etc. where the stem includes the final -r stem = base.stem ending = "" -- not actually used default_props.con = "con" end -- [[hestur]] "horse" and lots of others base.decl = "m" end end end if not stem then stem = rmatch(base.lemma, "^(.*[Ee][iy]r)$") if stem then -- in -eir (all include -r in the stem): -- [[geir]] "?", [[eir]] "copper", [[leir]] "clay", [[Geir]] (male given name) -- -- in -eyr, including -r in the stem: -- [[reyr]] "reed", [[Reyr]] (male given name) -- in -eyr, not including -r in the stem: -- [[þeyr]] "thaw, thawing wind", [[Þeyr]] (male given name), [[Freyr]] (male given name) base.decl = "m" end end if not stem then -- There must be at least one vowel (although there don't appear to be any single-syllable -- lemmas ending in -ir other than in -eir). stem, ending = rmatch(base.lemma, "^(.*" .. com.vowel_or_hyphen_c .. ".*)(ir)$") if stem then -- [[læknir]] "physician" and many others -- [[bróðir]], [[faðir]] are r-stems if base.props.rstem then base.decl = "m-rstem" base.need_imut = true else base.decl = "m-ir" end end end if not stem then stem, ending = rmatch(base.lemma, "^(.*l)(l)$") if stem then if is_proper_noun(base, stem) and stem:find("kel$") then base.decl = "m-kell" else if not base.stem and (rfind(stem, com.cons_c .. "[aiu]l$") or stem:find("^[aiuAIU]l$")) then -- [[gaffall]] "fork" (dat pl [[göfflum]]), [[þumall]] "thumb"; [[ekkill]] "widower"; -- [[spegill]] "mirror"; [[segull]] "magnet"; [[öxull]] "axis; axle"; etc. Note that the check -- for a consonant preceding the a/i/u is important as there are words like [[manúall]] -- "manual", [[ritúall]] "ritual", [[kokteill]] "cocktail", [[feill]] "flaw, error", [[deill]] -- "dispute???" (rare, regional), [[haull]] "hernia", [[straull]] "? (rare, regional)" that -- don't have contraction. Beware of the rare word [[síill]] "sieve? strainer?" that per BÍN -- does contract to síl- before vowels. Currently the code to handle contraction will throw an -- error if you attempt to contract that word, but you can use 'vstem:...'. -- -- There are also lots of words in a vowel other than a/i/u followed by -ll, such as [[bíll]] -- "car", [[áll]] "eel", [[konsúll]] "consul", [[þræll]] "slave", [[hvoll]] "hill", [[stóll]] -- "chair", etc. In these, the final -l is the nominative singular ending, as above. -- -- Note that if the user overrode the stem (e.g. using '#' as with [[Ármann]]), we don't -- default to contraction as it may cause an error to be thrown. default_props.con = "con" end base.decl = "m" end end end if not stem then stem, ending = rmatch(base.lemma, "^(.*n)(n)$") if stem then if not base.stem and (rfind(stem, com.cons_c .. "[aiu]n$") or stem:find("^[aiuAIU]n$")) then -- As with -all/-ill/-ull although there are fewer such words in -nn. Examples: [[aftann]] "evening" -- (dat pl öftnum), [[arinn]] "hearth, fireplace" (dat pl örnum), [[drottinn]] "lord", [[himinn]] -- "sky, heaven", [[morgunn]] "morning", [[jötunn]] "giant", etc. -- -- There are also lots of words in a vowel other than a/i/u followed by -nn, such as [[fleinn]] -- "spear", [[steinn]] "rock", [[prjónn]] "knitting needle", [[daunn]] "stink", [[húnn]] "knob". -- In these, the final -n is the nominative singular ending, as above. -- -- Note that if the user overrode the stem (e.g. using '#' as with [[Ármann]]), we don't default -- to contraction as it may cause an error to be thrown. default_props.con = "con" end base.decl = "m" end end if not stem and not base.props.weak then stem, ending = rmatch(base.lemma, "^(.*[aóæ]nd)(i)$") if stem then -- [[nemandi]] "student" and many others; terms in -jandi like [[byrjandi]] -- "beginner", [[seljandi]] "seller" umlaut to -jend- in the plural instead of -ind- -- also terms in -óndi (probably all compounds of [[bóndi]] "farmer") and in -ændi -- (probably all compounds of [[frændi]]). Terms like [[andi]] "breath, spirit" and -- [[heiðasandi]] "heath sand?" need '.weak' to disable this, as does [[fjandi]] in -- the meaning "devil, demon" (vs. "enemy", which has plural [[fjendur]]). Terms like -- [[vandi]] "trouble; responsibility; custom, habit" and compounds are singular-only. base.decl = "m-ndi" if not stem:find("ænd$") then base.need_imut = true end if stem:find("jand$") then default_props.imutval = "je" end end end if not stem then stem, ending = rmatch(base.lemma, "^(.*)([ia])$") if stem then -- [[tími]] "time, hour" and many others; [[herra]] "gentleman" ([[sendiherra]] "ambassador"), -- [[séra]]/[[síra]] "reverend" base.decl = "m-weak" -- Recognize -ingi and make automatically j-infixing, but only when a vowel precedes -- (not [[ingi]], [[Ingi]], [[stingi]], [[þvingi]]). Use `-j` to turn this off. if ending == "i" and rfind(stem, com.vowel_or_hyphen_c .. ".*ing$") then default_props.j = "j" elseif ending == "i" and rfind(stem, com.vowel_or_hyphen_c .. ".*ar$") then default_props.umut = "uUmut" end end end if not stem then stem = rmatch(base.lemma, "^(.*ó)$") if stem then -- [[kanó]] "canoe", [[pesó]] "peso", [[Plútó]] "Pluto", [[Markó]] (male given name), etc. base.decl = "m-ó" end end if not stem then -- Miscellaneous masculine terms without ending stem = base.lemma base.decl = "m" end elseif base.gender == "f" then if not stem then stem, ending = rmatch(base.lemma, "^(.*)(a)$") if stem then base.decl = "f-weak" end end if not stem then stem, ending = rmatch(base.lemma, "^(.*[^eE])(i)$") if stem then base.decl = "f-i" end end if not stem and not base.stem then -- Don't match when base.stem is set, e.g. [[gimbur]] "female lamb", where the -ur is part of the stem stem, ending = rmatch(base.lemma, "^(.*[^aA])(ur)$") if stem and rfind(stem, com.vowel_or_hyphen_c) then if is_proper_noun(base, stem) then -- [[Auður]], [[Heiður]], [[Ingveldur]], [[Móeiður]], [[Þórelfur]], [[-frídur]] ([[Gunnfríður]], -- [[Hólmfríður]], [[Málfríður]], [[Sigfríður]]), [[Gerður]] ([[Hallgerður]], [[Ingigerður]], -- [[Þorgerður]]), [[Gunnur]] ([[Arngunnur]], [[Hildigunnur]]), [[Heiður]] ([[Aðalheiður]], -- [[Arnheiður]], [[Brynheiður]], [[Ragnheiður]]), [[Hildur]] ([[Ásthildur]], [[Berghildur]], -- [[Brynhildur]], [[Geirhildur]], [[Gunnhildur]], [[Ragnhildur]], [[Þórhildur]]), [[Ástríður]] -- (related names [[Guðríður]], [[Sigríður]], [[Þuríður]]), [[Þrúður]] [also a man's name] -- ([[Jarþrúður]], [[Jarðþrúður]], [[Sigþrúður]]) -- -- also with company/organization names like [[Berghildur]], [[Gunnhildur]]; likewise place names -- like [[Þuríður]] base.decl = "f-acc-dat-i" else base.decl = "f-ur" end end end if not stem and base.props.rstem then stem, ending = rmatch(base.lemma, "^(.*[^eE])(ir)$") if stem and base.props.rstem then -- [[dóttir]], [[móðir]], [[systir]] base.decl = "f-rstem" if not stem:find("syst$") then base.need_imut = true end end end if not stem then stem = rmatch(base.lemma, "^(.*ung)$") if stem then base.decl = "f-ung" end end if not stem then stem = rmatch(base.lemma, "^(.*ing)$") if stem then base.decl = "f-ing" end end if not stem then stem = rmatch(base.lemma, "^(.*[áóúÁÓÚ])$") if stem then base.decl = "f-long-vowel" if rfind(stem, "[óÓ]$") then base.need_imut = true end end end if not stem and not base.stem then -- Not when base.stem is set, which includes [[Ýr]], following the regular endingless f declension where -- -r is part of the stem. stem, ending = rmatch(base.lemma, "^(.*[ýÝæÆ])(r)$") if stem then -- [[kýr]] "cow", [[sýr]] "sow (archaic)", [[ær]] "ewe" and compounds base.decl = "f-long-umlaut-vowel-r" default_props.unimut = "unimut" end end if not stem then stem = rmatch(base.lemma, "^(.*[^aA]un)$") if stem and rfind(stem, com.vowel_or_hyphen_c) then -- [[pöntun]] "order (in commerce)"; [[verslun]] "trade, business; store, shop"; [[efun]] "doubt"; -- [[bötun]] "improvement"; [[örvun]] "encouragement; stimulation" (pl. örvanir); etc. -- Exclude words in -aun like [[baun]] "bean", [[laun]] "secret", [[raun]] "experience". -- Some words need a different indicator, e.g. [[örvun]] "encouragement; stimulation" (pl. örvanir), -- [[fjölgun]] "increase, proliferation" (pl. fjölganir), which need "unUmut". base.decl = "f" default_props.unumut = "unuUmut" end end if not stem then -- Miscellaneous feminine terms without ending stem = base.lemma base.decl = "f" -- A function here means we resolve it to its actual value later. We don't want to trigger -- unumut if the user specified v-infix or any type of u-mutation (e.g. 'uUmut' in [[ætlan]]), -- or if the last vowel of the term is 'a' ([[dragt]], [[aukavakt]]). default_props.unumut = function(base, props) if base.vstem or props.v and props.v.form == "v" or props.umut or rfind(stem, "[Aa]" .. com.cons_c .. "*$") then return nil else return { form = "unumut", defaulted = true } end end end elseif base.gender == "n" then if not stem then stem, ending = rmatch(base.lemma, "^(.*)(a)$") if stem then base.decl = "n-weak" end end if not stem then -- stem actually includes -é but due to the change to já we include it in the ending stem, ending = rmatch(base.lemma, "^(.*)(é)$") if stem then if base.props["já"] then -- Indicator 'já' for [[tré]], [[hné]]/[[kné]], etc. base.decl = "n-já" else -- [[té]] (letter T), etc. stem = stem .. "é" base.decl = "n" end end end if not stem then stem, ending = rmatch(base.lemma, "^(.*[kKgG])(i)$") if stem then base.decl = "n-i" default_props.j = "j" end end if not stem then stem, ending = rmatch(base.lemma, "^(.*[^eE])(i)$") if stem then base.decl = "n-i" end end if not stem then -- -ur preceded by a consonant and at least one vowel. stem = rmatch(base.lemma, "^(.*" .. com.vowel_or_hyphen_c .. ".*" .. com.cons_c .. "ur)$") if stem then base.decl = "n" default_props.con = "con" default_props.defcon = "defcon" end end if not stem then -- Miscellaneous neuter terms without ending stem = base.lemma base.decl = "n" end else error(("Internal error: `base.gender` is '%s' but should be 'm', 'f' or 'n'"):dump(base.gender)) end if base.stem then -- This isn't necessarily accurate but doesn't really matter. We only record the lemma ending to help with -- contraction of definite clitics in the nominative singular, and in the cases where the user gives an explicit -- stem, it's usually with # (meaning the ending is null) or ## (meaning the ending ends in -r), and in both -- cases there's no contraction of initial vowels in definite clitics in any case. base.lemma_ending = "" else base.stem = stem base.lemma_ending = ending or "" end for k, v in pairs(default_props) do if not base[k] then if control_spec_set[k] then for _, props in ipairs(base.prop_sets) do if type(v) == "function" then props[k] = v(base, props) else props[k] = { form = v, defaulted = true } end end else base[k] = v end end end track("decl/" .. base.decl) end local function determine_default_masc_dat_sg(base, props) -- We only need to compute the default dative singular for regular masculines (not masculines in -ir, -ó, -i, etc.). -- These other types have specific defaults for the entire type. if base.decl ~= "m" or base.number == "pl" then return end local default_dat_sg if base.overrides.dat_s then -- Track explicit override. track("masc-dat-sg-override") end local stem = base.stem if props.j and props.j.form == "j" then -- Stems with j-infix normally have null dative even if they end in two consonants, e.g. -- [[belgur]] "bellows; skin", [[fengur]] "profit", [[flekkur]] "spot, fleck", [[serkur]] -- "shirt", [[stingur]] "sting" default_dat_sg = "" elseif stem:find(com.vowel_or_hyphen_c .. ".*[iu]ng$") then -- Stems in suffix -ing or -ung normally have indef dat -i, def dat null default_dat_sg = { indef = "i", def = "" } elseif stem:find("x$") or (rfind(stem, com.cons_c .. com.cons_c .. "$") and not stem:find("kk$") and not stem:find("pp$")) then -- Other stems in two consonants normally have dat -i, but those in -kk or -pp normally -- don't, so exclude them and require explicit specification default_dat_sg = "i" elseif not rfind(stem, com.vowel_c .. "$") and is_proper_noun(base, stem) then -- proper noun whose stem does not end in a vowel default_dat_sg = "i" elseif props.con and props.con.form == "con" then default_dat_sg = "i" elseif rfind(stem, com.vowel_c .. "r?$") then default_dat_sg = "" elseif base.lemma:find("ll$") then -- nouns in -ll without contraction, which generally includes those not in -all/-ill/-ull plus a few in these -- endings such as [[panill]] "paneling" (rare variant of [[panell]]), [[kórall]] "coral", [[kristall]] -- "crystal", [[kanill]] "cinnamon" (also [[kanell]]); only a few exceptions, such as [[rafall]] "generator", -- which optionally contracts and has with dati/-:i without contraction; [[hvoll]] "hill", [[kokkáll]] -- "cuckold", [[páll]] "spade, pointed shovel", [[þræll]] "slave" with dat-:i/-; [[hóll]] "hill", [[hæll]] -- "heel", [[stóll]] "chair", which are dat-:i[footnote]/- with a footnote variously indicating that the -- dative in -i occurs only in fixed expressions, compounds, place names, etc. default_dat_sg = "" elseif base.lemma:find("nn$") then -- nouns in -nn without contraction, which generally includes those not in -ann/-inn/-unn; there are fewer of -- these than the corresponding nouns in -ll and they have default dative i/i; only exceptions I can find are -- [[húnn]] "knob", [[tónn]] "tone (music)", [[dúnn]] "down (feathers)"", which have dati:-/i. default_dat_sg = "i" elseif base.overrides.def_dat_s and base.definiteness == "def" then -- OK; user supplied def_dat_s override for a definite-only lemma elseif base.overrides.dat_s and base.overrides.dat_s.indef and base.definiteness == "indef" then -- OK; user supplied dat_s override with indefinite setting, for an indefinite-only lemma elseif base.overrides.dat_s and base.overrides.dat_s.indef and base.overrides.def_dat_s then -- OK; user supplied dat_s override with indefinite setting and def_dat_s override, which -- together provide both indefinite and definite values elseif base.overrides.dat_s and not base.overrides.dat_s.def then error(("Saw masculine stem '%s' and dative singular override of just the indefinite ending, but " .. "requires both the indefinite and definite endings of the dative singular in the form 'datINDEF/DEF'"): format(stem)) elseif not base.overrides.dat_s then local exceptions = "exceptions are nouns in -ir, -ó or -i; proper nouns; plural-only nouns; nouns with " .. "stem contraction or j-infix; nouns whose stem ends in two or more consonants, except for -kk and " .. "-pp; and nouns whose stem ends in a vowel or vowel + r" if base.definiteness == "indef" then error(("Saw masculine stem '%s' and no dative override: Most indefinite-only masculine nouns must " .. "explicitly specify the indefinite ending of the dative singular using an override of the form " .. "'datINDEF'; %s"):format(stem, exceptions)) else error(("Saw masculine stem '%s' and no dative override: Most masculine nouns must explicitly specify " .. "the indefinite and definite endings of the dative singular using an override of the form " .. "'datINDEF/DEF'; %s"):format(stem, exceptions)) end end props.default_dat_sg = default_dat_sg end -- Determine the stems and other properties to use for each property set. The list of such properties is given in the -- comment above create_base(), along with the explanation of what a property set is and why we have multiple such -- property sets (generally, one per combination of control specs such as 'con,-con' and 'umut,uUmut'). There are -- currently 9 singular stems and a corresponding 9 plural stems. local function determine_props(base) -- Now determine all the props for each prop set. for _, props in ipairs(base.prop_sets) do -- Determine the default dative singular for masculine nouns using declension "m". determine_default_masc_dat_sg(base, props) -- Almost all nouns have dative plural -um, which triggers u-mutation, so we need to compute the u-mutation -- stem using "umut" if not specifically given. Set `defaulted` so an error isn't triggered if there's no -- special u-mutated form. local props_umut = props.umut if not props_umut and (not props.unumut or props.unumut.form:find("^%-")) then props_umut = { form = "umut", defaulted = true } end -- First do all the stems, handling overall and plural-specific stems separately. for _, prefix in ipairs { "", "pl_" } do local base_stem, base_vstem if prefix == "" then base_stem = base.stem base_vstem = base.vstem else base_stem = base.plstem base_vstem = base.plvstem end -- The plstem is almost never set, so don't do a lot of unnecessary computation. if prefix == "pl_" and not base_stem then break end local stem, nonvstem, umut_nonvstem, imut_nonvstem, vstem, umut_vstem, imut_vstem, null_defvstem, umut_null_defvstem if props.unumut and not props.unumut.form:find("^%-") then umut_nonvstem = base_stem nonvstem = apply_reverse_u_mutation(umut_nonvstem, props.unumut.form, not props.unumut.defaulted) stem = nonvstem if base.need_imut then imut_nonvstem = apply_i_mutation(nonvstem, base.imutval) end if base_vstem then error(("Don't currently know how to combine '%svstem:' with 'unumut' specs"):format( prefix == "pl_" and "pl" or "")) end if props.con and props.con.form == "con" then umut_vstem = com.apply_contraction(base_stem) else umut_vstem = base_stem end vstem = apply_reverse_u_mutation(umut_vstem, props.unumut.form, not props.unumut.defaulted) if base.need_imut then imut_vstem = apply_i_mutation(vstem, base.imutval) end local props_unumut_form = props.unumut.form if props.defcon and props.defcon.form == "defcon" then umut_null_defvstem = com.apply_contraction(base_stem) else umut_null_defvstem = base_stem end null_defvstem = apply_reverse_u_mutation(umut_null_defvstem, props_unumut_form, not props.unumut.defaulted) elseif props.unimut and not props.unimut.form:find("^%-") then imut_nonvstem = base_stem local has_contraction = props.con and props.con.form == "con" nonvstem = apply_reverse_i_mutation(imut_nonvstem, base.unimutval, not has_contraction) stem = nonvstem if props_umut then umut_nonvstem = apply_u_mutation(nonvstem, props_umut.form, not props_umut.defaulted) end if base_vstem then error(("Don't currently know how to combine '%svstem:' with 'unimut' specs"):format( prefix == "pl_" and "pl" or "")) end if has_contraction then imut_vstem = com.apply_contraction(base_stem) else imut_vstem = base_stem end vstem = apply_reverse_i_mutation(imut_vstem, base.unimutval, "error if unmatchable") if props_umut then umut_vstem = apply_u_mutation(vstem, props_umut.form, not props_umut.defaulted) end if props.defcon and props.defcon.form == "defcon" then error("Don't currently know how to combine 'defcon' with 'unimut' specs") end base.need_imut = true elseif props_umut then stem = base_stem nonvstem = stem umut_nonvstem = apply_u_mutation(nonvstem, props_umut.form, not props_umut.defaulted) if base.need_imut then imut_nonvstem = apply_i_mutation(nonvstem, base.imutval) end vstem = base_vstem or base_stem if props.con and props.con.form == "con" then vstem = com.apply_contraction(vstem) end umut_vstem = apply_u_mutation(vstem, props_umut.form, not props_umut.defaulted) if base.need_imut then imut_vstem = apply_i_mutation(vstem, base.imutval) end if props.defcon and props.defcon.form == "defcon" then null_defvstem = com.apply_contraction(base_stem) else null_defvstem = base_stem end umut_null_defvstem = apply_u_mutation(null_defvstem, props_umut.form, not props_umut.defaulted) else -- Normally u-mutated forms should always be available, unless 'unumut' is in effect. error(("Internal error: Neither 'unumut' or 'umut' specified: %s"):format(dump(props))) end props[prefix .. "stem"] = stem if nonvstem ~= stem then props[prefix .. "nonvstem"] = nonvstem end if umut_nonvstem ~= nonvstem then -- For 'con' and 'defcon' below, footnotes can be placed on -con or -defcon so we have to check for -- those footnotes as well as checking for the vstem and such being different, so the -con and -defcon -- footnotes are still active. However, there's no such thing as -umut, and any time that there's an -- explicit umut variant given, umut_nonvstem will be different from nonvstem (otherwise an error will -- occur in apply_u_mutation), so we don't need this extra check here. if props_umut then umut_nonvstem = iut.combine_form_and_footnotes(umut_nonvstem, props_umut.footnotes) end props[prefix .. "umut_nonvstem"] = umut_nonvstem end if base.need_imut then -- imut footnotes handled specially below props[prefix .. "imut_nonvstem"] = imut_nonvstem end if vstem ~= stem or props.con and props.con.footnotes then -- See comment above for why we need to check for props.con.footnotes (basically, to handle footnotes on -- -con). if props.con then vstem = iut.combine_form_and_footnotes(vstem, props.con.footnotes) end props[prefix .. "vstem"] = vstem end if umut_vstem ~= vstem or props.con and props.con.footnotes then -- See comment above under `umut_nonvstem ~= nonvstem`. There's no -umut so whenever there's a specific -- umut variant with footnote, umut_vstem will be different from vstem so we don't need to check for -- `or props_umut and props_umut.footnotes` above. local footnotes = iut.combine_footnotes(props.con and props.con.footnotes or nil, props_umut and props_umut.footnotes or nil) umut_vstem = iut.combine_form_and_footnotes(umut_vstem, footnotes) props[prefix .. "umut_vstem"] = umut_vstem end if base.need_imut then -- imut footnotes handled specially below props[prefix .. "imut_vstem"] = imut_vstem end if null_defvstem ~= nonvstem or props.defcon and props.defcon.footnotes then -- See comment above for why we need to check for props.defcon.footnotes (basically, to handle footnotes -- on -defcon). if props.defcon then null_defvstem = iut.combine_form_and_footnotes(null_defvstem, props.defcon.footnotes) end props[prefix .. "null_defvstem"] = null_defvstem end if umut_null_defvstem ~= null_defvstem or props.defcon and props.defcon.footnotes then -- Analogous situation to the clause above that checks for `umut_vstem ~= vstem`. local footnotes = iut.combine_footnotes(props.defcon and props.defcon.footnotes or nil, props_umut and props_umut.footnotes or nil) umut_null_defvstem = iut.combine_form_and_footnotes(umut_null_defvstem, footnotes) props[prefix .. "umut_null_defvstem"] = umut_null_defvstem end end -- Do the j-infix, v-infix, imut, unimut and unumut properties. if props.j then props.jinfix = props.j.form == "j" and "j" or "" props.jinfix_footnotes = props.j.footnotes props.j = nil end if props.v then props.vinfix = props.v.form == "v" and "v" or "" props.vinfix_footnotes = props.v.footnotes props.v = nil end if props.imut then props.imut_footnotes = props.imut.footnotes props.imut = props.imut.form == "imut" and true or false end if props.unimut then props.unimut_footnotes = props.unimut.footnotes props.unimut = props.unimut.form == "unimut" and true or false end if props.unumut then props.unumut_footnotes = props.unumut.footnotes props.unumut = props.unumut.form end end end local function detect_indicator_spec(base) base.prop_sets = { {} } if base.adjspec then process_declnumber(base) synthesize_adj_lemma(base) elseif base.props.builtin then determine_builtin_props(base) else -- Replace # and ## in all overridable stems as well as all overrides. for _, stemkey in ipairs(overridable_stems) do base[stemkey] = com.replace_hashvals(base[stemkey], base.lemma) end map_all_overrides(base, function(formobj) formobj.form = com.replace_hashvals(formobj.form, base.lemma) end) expand_property_sets(base) if base.definiteness == "def" then synthesize_indefinite_lemma(base) end if base.number == "pl" then synthesize_singular_lemma(base) end determine_declension(base) determine_props(base) end end local function detect_all_indicator_specs(alternant_multiword_spec) -- Keep track of all genders seen in the singular and plural so we can determine whether to add the term to -- [[:Category:Icelandic nouns that change gender in the plural]]. FIXME: Is this needed for Icelandic? It's copied -- from Czech. alternant_multiword_spec.sg_genders = {} alternant_multiword_spec.pl_genders = {} iut.map_word_specs(alternant_multiword_spec, function(base) detect_indicator_spec(base) if base.number ~= "pl" then alternant_multiword_spec.sg_genders[base.actual_gender] = true end if base.number ~= "sg" then alternant_multiword_spec.pl_genders[base.actual_gender] = true end end) end local propagate_multiword_properties local function propagate_alternant_properties(alternant_spec, property, mixed_value, nouns_only) local seen_property for _, multiword_spec in ipairs(alternant_spec.alternants) do propagate_multiword_properties(multiword_spec, property, mixed_value, nouns_only) if seen_property == nil then seen_property = multiword_spec[property] elseif multiword_spec[property] and seen_property ~= multiword_spec[property] then seen_property = mixed_value end end alternant_spec[property] = seen_property end propagate_multiword_properties = function(multiword_spec, property, mixed_value, nouns_only) local seen_property = nil local last_seen_nounal_pos = 0 local word_specs = multiword_spec.alternant_or_word_specs or multiword_spec.word_specs for i = 1, #word_specs do local is_nounal if word_specs[i].alternants then propagate_alternant_properties(word_specs[i], property, mixed_value) is_nounal = not not word_specs[i][property] elseif nouns_only then is_nounal = is_regular_noun(word_specs[i]) else is_nounal = not not word_specs[i][property] end if is_nounal then if not word_specs[i][property] then error("Internal error: noun-type word spec without " .. property .. " set") end for j = last_seen_nounal_pos + 1, i - 1 do word_specs[j][property] = word_specs[j][property] or word_specs[i][property] end last_seen_nounal_pos = i if seen_property == nil then seen_property = word_specs[i][property] elseif seen_property ~= word_specs[i][property] then seen_property = mixed_value end end end if last_seen_nounal_pos > 0 then for i = last_seen_nounal_pos + 1, #word_specs do word_specs[i][property] = word_specs[i][property] or word_specs[last_seen_nounal_pos][property] end end multiword_spec[property] = seen_property end local function propagate_properties_downward(alternant_multiword_spec, property, default_propval) local function set_and_fetch(obj, default) local retval if obj[property] then retval = obj[property] else obj[property] = default retval = default end if not obj["actual_" .. property] then obj["actual_" .. property] = retval end return retval end local propval1 = set_and_fetch(alternant_multiword_spec, default_propval) for _, alternant_or_word_spec in ipairs(alternant_multiword_spec.alternant_or_word_specs) do local propval2 = set_and_fetch(alternant_or_word_spec, propval1) if alternant_or_word_spec.alternants then for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do local propval3 = set_and_fetch(multiword_spec, propval2) for _, word_spec in ipairs(multiword_spec.word_specs) do local propval4 = set_and_fetch(word_spec, propval3) if propval4 == "mixed" then -- FIXME, use clearer error message. error("Attempt to assign mixed " .. property .. " to word") end set_and_fetch(word_spec, propval4) end end else if propval2 == "mixed" then -- FIXME, use clearer error message. error("Attempt to assign mixed " .. property .. " to word") end set_and_fetch(alternant_or_word_spec, propval2) end end end --[=[ Propagate `property` (one of "gender", "number" or "definiteness") from nouns to adjacent adjectives. We proceed as follows: 1. We assume the properties in question are already set on all nouns. This should happen in set_defaults_and_check_bad_indicators(). 2. We first propagate properties upwards and sideways. We recurse downwards from the top. When we encounter a multiword spec, we proceed left to right looking for a noun. When we find a noun, we fetch its property (recursing if the noun is an alternant), and propagate it to any adjectives to its left, up to the next noun to the left. When we have processed the last noun, we also propagate its property value to any adjectives to the right (to handle e.g. [[svefninn langi]] "the long sleep", where the adjective [[langi]] should inherit the 'masculine', 'singular' and 'definite' properties of [[svefninn]]). Finally, we set the property value for the multiword spec itself by combining all the non-nil properties of the individual elements. If all non-nil properties have the same value, the result is that value, otherwise it is `mixed_value` (which is "mixed" for gender, but "both" for number and "bothdef" for definiteness). 3. When we encounter an alternant spec in this process, we recursively process each alternant (which is a multiword spec) using the previous step, and combine any non-nil properties we encounter the same way as for multiword specs. 4. The effect of steps 2 and 3 is to set the property of each alternant and multiword spec based on its children or its neighbors. ]=] local function propagate_properties(alternant_multiword_spec, property, default_propval, mixed_value) propagate_multiword_properties(alternant_multiword_spec, property, mixed_value, "nouns only") propagate_multiword_properties(alternant_multiword_spec, property, mixed_value, false) propagate_properties_downward(alternant_multiword_spec, property, default_propval) end local function determine_noun_status(alternant_multiword_spec) for i, alternant_or_word_spec in ipairs(alternant_multiword_spec.alternant_or_word_specs) do if alternant_or_word_spec.alternants then local is_noun = false for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do for j, word_spec in ipairs(multiword_spec.word_specs) do if is_regular_noun(word_spec) then multiword_spec.first_noun = j is_noun = true break end end end if is_noun then alternant_multiword_spec.first_noun = i end elseif is_regular_noun(alternant_or_word_spec) then alternant_multiword_spec.first_noun = i return end end end -- Set the part of speech based on properties of the individual words. local function set_pos(alternant_multiword_spec) if not alternant_multiword_spec.pos then if alternant_multiword_spec.saw_builtin and not alternant_multiword_spec.saw_non_builtin then alternant_multiword_spec.pos = "သဗ္ဗနာမ်" else alternant_multiword_spec.pos = "နာမ်" end end end local function normalize_all_lemmas(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) local lemma = base.orig_lemma_no_links base.actual_lemma = lemma base.lemma = base.decllemma or lemma base.source_template = alternant_multiword_spec.source_template end) end local function decline_noun(base) for _, props in ipairs(base.prop_sets) do if not decls[base.decl] then error("Internal error: Unrecognized declension type '" .. base.decl .. "'") end decls[base.decl](base, props) end handle_derived_slots_and_overrides(base) local function copy(from_slot, to_slot) base.forms["ind_" .. to_slot] = base.forms["ind_" .. from_slot] base.forms["def_" .. to_slot] = base.forms["def_" .. from_slot] end if base.actual_number ~= base.number then local source_num = base.number == "sg" and "_s" or "_p" local dest_num = base.number == "sg" and "_p" or "_s" for _, case in ipairs(cases) do copy(case .. source_num, case .. dest_num) copy("nom" .. source_num .. "_linked", "nom" .. dest_num .. "_linked") end if base.actual_number ~= "both" then local erase_num = base.actual_number == "sg" and "_p" or "_s" for _, case in ipairs(cases) do base.forms["ind_" .. case .. erase_num] = nil base.forms["def_" .. case .. erase_num] = nil end base.forms["ind_nom" .. erase_num .. "_linked"] = nil base.forms["def_nom" .. erase_num .. "_linked"] = nil end end process_addnote_specs(base) end -- Compute the categories to add the noun to, as well as the annotation to display in the -- declension title bar. We combine the code to do these functions as both categories and -- title bar contain similar information. local function compute_categories_and_annotation(alternant_multiword_spec) local all_cats = {} local plpos = require(en_utilities_module).pluralize(alternant_multiword_spec.pos) local function inscat(cattype) -- m_table.insertIfNot(all_cats, "Icelandic " .. cattype) end local function inscat_noun(cattype) if plpos == "နာမ်" then inscat(cattype) end end if alternant_multiword_spec.saw_indecl and not alternant_multiword_spec.saw_non_indecl then -- inscat("indeclinable " .. plpos) end if alternant_multiword_spec.saw_unknown_decl and not alternant_multiword_spec.saw_non_unknown_decl then -- inscat(plpos .. " with unknown declension") end if alternant_multiword_spec.actual_number == "sg" then -- inscat_noun("uncountable nouns") elseif alternant_multiword_spec.actual_number == "pl" then -- inscat_noun("pluralia tantum") end local annparts = {} local irregs = {} local genderspecs = {} local stemspecs = {} local scrape_chains = {} local function insann(txt, joiner) if joiner and annparts[1] then table.insert(annparts, joiner) end table.insert(annparts, txt) end local function do_word_spec(base) local actual_gender = gender_code_to_desc[base.actual_gender] local declined_gender = gender_code_to_desc[base.gender] local gender if actual_gender ~= declined_gender then gender = ("%s (declined as %s)"):format(actual_gender, declined_gender) -- inscat_noun("nouns with actual gender different from declined gender") else gender = actual_gender end if gender then m_table.insertIfNot(genderspecs, gender) end for _, props in ipairs(base.prop_sets) do -- User-specified 'decllemma:' indicates irregular stem. if base.decllemma then m_table.insertIfNot(irregs, "irreg-stem") -- inscat_noun("nouns with irregular stem") end m_table.insertIfNot(stemspecs, props.stem) end end local key_entry = alternant_multiword_spec.first_noun or 1 if #alternant_multiword_spec.alternant_or_word_specs >= key_entry then local alternant_or_word_spec = alternant_multiword_spec.alternant_or_word_specs[key_entry] if alternant_or_word_spec.alternants then for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do key_entry = multiword_spec.first_noun or 1 if #multiword_spec.word_specs >= key_entry then do_word_spec(multiword_spec.word_specs[key_entry]) end end else do_word_spec(alternant_or_word_spec) end end iut.map_word_specs(alternant_multiword_spec, function(base) if base.scrape_chain[1] then local linked_scrape_chain = {} for _, element in ipairs(base.scrape_chain) do table.insert(linked_scrape_chain, ("[[%s]]"):format(element)) end m_table.insertIfNot(scrape_chains, table.concat(linked_scrape_chain, " -> ")) end end) if alternant_multiword_spec.actual_number == "sg" or alternant_multiword_spec.actual_number == "pl" then -- not "both" or "none" (for [[sebe]]) insann(alternant_multiword_spec.actual_number .. "-only", " ") end if #genderspecs > 0 then insann(table.concat(genderspecs, " // "), " ") end if #irregs > 0 then insann(table.concat(irregs, " // "), " ") end if #scrape_chains > 0 then insann(("based on %s"):format(m_table.serialCommaJoin(scrape_chains)), ", ") -- inscat(plpos .. " declined using scraped base declensions") end alternant_multiword_spec.annotation = table.concat(annparts) if #stemspecs > 1 then -- inscat_noun("nouns with multiple stems") end if alternant_multiword_spec.actual_number == "both" and not m_table.deepEquals(alternant_multiword_spec.sg_genders, alternant_multiword_spec.pl_genders) then -- inscat_noun("nouns that change gender in the plural") end alternant_multiword_spec.categories = all_cats end local function show_forms(alternant_multiword_spec) local lemmas = {} local max_num_words = 1 for _, slot in ipairs(potential_lemma_slots) do if alternant_multiword_spec.forms[slot] then for _, formobj in ipairs(alternant_multiword_spec.forms[slot]) do table.insert(lemmas, formobj) local no_affix_form = formobj.form:gsub("^%-", ""):gsub("%-$", "") local num_words = #(rsplit(no_affix_form, "[ -]+")) max_num_words = math.max(max_num_words, num_words) end break end end alternant_multiword_spec.max_num_words = max_num_words local props = { lemmas = lemmas, slot_list = alternant_multiword_spec.noun_slots, lang = lang, } iut.show_forms(alternant_multiword_spec.forms, props) end local function make_table(alternant_multiword_spec) local forms = alternant_multiword_spec.forms local frame = mw.getCurrentFrame() local function template_prelude() return m_inflection_table.make_top{ title = '{title}{annotation}', palette = 'blue', tall = 'yes', } end local function template_postlude() return m_inflection_table.make_bottom{ notes = '{footnote}', } end local table_spec_both = template_prelude() .. [=[ ! rowspan="2" | ! colspan="2" | ကိုန်ဨကဝုစ် ! colspan="2" | ကိုန်ဗဟုဝစ် |- ! class="secondary" | ဟွံချိုတ်ပၠိုတ် ! class="secondary" | မချိုတ်ပၠိုတ် ! class="secondary" | ဟွံချိုတ်ပၠိုတ် ! class="secondary" | မချိုတ်ပၠိုတ် |- ! မဒုၚ်ယၟု | {ind_nom_s} | {def_nom_s} | {ind_nom_p} | {def_nom_p} |- ! ကမ္မကာရက | {ind_acc_s} | {def_acc_s} | {ind_acc_p} | {def_acc_p} |- ! ပြကမ္မကာရက | {ind_dat_s} | {def_dat_s} | {ind_dat_p} | {def_dat_p} |- ! ဗဳဇဂကူ | {ind_gen_s} | {def_gen_s} | {ind_gen_p} | {def_gen_p} ]=] .. template_postlude() local function get_table_spec_one_number(number, numcode) local table_spec_one_number = [=[ ! rowspan="2" | ! colspan="2" | NUMBER |- ! class="secondary" | ဟွံချိုတ်ပၠိုတ် ! class="secondary" | မချိုတ်ပၠိုတ် |- ! မဒုၚ်ယၟု | {ind_nom_NUM} | {def_nom_NUM} |- ! ကမ္မကာရက | {ind_acc_NUM} | {def_acc_NUM} |- ! ပြကမ္မကာရက | {ind_dat_NUM} | {def_dat_NUM} |- ! ဗဳဇဂကူ | {ind_gen_NUM} | {def_gen_NUM} ]=] return template_prelude() .. table_spec_one_number:gsub("NUMBER", number):gsub("NUM", numcode) .. template_postlude() end local function get_table_spec_one_number_one_def(number, numcode, definiteness, defcode) local table_spec_one_number_one_def = [=[ ! colspan="2" | DEFINITENESS NUMBER |- ! မဒုၚ်ယၟု | {DEF_nom_NUM} |- ! ကမ္မကာရက | {DEF_acc_NUM} |- ! ပြကမ္မကာရက | {DEF_dat_NUM} |- ! ဗဳဇဂကူ | {DEF_gen_NUM} ]=] return template_prelude() .. (table_spec_one_number_one_def:gsub("NUMBER", number):gsub("NUM", numcode) :gsub("DEFINITENESS", definiteness):gsub("DEF", defcode)) .. template_postlude() end if alternant_multiword_spec.title then forms.title = alternant_multiword_spec.title else forms.title = 'မလဟုတ်စှ်ေဆေၚ်စပ်ကဵု <i lang="is">' .. forms.lemma .. '</i>' end local annotation = alternant_multiword_spec.annotation if annotation == "" then forms.annotation = "" else forms.annotation = " (<span style=\"font-size: smaller;\">" .. annotation .. "</span>)" end local number, numcode if alternant_multiword_spec.actual_number == "sg" then number, numcode = "ကိုန်ဨကဝုစ်", "s" elseif alternant_multiword_spec.actual_number == "pl" then number, numcode = "ကိုန်ဗဟုဝစ်", "p" elseif alternant_multiword_spec.actual_number == "none" then -- used for [[sebe]] -- FIXME: Update for Icelandic number, numcode = "", "s" end local definiteness, defcode if alternant_multiword_spec.definiteness == "indef" then definiteness, defcode = "ဟွံချိုတ်ပၠိုတ်", "ind" elseif alternant_multiword_spec.definiteness == "def" then definiteness, defcode = "မချိုတ်ပၠိုတ်", "def" elseif alternant_multiword_spec.definiteness == "none" then definiteness, defcode = "", "ind" end local table_spec = alternant_multiword_spec.actual_number ~= "both" and alternant_multiword_spec.definiteness ~= "bothdef" and get_table_spec_one_number_one_def(number, numcode, definiteness, defcode) or alternant_multiword_spec.actual_number == "both" and table_spec_both or get_table_spec_one_number(number, numcode) return m_string_utilities.format(table_spec, forms) end local function compute_headword_genders(alternant_multiword_spec) local genders = {} local number if alternant_multiword_spec.actual_number == "pl" then number = "-p" else number = "" end iut.map_word_specs(alternant_multiword_spec, function(base) if base.actual_gender ~= "none" then m_table.insertIfNot(genders, base.actual_gender .. number) end end) return genders end -- Externally callable function to parse and decline a noun given user-specified arguments and the argument spec -- `argspec` (specified because the user may give multiple such specs). Return value is ALTERNANT_MULTIWORD_SPEC, an -- object where the declined forms are in `ALTERNANT_MULTIWORD_SPEC.forms` for each slot. If there are no values for a -- slot, the slot key will be missing. The value for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}. function export.do_generate_forms(args, argspec, source_template) local pagename = args.pagename or mw.loadData("Module:headword/data").pagename local parse_props = { parse_indicator_spec = function(angle_bracket_spec, lemma) return parse_indicator_spec(angle_bracket_spec, lemma, pagename) end, angle_brackets_omittable = true, allow_blank_lemma = true, } local alternant_multiword_spec = iut.parse_inflected_text(argspec, parse_props) alternant_multiword_spec.title = args.title alternant_multiword_spec.pos = args.pos alternant_multiword_spec.args = args alternant_multiword_spec.source_template = source_template local scrape_errors = {} iut.map_word_specs(alternant_multiword_spec, function(base) if base.scrape_error then table.insert(scrape_errors, base.scrape_error) end end) if scrape_errors[1] then alternant_multiword_spec.scrape_errors = scrape_errors else normalize_all_lemmas(alternant_multiword_spec) set_all_defaults_and_check_bad_indicators(alternant_multiword_spec) -- These need to happen before detect_all_indicator_specs() so that adjectives get their genders and number -- set appropriately, which are needed to correctly synthesize the adjective lemma. propagate_properties(alternant_multiword_spec, "number", "both", "both") -- FIXME, the default value (third param) used to be 'm' with a comment indicating that this applied only to -- plural adjectives, where it didn't matter; but in Icelandic, plural adjectives are distinguished for gender. -- Make sure 'mixed' works. propagate_properties(alternant_multiword_spec, "gender", "mixed", "mixed") propagate_properties(alternant_multiword_spec, "definiteness", "bothdef", "bothdef") detect_all_indicator_specs(alternant_multiword_spec) -- Propagate 'actual_number' after calling detect_all_indicator_specs(), which sets 'actual_number' for -- adjectives. propagate_properties(alternant_multiword_spec, "actual_number", "both", "both") determine_noun_status(alternant_multiword_spec) set_pos(alternant_multiword_spec) alternant_multiword_spec.noun_slots = get_noun_slots(alternant_multiword_spec) local inflect_props = { skip_slot = function(slot) return skip_slot(alternant_multiword_spec.actual_number, alternant_multiword_spec.definiteness, slot) end, slot_list = alternant_multiword_spec.noun_slots, inflect_word_spec = decline_noun, } iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props) compute_categories_and_annotation(alternant_multiword_spec) alternant_multiword_spec.genders = compute_headword_genders(alternant_multiword_spec) end if args.json then alternant_multiword_spec.args = nil return require("Module:JSON").toJSON(alternant_multiword_spec) end return alternant_multiword_spec end -- Entry point for {{is-ndecl}}. Template-callable function to parse and decline a noun given -- user-specified arguments and generate a displayable table of the declined forms. function export.show(frame) local parent_args = frame:getParent().args local params = { [1] = { required = true, list = true, default = "akur<m.#>" }, deriv = { list = true }, id = {}, pos = {}, title = {}, pagename = {}, json = { type = "boolean" }, } local args = m_para.process(parent_args, params) local alternant_multiword_specs = {} for i, argspec in ipairs(args[1]) do alternant_multiword_specs[i] = export.do_generate_forms(args, argspec, "is-ndecl") end if args.json then -- JSON return value if #args[1] == 1 then return alternant_multiword_specs[1] else return alternant_multiword_specs end end local parts = {} local function ins(txt) table.insert(parts, txt) end for _, alternant_multiword_spec in ipairs(alternant_multiword_specs) do if not alternant_multiword_spec.scrape_errors then show_forms(alternant_multiword_spec) end if alternant_multiword_spec.header then ins(("'''%s:'''\n"):format(alternant_multiword_spec.header)) end if alternant_multiword_spec.q then ins(("''%s''\n"):format(alternant_multiword_spec.q)) end local categories if alternant_multiword_spec.scrape_errors then local errmsgs = {} for _, scrape_error in ipairs(alternant_multiword_spec.scrape_errors) do table.insert(errmsgs, '<span style="font-weight: bold; color: var(--wikt-palette-red,#CC2200);">' .. scrape_error .. "</span>") end -- Surround the messages with a <div> because the table normally does that, and we want to ensure -- similar formatting with respect to newlines. ins("<div>" .. table.concat(errmsgs, "<br />") .. "</div>") categories = { "Icelandic scraping errors in Template:is-ndecl" } else ins(make_table(alternant_multiword_spec)) categories = alternant_multiword_spec.categories end ins(require("Module:utilities").format_categories(categories, lang, nil, nil, force_cat)) end return table.concat(parts) end return export d1ffkmtw8jopt3583bl9e93d9o3e2da ထာမ်ပလိက်:is-ndecl/documentation 10 213666 402132 293891 2026-09-28T10:20:11Z 咽頭べさ 33 402132 wikitext text/x-wiki {{documentation subpage}} {{uses lua|Module:is-noun}} ==Basic usage== This template is used to generate a declension table for Icelandic nouns. '''Be careful''' using this template because Icelandic noun declension is very complex. If you are not completely sure about how a given noun is declined, check it against the declension tables at [https://bin.arnastofnun.is/ Beygingarlýsing íslensks nútímamáls (BÍN)]. ==Examples== {|class="wikitable" ! Page !! Example !! Comment |- | rowspan=2| {{m|is|hestur||horse}} || <code><nowiki>{{is-ndecl|m}}</nowiki></code> || Many nouns require only the gender to be specified ({{cd|m}}, {{cd|f}} or {{cd|n}} for masculine, feminine or neuter, respectively). |- | colspan=2| {{is-ndecl|m|pagename=hestur}} |- | rowspan=2| {{m|is|arður||profit}} || <code><nowiki>{{is-ndecl|m.sg}}</nowiki></code> || Example of a singular-only noun. |- | colspan=2| {{is-ndecl|m.sg|pagename=arður}} |- | rowspan=2| {{m|is|hófur||hoof}} || <code><nowiki>{{is-ndecl|m.dati/-}}</nowiki></code> || Most strong masculine nouns ending in a single consonant require an override that specifies the dative singular because it is highly unpredictable. The format is {{cd|dat}} followed directly by the indefinite and definite endings, respectively, separated by a slash. Here, the indefinite ending is ''-i'' and the definite ending (before the definite clitic ''-num'') is null; i.e. indefinite ''hófi'', definite ''hófnum''. |- | colspan=2| {{is-ndecl|m.dati/-|pagename=hófur}} |- | rowspan=2| {{m|is|baugur||ring}} || <code><nowiki>{{is-ndecl|m.dati:-/-:i}}</nowiki></code> || If there is more than one possibility for the dative, separate them by a colon and list them in order of commonness (refer to [https://bin.arnastofnun.is/ BÍN] for this information). |- | colspan=2| {{is-ndecl|m.dati:-/-:i|pagename=baugur}} |- | rowspan=2| {{m|is|höfundur||author}} || <code><nowiki>{{is-ndecl|m,ar}}</nowiki></code> || If the genitive singular ending is not ''-s'' (for masculine or neuter nouns) or ''-ar'' (for feminine nouns), specify it following the gender, separated by a comma. |- | colspan=2| {{is-ndecl|m,ar|pagename=höfundur}} |- | rowspan=2| {{m|is|vindur||wind}} || <code><nowiki>{{is-ndecl|m,s:ar[rare]}}</nowiki></code> || As with dative overrides, if there are two possibilities for the genitive singular, separate them with a colon. Use square brackets after an ending to specify a footnote. |- | colspan=2| {{is-ndecl|m,s:ar[rare]|pagename=vindur}} |- | rowspan=2| {{m|is|þröskuldur||threshold}} || <code><nowiki>{{is-ndecl|m,s:ar,ar:ir}}</nowiki></code> || If the nominative plural ending is not ''-ar'' (for masculine nouns) or ''-ir'' (for feminine nouns), specify it following the genitive singular override. Here, there are two possibilities ''-s'' and ''-ar'' for the genitive singular, and two possibilities ''-ar'' and ''-ir'' for the nominative plural. The accusative plural is automatically derived from the nominative plural; see [[#Overrides following the gender spec]] below. |- | colspan=2| {{is-ndecl|m,s:ar,ar:ir|pagename=þröskuldur}} |- | rowspan=2| {{m|is|blundur||slumber, doze}} || <code><nowiki>{{is-ndecl|m,,ir}}</nowiki></code> || To override the nominative plural but not the genitive singular, leave the latter blank. |- | colspan=2| {{is-ndecl|m,,ir|pagename=blundur}} |- | rowspan=2| {{m|is|bifur||beaver}} || <code><nowiki>{{is-ndecl|m.#}}</nowiki></code> || Use {{cd|#}} to indicate that the ''-ur'' ending is part of the stem. This automatically enables stem contraction before vowel-initial endings and defaults the dative singular to ''-i''. |- | colspan=2| {{is-ndecl|m.#|pagename=bifur}} |- | rowspan=2| {{m|is|nár||corpse}} || <code><nowiki>{{is-ndecl|m,,ir}}</nowiki></code> || Nouns in ''-ár'' and ''-ær'' form the stem by default by dropping the ''-r''. Use {{cd|#}} if the ''-r'' is part of the stem. |- | colspan=2| {{is-ndecl|m,,ir|pagename=nár}} |- | rowspan=2| {{m|is|bjór||beer}} || <code><nowiki>{{is-ndecl|m}}</nowiki></code> || Nouns ending in ''-r'' that do not end in ''-ur'', ''-ár'' or ''-ær'' include the ''-r'' in the stem by default. Use {{cd|##}} if the ''-r'' is ''not'' part of the stem. |- | colspan=2| {{is-ndecl|m|pagename=bjór}} |- | rowspan=2| {{m|is|bíll||car}} || <code><nowiki>{{is-ndecl|m}}</nowiki></code> || Nouns in ''-ll'' and ''-nn'' drop the final consonant to form the stem. Use {{cd|#}} to prevent this (e.g. with {{m|is|moll||minor (in music); minor key}}). |- | colspan=2| {{is-ndecl|m|pagename=bíll}} |- | rowspan=2| {{m|is|gaffall||fork}} || <code><nowiki>{{is-ndecl|m}}</nowiki></code> || Nouns in ''-all/-ill/-ull'' and ''-ann/-inn/-unn'' have stem contraction by default before vowel-initial endings. Note also that ''u''-mutation is the dative plural (to ''göfflum'') is automatically handled. |- | colspan=2| {{is-ndecl|m|pagename=gaffall}} |- | rowspan=2| {{m|is|kórall||coral}} || <code><nowiki>{{is-ndecl|m.-con}}</nowiki></code> || Use {{cd|con}} to force stem contraction where it is not the default, and {{cd|-con}} (as in this case) to turn it off where it is the default. |- | colspan=2| {{is-ndecl|m.-con|pagename=kórall}} |- | rowspan=2| {{m|is|blástur||breeze, wind}} || <code><nowiki>{{is-ndecl|m.#.imut}}</nowiki></code> || Nouns with ''i''-mutation before endings beginning with an ''i'' should use {{cd|imut}} to signal this. (Here, {{cd|#}} indicates that the ''-ur'' ending is part of the stem; see above.) |- | colspan=2| {{is-ndecl|m.#.imut|pagename=blástur}} |- | rowspan=2| {{m|is|böllur||ball}} || <code><nowiki>{{is-ndecl|m,ar,ir.unumut.imut}}</nowiki></code> || Nouns that were ''u''-stems in Proto-Germanic have ''u''-mutation in the lemma (nominative singular) form that must be reversed to obtain the stem. Use {{cd|unumut}} to signal this. (These nouns also typically have irregular genitive singular ''-ar'', irregular nominative plural ''-ir'' and ''i''-mutation.) |- | colspan=2| {{is-ndecl|m,ar,ir.unumut.imut|pagename=böllur}} |} ==Parameters== Normally there is only one parameter to specify. At the minimum, this must specify the gender: {{cd|m}}, {{cd|f}} or {{cd|n}} for masculine, feminine or neuter, respectively, e.g. for {{m|is|hestur||horse}}: {{demo|<nowiki>{{is-ndecl|m|pagename=hestur}}</nowiki>}} Sometimes additional properties, or ''indicators'', need to be specified to correctly inflect a given noun. An example is {{m|is|arfur||inheritance}}, which is singular-only: {{demo|<nowiki>{{is-ndecl|m.sg|pagename=arfur}}</nowiki>}} It is generally not necessary to explicitly specify any property that can automatically be inferred. For example, it is not necessary to specify whether a noun is strong or weak (this can be inferred from the noun's ending in the lemma form); nor is it usually necessary to specify that nouns like {{m|is|hattur||hat}} have ''u''-mutation in forms such as the dative plural (in this case, to ''höttum''). As shown, multiple indicators are separated by a dot ({{cd|.}}). Most indicators can come in any order; exceptions are the indicators for gender, which normally must come first, and the {{cd|adj}} indicator specifying that the term in question is an adjective, which likewise normally must come first. (If you need to combine {{cd|adj}} with a gender, put {{cd|adj}} first.) There are a lot of different indicators, and it's helpful to divide them into types. It is recommended that the following order be used when multiple indicators are required: # Gender (must come first) # Genitive-singular and nominative/accusative-plural overrides (must come directly after the gender, comma-separated) # Number # Definiteness # Stem indicators {{cd|#}} and {{cd|##}} # Control specs (i.e. mutation, infix and contraction indicators), in whatever order seems most logical # Stem overrides ({{cd|stem:...}}, {{cd|vstem:...}}, etc.) and declension overrides ({{cd|decllemma:...}}, {{cd|declgender:...}}, {{cd|declnumber:...}}) # Misc boolean indicators # Specific form overrides The following sections discuss the recognized indicators in detail. ===Gender, number, definiteness, common vs. proper === * Gender: {{cd|m}} for masculine, {{cd|f}} for feminine, {{cd|n}} for neuter. In most cases, this must be given, and when given, it must come first. (All other indicators may come in any order, and are mostly optional.) * Number: {{cd|sg}} for singular-only nouns, {{cd|pl}} for plural-only nouns, {{cd|both}} for nouns with both singular and plural. If unspecified, the defaults are as follows: *# Proper nouns default to singular-only. The rules for determining a proper noun are: *## If the indicator {{cd|common}} or {{cd|dem}} is present, the noun is common (not proper). *## If the indicator {{cd|proper}} is present, the noun is proper. *## If the invoking template is {{tl|is-noun}}, the noun is common, and if the invoking template is {{tl|is-proper noun}}, the noun is proper. (This normally only applies to indeclinable nouns, which specify the declension directly in the call to that template. Most nouns should use {{tl|is-noun|@@}} or {{tl|is-proper noun|@@}} to scrape the declension of an associated call to {{tl|is-ndecl}}, which has no common/proper default.) *## If the noun begins with an uppercase letter followed by a lowercase letter, the noun is proper. (This rule is phrased this way to exclude abbreviations like {{m|is|DKS||DNA}}.) *# Otherwise, masculine nouns in {{m|is|-skapur}} or {{m|is|-naður}} default to singular-only. *# Otherwise, nouns default to both singular and plural. * Definiteness: {{cd|indef}} for indefinite-only nouns, {{cd|def}} for definite-only nouns, {{cd|bothdef}} for nouns that can be both indefinite and definite. Proper nouns (see just above for how this is determined) default to indefinite-only; all others default to both indefinite and definite. * Common vs. proper: {{cd|proper}} forces a proper noun (defaults to indefinite-only, singular-only), {{cd|common}} forces a common noun (defaults to indefinite and definite, singular and plural), {{cd|dem}} indicates a demonym such as {{m|is|Bandaríkjamaður||American}} or {{m|is|Indónesi||Indonesian}} (currently has the same effect as {{cd|common}}). ===Overrides=== ''Overrides'', per their name, allow you to override individual case/number forms. Overrides can be specified in two ways: directly following the gender spec and as separate indicators. The former type let you override the genitive singular and/or nominative and accusative plural, while the latter type let you override any case/number form. Both types use exactly the same format. ====Overrides following the gender spec==== The most commonly used overrides are those that follow the gender spec. The genitive singular ending is specified after the gender, separated by a comma, and the nominative plural ending follows, separated again by a comma. For example, for {{m|is|feldur||fur; fur coat}}, use: {{demo|sep=which indicates that the genitive singular should end in ''-ar'' and the nominative plural in ''-ir'', and produces|<nowiki>{{is-ndecl|m,ar,ir|pagename=feldur}}</nowiki>}} For most masculine nouns, the default genitive is ''-s'' and the default nominative plural is ''-ar'', so both need to be overridden. Note that overriding the nominative plural in this fashion automatically overrides the accusative plural as well, which becomes ''-i'', according to the following rules: # Feminines and neuters use the same ending for the accusative plural as is specified for the nominative plural. # Masculines drop the final ''-r'' from the ending to form the accusative plural ending unless the ending is ''-ur'' (possibly preceded by an ''i''-mutation signal {{cd|^}}; see below), in which case the ending remains unchanged. It should be noted that the specified endings are attached to the stem, not to the lemma. Generally the stem is correctly computed automatically from the lemma by dropping certain endings, e.g. ''-ur'', ''-a'' or ''-i'', as well as ''-l'' in a masculine lemma ending in ''-ll'' and ''-n'' in a masculine lemma ending in ''-nn''. Sometimes a little help is needed, e.g. through the stem indicators {{cd|#}} and {{cd|##}}, documented below. If only the genitive singular needs to be overridden, leave off the nominative plural override and preceding comma, as with {{m|is|höfundur||author}}: {{demo|<nowiki>{{is-ndecl|m,ar|pagename=höfundur}}</nowiki>}} If only the nominative/accusative plural needs to be overridden, leave the genitive singular override blank but keep the preceding and following comma, as with feminine {{m|is|skeið||spoon}}: {{demo|<nowiki>{{is-ndecl|f,,ar|pagename=skeið}}</nowiki>}} The general format for an override is a colon-separated list of endings, each of which can be followed by a footnote in square brackets. An example is {{m|is|snjór||snow}} with various possible genitive singulars and nominative plurals, some of which are dated: {{demo|<nowiki>{{is-ndecl|m,s:var[dated]:ar,ar:var[dated].##|pagename=snjór}}</nowiki>}} Here, three genitive singular endings are given and two nominative plural endings (which will accordingly generate two accusative plural endings with the ''-r'' dropped and the footnote maintained). If the same footnote is specified in more than one place, as here, they are deduplicated and only one footnote will appear at the bottom of the table. (The {{cd|##}} indicator is required to get a stem ''snjó-'' instead of ''snjór-'', which would be the default for nouns in ''-ór''.) To specify an override consisting of an empty ending, use {{cd|-}}. This occurs fairly frequently with proper nouns specifying place names, which often do not follow standard declension patterns, instead opting to be indeclinable or semi-indeclinable. An example is the feminine noun {{m|is|Madríd||Madrid}}, which frequently has a null-ending genitive (making the noun indeclinable), in addition to a normal genitive in ''-ar''. Specify the following: {{demo|<nowiki>{{is-ndecl|f,-:ar|pagename=Madríd}}</nowiki>}} Note here that no nominative plural override is given, and in fact doing so triggers an error, because this noun is singular-only (and indefinite-only) and has no plural. (This is because the noun is identified as a proper noun by the initial capital letter. See [[#Gender, number, definiteness]] above for more information.) Use {{cd|--}} to indicate that a given form is missing completely. This rarely needs to be given, but an example that requires it is {{m|is|völ||choice}}, which is singular-only and missing the genitive singular. Specify the following: {{demo|<nowiki>{{is-ndecl|f,--.sg|pagename=völ}}</nowiki>}} Overrides may be preceded by {{cd|^}} to force ''i''-mutation of the preceding stem. An example of this is {{m|is|bók||book}}, with nominative plural ''bækur''. Specify the following: {{demo|<nowiki>{{is-ndecl|f,,^ur|pagename=bók}}</nowiki>}} This is described in more detail in the section below on ''i''-mutation. In some cases, it is necessary to specify the full form in an override. To do this, specify the full value and precede it with an exclamation point ({{cd|!}}). An example of this is {{m|is|nótt||night}}, with nominative/accusative plural and genitive singular {{m|is|nætur}}. The ending spec {{cd|^ur}} would not work here because it would result in ''nættur'' with the ''t'' still doubled. Specify the following: {{demo|<nowiki>{{is-ndecl|f,!nætur,!nætur|pagename=nótt}}</nowiki>}} If you look at the tables produced in the presence of overrides, you'll notice that although the specified override ending is that of the indefinite form of the case/number combination, the definite form is affected likewise. Sometimes it is necessary to control the indefinite and definite endings separately. To do this, specify two override specs separated by a slash ({{cd|/}}), both in indefinite form. An example where this is necessary is {{m|is|ell||the letter L}}, which has indefinite genitive singular either ''ell'' or ''ells'', but definite genitive singular only ''ellsins''. Specify the following: {{demo|<nowiki>{{is-ndecl|n,-:s/s.dat-:i/i|pagename=ell}}</nowiki>}} Note that overrides to the right of the slash (which control only the definite form) still need to take the form of an indefinite ending; the clitic is automatically added onto the specified ending. (The {{cd|dat-:i/i}} is an example of an arbitrary case/number override, in this case for the dative singular. This override also takes the form of a two-part slash-separated spec, which is in fact extremely common with dative singular overrides. See the next section for more information.) Full-form overrides preceded by {{cd|!}} can also appear in two-part (slash-separated) specs, and as with ending overrides, take the indefinite form regardless of which side of the slash they appear on. An example is feminine {{m|is|brún||brow}} (note, there is a different feminine word {{m|is|brún||rim}} with a different declension): {{demo|<nowiki>{{is-ndecl|f,,ir:^[in fixed expressions]:!brýr[colloquial]/ir:^[literary]:!brýr[colloquial]|pagename=brún}}</nowiki>}} Here, the nominative/accusative plural expression is complex, with each of the two slash-separated specs specifying the same three possible forms (''brúnir'', ''brýn'' and colloquial ''brýr'') but with differing footnotes. The definite forms automatically have the definite clitic ''-nar'' added onto the resulting form overrides, producing definite ''brúnirnar'', ''brýnnar'' and ''brýrnar'' respectively. ====Arbitrary overrides==== You can also override an arbitrary case/number combination. This takes the form of a regular indicator, which can appear anywhere in the overall inflection spec. An override indicator looks like {{cd|dati}}, which specifies that the dative singular takes an ''-i'' ending; or {{cd|genplna}}, which specifies that the genitive plural takes a ''-na'' ending; or a more complex spec such as {{cd|dat-:i/i}} given above, which specifies that the indefinite dative singular takes either a null ending or ''-i'' ending, while the definite dative singular takes only an ''-i'' ending (before the definite clitic is added). The important thing to notice is that the case/number spec (a lone case abbreviation {{cd|nom}}, {{cd|acc}}, {{cd|dat}} or {{cd|gen}} for singular slots, and a case abbreviation followed by {{cd|pl}} for plural slots) is followed directly by the overriding ending(s), without any intervening delimiter. (If two slots take the same override value, you can combine them by putting a {{cd|+}} between the slot specifiers, e.g. {{cd|acc+datu}} to specify the both accusative and dative singular take ''-u'', as with many female given names such as {{m|is|Sólveig}}. More complex specs can be given as well, such as {{cd|acc+dat-:i:u}} for {{m|is|Berglind}}, which specifies that the accusative and dative singular take either a null ending, ''-i'' or ''-u''.) Note that an override of the nominative plural specified in this fashion overrides ''only'' the nominative plural and does not affect the accusative plural. ===Default genitive singular and nominative plural=== To know whether to use a genitive singular or nominative plural override, it's important to know what the defaults are. The following table shows them. This table may seem a bit overwhelming at first. Focus on the endings of most strong nouns (the first row listed for each gender) and look up the others as necessary. (Weak nouns rarely need either the genitive singular or nominative plural overridden, although many weak feminine and neuter nouns need the genitive plural overridden, using e.g. {{cd|genplna}} to specify that the ending is ''-na'' instead of ''-a''.) {|class="wikitable" ! Gender !! Type !! Example !! Genitive singular !! Nominative plural |- | rowspan=8| masculine || most strong nouns || {{m|is|hestur||horse}} || ''-s'' || ''-ar'' |- | nouns in ''-ir'' (which is not part of the stem) || {{m|is|læknir||doctor, MD}} || ''-is'' || ''-ar'' |- | nouns in ''-skapur'' (which default to singular-only) || {{m|is|vinskapur||friendship}} || ''-ar'' || ''-ar'' |- | nouns in ''-naður'' (which default to singular-only) || {{m|is|þjófnaður||theft}} || ''-ar'' || ''-ir'' |- | weak nouns in ''-i'' || {{m|is|tími||time, hour}} || ''-a'' || ''-ar'' |- | weak nouns in ''-a'' || {{m|is|herra||gentleman; Mr.}} || ''-a'' || ''-ar'' |- | nouns in ''-andi'' and ''-jandi'' || {{m|is|eigandi||owner}}, {{m|is|flytjandi||performer}} || ''-a'' || ''-ur'' with ''i''-mutation to ''e'' |- | ''r''-stem nouns || {{m|is|bróðir||brother}} || ''-ur'' || ''-ur'' with ''i''-mutation |- | rowspan=11| feminine || most strong nouns || {{m|is|braut||path, way}} || ''-ar'' || ''-ir'' |- | nouns in ''-ur'' || {{m|is|hildur||fight, battle}} || ''-ar'' || ''-ir'' |- | nouns in ''-ing'' || {{m|is|eining||unit}} || ''-ar'' || ''-ar'' |- | nouns in ''-ung'' || {{m|is|nauðung||constraint; compulsion}} || ''-ar'' || ''-ar'' |- | nouns in ''-i'' || {{m|is|keppni||competition, match}} || ''-i'' || ''-ar'' |- | nouns in ''-á'' (which forms part of the stem) || {{m|is|á||river}} || ''-r'' || ''-r'' |- | nouns in ''-ó'' (which forms part of the stem) || {{m|is|kónguló||spider}} || ''-ar'' || ''-r'' with ''i''-mutation (to ''æ'') |- | nouns in ''-ú'' (which forms part of the stem) || {{m|is|trú||belief}} || ''-ar'' || ''-r'' |- | weak nouns (in ''-a'') || {{m|is|saga||story; history; saga}} || ''-u'' || ''-ur'' |- | nouns in long ''i''-mutated vowel + ''-r'' (stem ends in the unmutated vowel) || {{m|is|kýr||cow}}, {{m|is|sýr||sow}}, {{m|is|ær||ewe}} and compounds || colspan=2| ''r'' with ''i''-mutation back to the lemma vowel |- | ''r''-stem nouns || {{m|is|móðir||mother}} || ''-ur'' || ''-ur'' with ''i''-mutation |- | rowspan=4| neuter || most strong nouns || {{m|is|land||land}} || ''-s'' || null ending with ''u''-mutation |- | nouns in ''-i'' (which is not part of the stem) || {{m|is|kvæði||poem, song}} || ''-is'' || ''-i'' |- | nouns in ''-é'' (which is not part of the stem) with {{cd|.já}} indicator || {{m|is|tré||tree}}, {{m|is|fé||sheep; cattle; money}} || ''-és'' (but {{m|is|fé}} has genitive in ''-jár'') || ''-é'' |- | weak nouns (in ''-a'') || {{m|is|hjarta||heart}} || ''-a'' || ''-u'' |} ===Default dative singular for masculine nouns=== Under some circumstances, the dative singular of masculine nouns is largely predictable and has defaults that apply for most nouns. For other nouns, however, the dative singular is largely unpredictable, and an override ''must'' be supplied or an error results. The defaults are as follows: {|class="wikitable" style="text-align: center;" ! Type !! Indefinite default !! Definite default |- | weak nouns || colspan=2| ''-a'' |- | nouns in ''-ndi'' || colspan=2| ''-a'' |- | nouns in ''-ir'' || colspan=2| ''-i'' |- | nouns in ''-skapur'' || colspan=2| null ending |- | nouns in ''-naður'' || ''-i'' || ''-i'' or null ending (both possibilities are given) |- | nouns in ''-kell'' || colspan=2| stem + ''-keli'' or stem + ''-katli'' (with footnote ''archaic'') |- | nouns in ''-ó'' || colspan=2| null ending |- | ''r''-stem nouns ({{cd|.rstem}}) || colspan=2| ''-ur'' |- | nouns in ''-ingur'' or ''-ungur'' || ''-i'' || null ending |- | ''j''-infix nouns ({{cd|.j}}) || colspan=2| null ending |- | nouns whose stem ends in two consonants (except ''-kk'' or ''-pp'') || colspan=2| ''-i'' |- | nouns in ''-x'' || colspan=2| ''-i'' |- | contracted nouns ({{cd|.con}}, ''-ur'' with {{cd|.#}} specified, or in ''-all''/''-ill''/''-ull'' or ''-ann''/''-inn''/''-unn'') || colspan=2| ''-i'' |- | proper nouns not ending in a vowel || colspan=2| ''-i'' |- | nouns in whose stem ends in a vowel or ''-r'' (other than contracted nouns) || colspan=2| null ending |- | nouns in ''-ll'' without contraction || colspan=2| null ending |- | nouns in ''-nn'' without contraction || colspan=2| ''-i'' |- | all others || colspan=2| '''override required''' |} Approximately speaking, strong uncontracted common nouns whose stem ends in a single consonant (or ''-kk'' or ''-pp'') need an override. This override must be two-part with a slash (e.g. {{cd|dat-/i}}), because such nouns typically have different indefinite and definite endings. ===Control specs=== ''Control specs'' control various aspects of the declension. There are three types of control specs: # ''mutation specs'' (specifying how ''u''-mutation works and whether ''i''-mutation, reverse ''u''-mutation and/or reverse ''i''-mutation happen); # ''infixing specs'' (specifying whether a ''j'' or ''v'' is infixed between the stem and vowel-initial endings); # ''contraction specs'' (specifying whether contraction, i.e. deletion of the last stem vowel, occurs before vowel-initial endings). What distinguishes control specs from other indicators is that multiple comma-separated values for a given spec type can be specified, and each can be given a footnote, which is attached to all forms affected by that spec. See examples below. ====Mutation specs==== Mutation specs control ''u''-mutation (the change of ''a'' to ''ö'' or ''u''); ''i''-mutation (the change of a back vowel to a front vowel, such as ''a'' to ''e'' or ''á'' to ''æ''); reverse ''u''-mutation (the change of a ''u''-mutated vowel ''ö'' or ''u'' back to ''a''); and reverse ''i''-mutation (the change of an ''i''-mutated vowel back to its original vowel). In some cases, more than one mutation spec of a given type can be given, comma-separated. For example, {{cd|umut,uUmut}} indicates that either regular ''u'' or double ''u/U''-mutation can happen, leading to two possible outputs in circumstances where ''u''-mutation applies (e.g. the dative plural). An example where this might be applicable is {{m|is|banani||banana}}, which has dative plural either ''banönum'' (regular ''u''-mutation) or ''bönunum'' (double ''u/U''-mutation). See examples below. =====u-mutation===== The following ''u''-mutation specs exist: * {{cd|umut}} indicates that when ''u''-mutation should happen (e.g. in the dative plural), it should be regular ''u''-mutation (if the last vowel in the word is ''a'', it changes to ''ö''). This is the default in most circumstances, and does not normally need to be given. The exact circumstances in which ''u''-mutation happens are not specified by this indicator (but are normally triggered by an ending beginning with ''u'', and sometimes in other circumstances); only the ''type'' of ''u''-mutation is indicated. * {{cd|uUmut}} indicates that the type of ''u''-mutation should be double ''u/U''-mutation (if the last vowel in a word is ''a'', it changes to ''u'', and if the second-to-last vowel is ''a'', it changes to ''ö''). This is the only common type of ''u''-mutation in nouns other than regular ''u''-mutation; the types below are rare. * {{cd|uumut}} indicates that the type of ''u''-mutation should be double ''u/u''-mutation (if either of the last two vowels in a word are ''a'', they change to ''ö''). This type of ''u''-mutation is rare, but occurs for example as one of two types of ''u''-mutation that occur in {{m|is|hafald||heddle (in a loom)}} (producing nominative/accusative plural ''höföld'' and dative plural ''höföldum''), along with regular ''u''-mutation. * {{cd|Umut}} indicates that the type of ''u''-mutation should be single ''U''-mutation (if the last vowel in a word is ''a'', it changes to ''u'', and the second-to-last vowel is unaffected even if it's ''a''). This type of ''u''-mutation is rare and occurs mostly in its inverse, where sometimes you need to change ''u'' to ''a'' in the last syllable while leaving alone a preceding ''ö'' (examples are {{m|is|fjölgun||increase}}, {{m|is|örvun||encouragement}}, etc.). * {{cd|uUUmut}} indicates that the type of ''u''-mutation should be triple ''u/U/U''-mutation (if the last vowel in a word is ''a'', it changes to ''u''; if the second-to-last vowel is ''a'', it also changes to ''u''; and if the third-to-last vowel is ''a'', it changes to ''ö''). This type of ''u''-mutation does not occur in nouns, but occurs fairly frequently in superlative adjectives (e.g. {{m|is|saltaðastur||saltiest, most salty}}, with feminine {{m|is||söltuðust}}). It is mentioned here for completeness. * {{cd|u_mut}} indicates that the type of ''u''-mutation should be ''u/-''-mutation (if the second-to-last vowel in a word is ''a'', it changes to ''ö''; the last vowel is unaffected). This type of ''u''-mutation is provided for completeness but has no known uses. Note the following about ''u''-mutation: # It does not affect ''au'' vowels. Hence, regardless of the type of ''u''-mutation specified, the dative plural of {{m|is|naut||bull}} is {{m|is||nautum}}, not #''nöutum''. # ''u''-mutation "skips" over a final ''-ur'' ending. Thus, regular ''u''-mutation applied to the neuter noun {{m|is|mastur||mast}} produces nominative/accusative plural {{m|is||möstur}}; effectively, the final ''-ur'' is invisible. # ''u''-mutation can be explicitly requested in an ending override by prefixing the override with {{cd|^^}}. It is rare that you will have to do this, but (e.g.) it is used internally when specifying the nominative/accusative plural ending of neuter nouns. =====Reverse u-mutation===== Reverse ''u''-mutation is exactly like normal ''u''-mutation but applies in reverse, i.e. ''ö'' and sometimes ''u'' vowels are converted to ''a'' rather than the other way around. This is used to derive the underlying stem from the lemma when the lemma itself has ''u''-mutation applied, as with many feminine nouns (e.g. {{m|is|gjöf||gift}}) and some masculine nouns (e.g. {{m|is|fjörður||fjord}}). Feminine nouns in fact have regular reverse ''u''-mutation as the default; thus {{m|is|gjöf}} will automatically have genitive singular {{m|is||gjafar}} without this needing to be explicitly specified. The reverse ''u''-mutation specs are exactly like normal ''u''-mutation specs but are prefixed by {{cd|un}}. Specifically: * {{cd|unumut}} indicates that regular reverse ''u''-mutation should happen (if the last vowel in the word is ''ö'', it changes to ''a''). The circumstances under which this happens aren't specified by this indicator, but generally it occurs before endings that start with an ''a'' or ''i'' (unless ''i''-mutation is also in effect, which takes precedence). For example, {{m|is|fjörður||fjord}} needs {{cd|unumut.imut}} to specify that regular reverse ''u''-mutation to ''fjarð-'' happens e.g. in the genitive singular ''fjarðar'', and ''i''-mutation to ''firð-'' happens e.g. in the nominative plural ''firðir''. Keep in mind that {{cd|unumut}} is the default in some circumstances (as mentioned above), e.g. for feminine nouns with ''ö'' as the last stem vowel such as {{m|is|gjöf||gift}} and {{m|is|sögn||story, tale; verb}}. * {{cd|unuUmut}} indicates that double reverse ''u/U''-mutation should happen (if the last vowel in a word is ''u'', it changes to ''a'', and if the second-to-last vowel is ''ö'', it also changes to ''a''). The circumstances under which this happens aren't specified by this indicator and are different from those under which regular reverse ''u''-mutation happens. For example, {{m|is|söfnuður||congregration}} needs {{cd|unuUmut}}, producing genitive singular ''safnaðar'' and genitive plural ''safnaða''. The specific circumstances under which double reverse ''u/U''-mutation takes place are: (a) for masculines, in the genitive singular and plural; (b) for feminines, in the nominative, accusative and genitive plural. * {{cd|unuumut}}, {{cd|unUmut}}, {{cd|unuUUmut}} and {{cd|unu_mut}} are the reverse ''u''-mutation indicators corresponding respectively to {{cd|uumut}}, {{cd|Umut}}, {{cd|uUUmut}} and {{cd|u_mut}}. These are mostly provided for completeness; but as indicated above, some nouns like {{m|is|fjölgun}} and {{m|is|örvun}} require {{cd|unUmut}} because the ''u'' changes to ''a'' while the ''ö'' doesn't change. The circumstances under which these types of reverse ''u''-mutation apply are the same as for {{cd|unuUmut}} (and *NOT* the same as for {{cd|unumut}}; see above). * {{cd|-unumut}}, {{cd|-unuUmut}}, etc. explicitly disable reverse ''u''-mutation. They differ from each other only when an associated footnote is provided (see below); the footnote is added to the forms where reverse ''u''-mutation would take place, which differs between {{cd|unumut}} and {{cd|unuUmut}} (see above). =====i-mutation===== The following ''i''-mutation specs exist: * {{cd|imut}} indicates that ''i''-mutation should happen before endings beginning with ''i'' and wherever ''i''-mutation is explicitly requested by prefixing an ending with {{cd|^}} (see below). * {{cd|-imut}} indicates that ''i''-mutation should not happen. This is normally used in conjunction with {{cd|imut}}, and especially for hooking a footnote off of {{cd|-imut}}; see examples below. Note the following about ''i''-mutation: # ''i''-mutation can be explicitly requested in an ending override by prefixing the override with {{cd|^}}. This is useful, for example, when specifying the plural of nouns with ''i''-mutation in their plural, such as {{m|is|bók||book}}, which requires a plural override {{cd|^ur}} to produce plural {{m|is||bækur}}. (Remember that this isn't necessary if the ending begins with ''i'', provided that the {{cd|imut}} spec is given. An example of where this is used is {{m|is|háttur||way, manner; kind, type; habit}}, which has ''i''-mutation in the both the dative singular, with ending ''-i'', and in the nominative plural, with ending ''-ir''. The overall spec would look something like {{cd|m,ar,ir.imut}}, indicating that (a) ''i''-mutation applies; (b) the default genitive ending is ''-ar'' instead of default ''-s''; (c) the plural ending is ''-ir'' instead of default ''-ar''.) # The {{cd|imutval:...}} indicator can be used to explicitly specify the vowel used in ''i''-mutation. This is occasionally necessary. For example, {{m|is|sonur}} requires {{cd|imutval:y}} since the default ''i''-mutation of ''o'' is ''e'' not ''y''. =====Reverse i-mutation===== Reverse ''i''-mutation is exactly like normal ''i''-mutation but applies in reverse. This is used to derive the underlying stem from the lemma when the lemma itself has ''i''-mutation applied. Usually this applies to plural-only nouns with ''i''-mutation in the nominative and accusative plural (but not in the dative or genitive plural), but it also applies to {{m|is|ketill||kettle}} and a few related nouns, which have a dative singular without ''i''-mutation (see below). The reverse ''u''-mutation specs are exactly like normal ''i''-mutation specs but are prefixed by {{cd|un}}. Specifically: * {{cd|unimut}} indicates that reverse ''i''-mutation should happen in certain circumstances, which depend on the gender and number. Specifically: (a) masculine nouns have reverse ''i''-mutation in the dative singular and throughout the plural, as with {{m|is|ketill||kettle}} with dative singular ''katli''; (b) feminine nouns have reverse ''i''-mutation in the accusative and dative singular and the dative and genitive plural, as with {{m|is|kýr||cow}} and {{m|is|ær||ewe}}. {{cd|unimut}} is also used with ''i''-mutated plural-only nouns that have some forms (generally the dative and genitive plural) without ''i''-mutation, such as feminine {{m|is|hættur||bedtime, quitting time}}; feminine {{m|is|mætur||appreciation, liking}}; neuter {{m|is|læti||behavior, demeanor}}; and neuter {{m|is|ólæti||noise, racket}}. * {{cd|-unimut}} indicates that reverse ''i''-mutation should not happen. This is normally used in conjunction with {{cd|unimut}}, and especially for hooking a footnote off of {{cd|-unimut}}; see examples below. The specific resulting vowel can be controlled by {{cd|unimutval:...}}. (Here, the vowel specified is the ''resulting'' (non-mutated) vowel, not the source (mutated) vowel. For example, {{m|is|bætur||compensation, benefits}} (plural only) requires {{cd|unimutval:ó}}, as the default reverse ''i''-mutation vowel for ''æ'' is ''á''.) ====Infixing specs==== Infixing specs control the infixing of ''j'' or ''v'' after the stem and before certain endings. You do not need to (and in fact should not) specify an infixing spec when the lemma contains the infix in it, such as {{m|it|kirkja||church}}. As with mutation specs, in some cases more than one infixing spec of a given type can be given, comma-separated. For example, {{cd|-j,j}} indicates that ''j''-infixing either does not or does happen (respectively). See examples below. The infixing specs recognized are: * {{cd|j}} to infix a ''j'' before endings that begin with ''a'' or ''u'' (not counting the lemma, which often has an ending ''-ur''). An example where this is used is {{m|is|egg||blade edge}}, which has genitive singular and nominative plural ''eggjar'', etc. * {{cd|-j}} turns off ''j''-infixing. As mentioned above, this is normally used to indicate optional ''j''-infixing. * {{cd|v}} to infix a ''v'' before endings that begin with ''a'', ''i'' or ''u'' (not counting the lemma, which often has an ending ''-ur''). An example where this is used is {{m|is|söngur||song}}, which has nominative plural ''söngvar'', etc. * {{cd|-v}} turns off ''v''-infixing. As mentioned above, this is normally used to indicate optional ''v''-infixing. ====Contraction specs==== Contraction specs indicate whether ''contraction'' (deletion of a final-syllable ''a'', ''i'' or ''u'' in the stem before a vowel-initial ending) should happen. As with mutation and infixing specs, in some cases more than one contraction spec of a given type can be given, comma-separated. For example, {{cd|-con,con}} indicates that contraction either does not or does happen (respectively). See examples below. Note that contraction is the default is various cirumstances, and you will need to use {{cd|-con}} to turn it off. The contraction specs recognized are: * {{cd|con}} specifies that a final-syllable ''a'', ''i'' or ''u'' in the stem (generally before single final ''r'', ''l'' or ''n'') is deleted before an ending beginning with a vowel. An example is {{m|is|gaffall||fork}}, whose stem ''gaffal-'' contracts to ''gaffl-'' before a vowel-initial ending such as dative singular ''gaffli'', nominative plural ''gafflar'' and dative plural ''göfflum''. (This latter form shows that ''u''-mutation, and for that matter mutations in general, apply after contraction.) Contraction is in fact the default in masculine nouns ending in ''-all'', ''-ill'', ''-ull'', ''-ann'', ''-inn'' and ''-unn'', as well as in masculine and neuter nouns ending in ''-ur'' that is part of the stem. (Final ''-ur'' is part of the stem by default in neuters, and in such a circumstance, ''definite contraction'' is also the default; see below. For masculines, final ''-ur'' is only part of the stem when the {{cd|#}} indicator is given; see [[#Stem specs]] below.) An example of a noun that explicitly needs {{cd|con}} is {{m|is|hamar||hammer}}, with contracted stem ''hamr-'' (dative plural ''hömrum''). * {{cd|-con}} turns off contraction. This is useful when contraction is the default, as described above. Examples where this is needed are {{m|is|kórall||coral}} and {{m|is|kristall||crystal}}, which never have contraction, and {{m|is|rafall||generator}}, which optionally has it (leading to dative plural either ''rafölum'' or ''röflum''). * {{cd|defcon}} turns on ''definite contraction'', which means that contraction also applies not only before a vowel-initial ending but before a vowel-initial definite clitic when the actual ending is null. For example, consider masculine {{m|is|akur||field}} (cognate with {{cog|en|acre}}) and neuter {{m|is|mastur||mast}}. Both have contraction, leading respectively to dative singular ''akri'' and ''mastri''. However, only {{m|is|mastur}} has definite contraction; contrast definite nominative singular ''akurinn'' vs. ''mastrið''. As described above, the presence of definite contraction in neuters in ''-ur'' but not nominatives in ''-ur'' is the default, so in these cases, {{cd|defcon}} doesn't have to be given explicitly. However, it does need to to be given for feminine {{m|is|fjöður||feather}}, which has both regular and definite contraction but where neither is the default; hence {{cd|con.defcon}} needs to be specified. * {{cd|-defcon}} turns off ''definite contraction'', either when it is the default or when used in conjunction with {{cd|defcon}} to indicate a noun that either does or does not have definite contraction. ===Stem specs=== Masculine nouns usually (although not always) have an ending in the lemma form (indefinite nominative singular), and to compute the stem it's necessary to remove the ending. The following default rules are used to compute the stem of masculine nouns: # Nouns in ''-i'' and ''-a'' drop this suffix. # Nouns in ''-ur'' drop this suffix, as long as (a) the noun is not in ''-aur'' and (b) at least one vowel precedes or the term is a suffix (so that e.g. {{m|is|bur||son}} does not drop ''-ur''). # Nouns in ''-ir'' drop this suffix under similar conditions, i.e. as long as (a) the noun is not in ''-eir'' and (b) at least one vowel precedes or the term is a suffix. # Nouns in ''-ár'' and ''-ær'' (but not any other vowel followed by ''-r'') drop the ''-r''. # Nouns in ''-ll'' and ''-nn'' drop the last consonant. # All other nouns use the lemma as the stem. Sometimes these result in incorrect stems. For example, {{m|is|akur||field}} has stem ''akur-'' not ''ak-'' (likewise {{m|is|bifur||beaver}}, {{m|is|blástur||breeze}} and several other terms in ''-ur''); {{m|is|Bergmann}} and certain other names have a stem in ''-nn'' not ''-n''; and contrariwise, terms like {{m|is|sjór||sea}} and {{m|is|gnýr||gnu; boom}} have stems without the final ''-r''. The following indicators are available for these terms: * {{cd|#}} forces the stem to be the same as the lemma. Hence {{m|is|akur}}, {{m|is|bifur}}, {{m|is|Bergmann}}, etc. use {{tl|is-ndecl|m.#}}. * {{cd|##}} forces the stem to not include final ''-r'' or (if present) ''-ur'' of the lemma. Hence {{m|is|gnýr}} uses {{tl|is-ndecl|m,,ir.##.j}} (since it has a nominative plural in ''-ir'' and a ''j''-infix) and {{m|is|sjór}} uses {{tl|is-ndecl|m,s:ar,ir.##}} (since it has genitive singular in either ''-s'' or ''-ar'' and nominative plural in ''-ir''). * {{cd|stem:...}} lets you set the stem arbitrarily. ({{cd|#}} and {{cd|##}} here have the same meaning as when standing alone; hence {{cd|#}} is equivalent to {{cd|stem:#}} and {{cd|##}} is equivalent to {{cd|stem:##}}.) A noun that uses this is {{m|is|Jesús||Jesus}}, with a highly irregular declension: {{demo|<nowiki>{{is-ndecl|m.stem:Jesú.acc-:m[archaic or Biblical].dat+gen-|pagename=Jesús}}</nowiki>}} Here, the stem is set to not include final ''-s'' and overrides are required for all remaining cases. Note that an alternative to setting the stem like this is {{cd|decllemma:...}}, which says to decline the term entirely (except in the lemma form itself) as if the lemma were something else. This is used by e.g. {{m|is|maður||man, human}}, which sets the following: {{demo|<nowiki>{{is-ndecl|m,,^/^ir.decllemma:mannur|pagename=maður}}</nowiki>}} Here, the lemma is declined as if it were ''mannur'' except in the nominative singular, and a nominative plural override supplies the irregular forms ''menn'' and ''mennir''. (Other examples that use {{cd|decllemma:...}} are {{m|is|mær||maiden}}, declined like ''mey'', and feminine plurale tantum noun {{m|is|dyr||door, doorway}}, declined as if it were ''dyrir''.) There are additional indicators to control stems used in certain circumstances, such as in the plural or before a vowel. They are: * {{cd|vstem:...}} lets you override the stem used before vowels. {{m|is|alin||ell {{q|unit of measurement}}}} uses this, since it has contraction plus irregular lengthening of the ''a'' before a vocalic ending: {{demo|<nowiki>{{is-ndecl|f.vstem:áln|pagename=alin}}</nowiki>}} * {{cd|plstem:...}} lets you override the stem used in the plural. {{m|is|eyrir|pos=1/100 of a krona}} uses this, since it has an irregular plural ''aurar'': {{demo|<nowiki>{{is-ndecl|m.plstem:aur|pagename=eyrir}}</nowiki>}} * {{cd|plvstem:...}} lets you override the stem specifically used before vowels in the plural. No terms currently use it but it is provided for completeness. ===Miscellaneous boolean indicators=== The following additional indicators can be specified in particular situations: * {{cd|adj}}: Term is an adjective. If this is specified, it should come first, and it changes the allowed indicators that can occur in the rest of the spec. See [[#Multiword terms]] for more information. * {{cd|indecl}}: Noun is indeclinable. Normally used in the headword, and no declension table is given. Can also be used to indicate mostly-indeclinable terms with overrides to indicate the declined forms. * {{cd|decl?}}: Unknown declension. Normally used in the headword, and no declension table is given. * {{cd|builtin}}: Requests a built-in declension for certain highly irregular words whose declensions are built into the module. Currently, all of these terms are pronouns: {{m|is|ég}}, {{m|is|þú}}, {{m|is|við}}, {{m|is|þið}}, {{m|is|hann}}, {{m|is|hún}}, {{m|is|það}}, {{m|is|þeir}}, {{m|is|þær}}, {{m|is|þau}} and {{m|is|sig}}. * {{cd|rstem}}: Specifies that a masculine or feminine term uses the ''r''-stem declension pattern. Used specifically for the kinship terms {{m|is|faðir}}, {{m|is|móðir}}, {{m|is|bróðir}}, {{m|is|systir}} and {{m|is|dóttir}}. * {{cd|já}}: Specifies that a neuter term in ''-é'' uses the ''já''-declension pattern, i.e. ''-já-'' appear instead of ''-é-'' in certain inflections. * {{cd|weak}}: Specifies that a masculine term in ''-andi'' should be declined as a normal weak noun instead of using the special present participle inflection pattern. Examples are {{m|is|andi||breath}}, {{m|is|landi||populace; fellow countryman}}; {{m|is|samlandi||compatriot}}; and {{m|is|fjandi||devil}} ({{m|is|fjandi||enemy}} ''does'' inflect using the present participle pattern). * {{cd|iending}}: For use with definite-only terms whose clitic starts with an ''i-''; indicates that the lemma ends in an elided ''-i'' instead of a consonant. An example where this is needed is {{m|is|Bandaríkin||the United States}}, which is based on the term {{m|is|ríki}} and which would have an incorrect declension if {{cd|iending}} is not used. * {{cd|linkasis}}: Prevents linking inflected words in multiword expressions to their computed lemma and instead links to the form as given. Useful e.g. for plurale tantum and definite-only nouns occurring in multiword expressions, as the default is to link to the synthesized singular indefinite form. * {{cd|~}}: Link to the lowercase equivalent of the synthesized lemma. Used in multiword expressions; see [[#Multiword terms]] for more information. ===Scraping declensions from elsewhere=== To simplify specifying the declension of compounds of terms declined irregularly, a system of ''scraping'' the declension of another term is provided. Here, "scraping" means looking up the declension of a term found on another page and using it. For example, there are several compounds of {{m|is|kona||woman}}, which is notably irregular in its declension ({{tl|is-ndecl|f.genpl!kvenna}}). Rather than requiring that all of them repeat this declension (adjusted appropriately for the particular compound), the scraping system is provided to do this repetition and adjustment for you. The syntax of a term like {{m|is|eiginkona||wife}} looks like {{tl|is-ndecl|@k}}. The {{cd|@}} sign requests scraping and the following letter or letters identify the suffix of the compound that should be scraped. In this case, the {{cd|@k}} syntax means "find the last ''k'' in the word and use it and everything to its right as the lemma to scrape". (For this reason, all compounds of {{m|is|kona}} will use the same syntax.) This results in the following: {{is-ndecl|@k|pagename=eiginkona}} Note how the title indicates the source lemma for the declension. (If you scrape a lemma that itself scrapes another lemma, this will work and creates a ''scraping chain''. Such chains are only allowed to be 10 deep to avoid accidental infinite recursion.) In some cases just indicating the first letter of the term to scrape won't work because the same letter is also found inside the term. To rectify this, supply more letters. For example, to scrape {{m|is|kirkja||church}} in a lemma like {{m|is|aðalkirkja||main part of a church}}, use {{tl|is-ndecl|@ki}}. If two calls to {{tl|is-ndecl}} exist on the same page (even if they have identical declensions), the above scraping syntax won't work. To rectify this, it is necessary to give each declension an ID and specify the ID when scraping. Specifically, each call to {{tl|is-ndecl}} should include a parameter {{para|id|...}} giving a unique ID to the particular declension (preferably something short, obvious and memorable), and the scraping syntax should specify this ID after the scrape request itself, preceded by a colon. For example, the word {{m|is|maður||man}} has two declensions, a full declension as a noun ({{para|id|noun}}) and a singular-only, indefinite-only declension as a pronoun ({{para|id|pronoun}}). If you attempt to scrape this word in a compound like {{m|is|eiginmaður||husband}} without specifying the appropriate ID, e.g. using {{tl|is-ndecl|@m}}, you get an error: {{is-ndecl|@m|pagename=eiginmaður}} The error tells you that an ID must be specified and lists the possible ID's. Instead you should use {{tl|is-ndecl|@m:noun}}, which produces: {{is-ndecl|@m:noun|pagename=eiginmaður}} Scraping automatically adjusts any indicators that specify full words or parts of words that start from the beginning of the word by prepending the remaining part of the compound to them. For example, in the above example with {{m|is|kona}}, the {{cd|genpl!kvenna}} indicator will be adjusted to {{cd|genpl!eiginkvenna}} for use with {{m|is|eiginkona}}. Other examples of indicators adjusted are {{cd|decllemma}} overrides (e.g. {{cd|decllemma:mannur}} in the declension of {{m|is|maður}}) and stem overrides. The special syntax {{cd|@@}} does ''self-scraping'', i.e. it attempts to scrape the declension of the term itself. This obviously won't work when specifying the declension of a single-word term (it will result in infinite recursion, which will abort with an error message), but it is frequently used in the headword, where {{tl|is-noun}} or {{tl|is-proper noun}} should ''normally'' use self-scraping to fetch the corresponding declension specified using {{tl|is-ndecl}}. It is also frequently found in multiword terms to fetch the declension of individual terms in the expression. See below for more details. Sometimes it is desired to specify a different declension for use when scraping vs. for use in the term itself. An example is {{m|is|köttur||cat}}, which has archaic or literary accusative plural ''köttu'' in addition to normal ''ketti''. It is simultaneously desirable to be able to include this alternative accusative plural form in the declension for {{m|is|köttur}} while not including it in any compounds derived from {{m|is|köttur}}. This is done by specifying the declension to use for lemmas that scrape this declension in the {{para|deriv}} parameter, as follows: {{demo|<nowiki>{{is-ndecl|m,ar,ir.unumut.imut.accpli:u[archaic or literary]|deriv=m,ar,ir.unumut.imut|pagename=köttur}}</nowiki>}} while a term like {{m|is|flækingsköttur||stray cat}} that uses {{tl|is-ndecl|@k}} to scrape the declension of {{m|is|köttur}} will yield {{is-ndecl|@k|pagename=flækingsköttur}} I.e. the archaic or literary ending is mentioned in the base noun {{m|is|köttur}} but not any derived nouns. A couple other things to mention are scraping a capitalized base noun and scraping a suffix. For example, it is desirable for the given name {{m|is|Aðalbjörn}} to scrape the declension of {{m|is|Björn}}, but the latter is not a proper suffix of the former due to the capital letter. In this case, use {{tl|is-ndecl|@B}} as the declension for {{m|is|Aðalbjörn}} and it will automatically scrape {{m|is|Björn}} and adjust the case of any stem, {{cd|decllemma:...}} or full form overrides. A similar situation comes up when scraping a suffix. For example, to have the patronymic {{m|is|Einarsson}} scrape the suffix {{m|is|-son}}, use {{tl|is-ndecl|@-s}}, and it will automatically scrape the declension of {{m|is|-son}} and make appropriate adjustments. You are free to specify other indicators along with the scraping indicator. These override the properties taken from the scraped lemma. As an example, {{m|is|blástur||the act of blowing; breeze, wind}} is declared as {{tl|is-ndecl|m.#.imut}} (which means the stem is ''blástur-'', contracting to ''blástr-'' before vowels, and ''i''-mutation takes place before ''-i'' in the dative singular). This is a singular and plural term; but derived term {{m|is|aðblástur||preaspiration}} is singular-only. Thus it specifies {{tl|is-ndecl|@b.sg}}. In conjunction with this, it should be noted that a proper noun that scrapes a common noun will automatically be singular-only unless the scraped noun explicitly specifies {{cd|both}} to indicate that is has a plural (this is done for example by {{m|is|-son}} so that patronymics that scrape it automatically get a plural). If this is not desired, it must be specified explicitly; e.g. demonyms such as {{m|is|Brasilíumaður||Brazilian (person)}} must specify {{tl|is-ndecl|@m.dem}} to simultaneously scrape {{m|is|maður}} and get treatment as a demonym (equivalent to a common noun). A couple of other examples are {{m|is|andfýla||halitosis, bad breath}}, which scrapes {{m|is|fýla||stench, reek}}, which is a plural; {{m|is|andfýla}} also has a plural per BÍN but it is very rare. To indicate this with a footnote, use {{tl|is-ndecl|@f.addnote[.*_p][very rare]}}. ===Footnotes=== As shown in various examples above, you can attach footnotes to many of the indicators. Footnotes are specified in square brackets following a given indicator and should be written with an initial lowercase letter and without a final period/full stop, as in {{cd|[rare]}} or {{cd|[only in set phrases]}}. You can include multiple footnotes after a single indicator using multiple sets of square brackets, e.g. {{cd|[rare][only in set phrases]}}, although this is not common. Footnotes are automatically numbered in the order they are processed in the table (which generally processes left-to-right and then up-and-down), and duplicative footnotes are deduplicated, e.g. if multiple terms are identified as {{cd|[rare]}}, there will only be a single footnote found in the footnote section at the bottom of the table, with a single associated number. Footnotes at the bottom of the table are automatically converted into sentence form, i.e. the first word is capitalized and the whole footnote followed by a period/full stop ({{cd|.}}). The same footnotes may also appear as qualifiers on inflections specified in the headword, and in that case they remain as-is (which is why it is important to give them lowercase and without any final period/full stop). The following indicators take footnotes: * All overrides, both those specified directly after the gender and separate, arbitrary form overrides. * All control specs (mutation/infixing/contraction specs). * Footnotes can also appear as an indicator by themselves; this applies the footnote to every form. (This is chiefly useful when alternant specs are present; see [[#Alternant specs]] below.) * Finally, footnotes can be added to arbitrary forms using the {{cd|addnote}} indicator, which takes the form {{cd|addnote[SPEC][FOOTNOTE][FOOTNOTE]...}}. Here, {{cd|SPEC}} is either a single slot name, a Lua pattern matching multiple slot names (anchored on both ends), or a comma-separated list of either. The slot names here are of the form e.g. {{cd|ind_dat_s}} for the indefinite dative singular and {{cd|def_gen_p}} for the definite genitive plural. The most useful and common Lua patterns to use are {{cd|.*_s}}, which matches all singular slots, and {{cd|.*_p}}, which matches all plural slots. For example, the word {{m|is|kæla||coolness}} is found in the plural, but rarely; this can be indicated using {{tl|is-ndecl|f.addnote[.*_p][rare]}} to add a footnote {{cd|[rare]}} to all plural slots. ===Alternant specs=== The ''alternant spec'' syntax lets you specify two or more different declensions for a given term. Some variations in declension can be handled by [[#Control specs|control specs]] (which allow multiple comma-separated values to be given) or by overrides, but not all variations can be handled this way. For example, {{m|is|akkur||benefit, advantage}} can either be declined with stem ''akkur-'' (contracting to ''akkr-'' before vowels) or with stem ''akk-''. Since only a single stem can be specified, there is no easy way to include both variants in a single table except for using an alternant spec. The syntax is as follows: {{tl|is-ndecl|((SPEC1,SPEC2,...))}} i.e. comma-separated specs enclosed in double parentheses. Each spec can actually be a multiword expression (see [[#Multiword terms]] below) or a simple spec. In this case, the following suffices: {{demo|<nowiki>{{is-ndecl|((m.#.sg,m.sg.dati/i))|pagename=akkur}}</nowiki>}} The first spec {{cd|m.#.sg}} specifies a masculine, singular-only term whose stem includes the ''-ur'' ending (the {{cd|#}} indicator). The second spec {{cd|m.sg.dati/i}} is similar but omits the {{cd|#}} indicator, which results in a stem ''akk-'' instead of ''akkur-''. (In the second case, a dative override must be given; see the section [[#Default dative singular for masculine nouns]] above for why.) Another example is {{m|is|hringur||ring}}, which has different plurals depending on meaning: plural in ''-ir'' with ''j''-infixing in the plural for all kinds of non-jewelry rings, circles, etc., but plural in ''-ar'' without ''j''-infixing for jewelry rings. To indicate this, use the following: {{demo|<nowiki>{{is-ndecl|((<m,,ir[usually for non-jewelry].j>,<m,,ar[usually for jewelry].dat->))|pagename=hringur}}</nowiki>}} Here, because the individual specs include commas in them, it is necessary to enclose the specs in angle brackets to avoid the commas embedded in the specs from being interpreted as top-level spec separators. (As a general rule you can always enclose an inflection spec in angle brackets and also include the lemma directly before the angle brackets; both are routinely done in multiword expressions, as described in the [[#Multiword terms]] section below.) Finally, the following example for {{m|is|spónn||chip; veneer; spoon}} shows the use of an alternant-level footnote (see [[#Footnotes]] above): {{demo|<nowiki>{{is-ndecl|((<m,s:ar[dated],ir.imut.dati>,<m.[proscribed].dati>))|pagename=spónn}}</nowiki>}} The second alternant lacks ''i''-mutation in the dative singular and nominative/accusative plural, and is proscribed. The footnote ''proscribed'' will appear on all forms that are different between the two alternants, but not on any that are the same. (This is the default for how deduplication of forms works when the forms to be deduplicated differ in their footnotes. This can be changed by adding a ''footnote modifier'' at the beginning of one of the footnotes, as follows: (a) if a footnote on the ''second'' form being deduplicated begins with {{cd|!}} or {{cd|+}}, that footnote will be added to the footnotes, if any, of the first form rather than being discarded; (b) if a footnote on the ''first'' form being deduplicated begins with {{cd|*}}, that footnote will be dropped if the second form has any footnotes, a sort of XOR behavior.) ===Multiword terms=== Multiword terms have their own syntax and considerations. The general syntax is to repeat the lemma, placing angle brackets after each lemma needing inflection and putting a standard inflection spec inside of angle brackets. For example, for {{m|is|bland í poka||candy mix in a bag; {{q|figurative}} grab bag, assortment}}, use: {{demo|<nowiki>{{is-ndecl|bland<n.sg> [[í]] [[poki|poka]]}}</nowiki>}} Alternatively and preferably, use scraping to pick up the noun declensions automatically: {{demo|<nowiki>{{is-ndecl|bland<@@> [[í]] [[poki|poka]]}}</nowiki>}} It is not usually necessary to link terms with associated angle-bracket inflections; that happens automatically. An example with two inflected terms is {{m|is|afturbeygð sögn||reflexive verb}}, which should be specified as follows: {{demo|<nowiki>{{is-ndecl|afturbeygð<adj> sögn<@@>}}</nowiki>}} The {{cd|adj}} indicator specifies that the first term is an adjective and should be inflected accordingly, and the {{cd|@@}} indicator on {{m|is|sögn}} automatically fetches the inflection of that word. The code is smart enough to propagate the feminine gender of {{m|is|sögn}} to the adjective and only use the feminine inflections of the adjective when constructing the combined inflection. It also knows that the lemma is {{m|is|afturbeygður||reflexive}}, and will appropriately link the term in the {{tl|is-noun}} headword call, as follows: {{demo|<nowiki>{{is-noun|afturbeygð<adj> sögn<@@>}}</nowiki>}} In most cases, masculine and feminine adjective forms (strong or weak), as well as weak neuter adjective forms, need only the {{cd|adj}} indicator. Strong masculine adjective forms are used directly as the lemma while other adjective forms derive the lemma as follows: # Drop any weak ending to get the stem. # Then, if the ends in ''-nn'' or ''-ll'', add ''-ur''. # Else, if the stem ends in ''-in'' (if it's an adjective form), or any of ''-al/-ul/-il'' or ''-an/-in/-un'' (if it's a noun form) [excluding special cases like ''-ein'' and ''-aul''], add ''-ur''. The logic here is that doubling the last letter (as in the next step) would result in a term that contracts, which might result give incorrect results. # Else, if the stem ends in ''-n'' or ''-l'' preceded by a vowel, double the last consonant. # Else, if the stem ends in ''-n'' or ''-l'' (preceded by a consonant) or in ''-r'' or ''-s'', leave it as-is. # Else, if the stem ends in a vowel, add ''-r''. # Else, add ''-ur''. This correctly produces the lemma in most cases, but not all. Those remaining cases need additional help; see below. All strong neuter adjective forms, as well as other forms where the above rules fail, need help to derive the correct lemma. Generally, this is done in one of two ways: (a) a ''slash substitution spec'', which changes the last few letters of the form; or (b) a ''full lemma spec'', which directly specifies the lemma. Slash substitution specs are more common and come in two varieties: ''one-part'' and ''two-part''. An example of a one-part slash substitution spec is {{cd|tvöfalt<adj/dur>}}, which says to remove the last letter from the neuter adjective form and add ''-dur'' in order to form the lemma {{m|is|tvöfaldur||double}}. This might be used in a term such as {{m|is|tvöfalt vaff||double-u|lit=double v}}, which would use: {{demo|<nowiki>{{is-ndecl|tvöfalt<adj/dur> vaff<@@>}}</nowiki>}} The number of letters removed from the end in a one-part substitution spec depends on the gender, number and state of the adjective form, specifically: # Weak forms remove one letter. # Strong neuter singular forms remove one letter. # Strong feminine singular and neuter plural forms remove no letters. # Strong masculine and feminine plural forms remove two letters. If this isn't sufficient, use a two-part substitution spec, as for {{m|is||ryðfrítt}}, the strong neuter singular form of {{m|is|ryðfrír||stainless|lit=rust-free}}. This type of spec explicitly gives the letters to remove as well as their replacement, as follows: {{demo|<nowiki>{{is-ndecl|ryðfrítt<adj/tt/r.##> stál<@@.sg>}}</nowiki>}} Here, we use a two-part slash substitution spec to replace ''-tt'' with ''-r'', along with the stem control indicator {{cd|##}} (specifying that the stem of {{m|is|ryðfrír}} is ''ryðfrí-'' without the ''-r''). Finally, for highly irregular adjective forms, it may be easiest to specify the lemma outright. An example of this is {{m|is|tvö pör||two pair {{q|in poker}}}}, which uses the following: {{demo|<nowiki>{{is-ndecl|tvö<adj:tveir.builtin> pör<n.pl.indef>}}</nowiki>}} Note the colon following the {{cd|adj}} indicator; this is used to specify the lemma directly. Along with this, the {{cd|builtin}} indicator is used to request the special built-in declension of {{m|is|tvö}}, which the adjective module [[Module:is-adjective]] knows how to inflect. For neuter plurals like {{m|is||pör}}, {{cd|unumut}} is the default, so it correctly generates the genitive plural {{m|is||para}} and the lemma {{m|is|par}} in the associated call to {{tl|is-noun}}, as can be seen by invoking it: {{demo|<nowiki>{{is-noun|tvö<adj:tveir.builtin> pör<n.pl.indef>}}</nowiki>}} If the adjective you are inflecting is a comparative, you need to specify this using the {{cd|iscomp}} indicator; otherwise, it will wrongly be declined as a regular weak adjective. An example of this is {{m|is|eldri borgari||senior citzen}}: {{demo|<nowiki>{{is-ndecl|[[gamall|eldri]]<adj.iscomp> borgari<@@>}}</nowiki>}} This, incidentally, is one of the cases where it is necessary to explicitly link the adjective lemma. (The alternative would be to specify {{cd|adj:gamall}} along with an explicit adjective comparative spec to map back to {{m|is||eldri}}, something like {{cd|eldri<adj:gamall.comp:eldri.iscomp>}}, which is more work and in fact not even supported currently.) Some other examples where explicit linking of adjectives is needed: * Superlatives, including but not limited to those that lack a positive form, such as {{m|is|hæstiréttur||high court, supreme court}}, which require a spec like {{tl|is-ndecl|<nowiki>[[há|hæsti]]<adj>réttur<@@></nowiki>}}; and {{m|is|efsta stig||superlative degree}}, which requires a spec like {{tl|is-ndecl|<nowiki>[[efri|efsta]]<adj> stig<@@></nowiki>}}. (The rules above would construct lemmas ''hæstur'' and ''efstur'' respectively, which are fine for declining the weak adjective forms, but insufficient for correct linking in the headword.) * Weak adjectives in general, especially when the adjective is derived through a special, non-default process such as contraction or ''j''-infixing, as with {{m|is|gamla settið||one's parents {{q|humorous}}|lit=the old set}}, which could use {{tl|is-ndecl|<nowiki>[[gamall|gamla]]<adj> settið<n.def.sg></nowiki>}}; {{m|is|litlifingur||little finger}}, which could use {{tl|is-ndecl|<nowiki>[[lítill|litli]]<adj>fingur<@@></nowiki>}}; {{m|is|Nýja-Jórvík||New York}}, which could use {{tl|is-ndecl|<nowiki>[[nýr|Nýja]]<adj>-Jórvík<@@></nowiki>}}; and {{m|is|þriðja persóna}}, which could use {{tl|is-ndecl|<nowiki>[[þriðji|þriðja]]<adj> persóna<@@.sg></nowiki>}} (here the adjective is weak-only and the default rules would construct a strong adjective lemma ''þriðjur''). One more thing to note is the {{cd|~}} indicator, which is used with a capitalized adjective or noun form and says to lowercase the term when linking. Examples of its use are in {{m|is|Írska lýðveldið||the Irish Republic}}, which would use {{tl|is-ndecl|Írska<adj.~> lýðveldið<n.def.iending.proper>}} to ensure that ''Írska'' is linked to {{m|is|írskur||Irish}} and not the capitalized equivalent, and {{m|is|Þriðja Ríkið||the Third Reich}}, which would use {{tl|is-ndecl|<nowiki>[[þriðji|Þriðja]]<adj> Ríkið<n.sg.def.iending.~></nowiki>}} to ensure that ''Ríkið'' links to {{m|is|ríki||kingdom, realm, empire, sovereign state}}. <includeonly> [[ကဏ္ဍ:ထာမ်ပလိက်အာက်သလာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမ်ဂမၠိုၚ်]] </includeonly> m15knkqz0zil1kbn46e1msr4kjxzu6w il 0 299291 402115 2026-09-28T09:20:38Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{also|Appendix:ဗီုပြၚ်နာနာသာ်မဆေၚ်စပ်ကဵု "il"}} ==မအရေဝ်ပံၚ်ကောံ== ===ပွံၚ်နဲတၞဟ်=== * {{alter|mul|IL|XLIX|xlix}} ===ဂၞန်သၚ်္ချာ=== {{head|mul|numeral|sc=Latn}} # ဂၞန်သၚ်္ချာရုဝ်မာန်မွဲသာ်ပွမသ္ပစၞးပန်စှော်ဒ္..." 402115 wikitext text/x-wiki {{also|Appendix:ဗီုပြၚ်နာနာသာ်မဆေၚ်စပ်ကဵု "il"}} ==မအရေဝ်ပံၚ်ကောံ== ===ပွံၚ်နဲတၞဟ်=== * {{alter|mul|IL|XLIX|xlix}} ===ဂၞန်သၚ်္ချာ=== {{head|mul|numeral|sc=Latn}} # ဂၞန်သၚ်္ချာရုဝ်မာန်မွဲသာ်ပွမသ္ပစၞးပန်စှော်ဒ္စိတ် ({{l|mul|49}})။ ==အာကာတေက်== ===နိရုတ်=== {{dercat|knj|myn-pro|inh=1}} ဝေါဟာကၠုၚ်နူ {{inh|knj|myn-pro|*il-}} ===ဗွဟ်ရမ္သာၚ်=== * {{IPA|knj|/ʔil/}} ===ကြိယာ=== {{head|knj|verb}} # သကဵုဗဵု၊ သကဵုကျဝ်၊ မရံၚ်အပ္ဍဲ။ ==အာန်တဳဂွါ ကဵု အၚ်္ဂလိက် ဗါၜူဒါ ခရဳအတ်လ်== ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|aig|en|hill}} ===နာမ်=== {{aig-noun}} # ကုန်။ ==အေက်သတဝ်ရေန်== ===ပစ္စဲ=== {{head|ast|ပစ္စဲ|g=m-s|ဣတ္တိလိၚ်|a|နပုလ္လိၚ်|u|ကိုန်ဗဟုဝစ်ပုလ္လိၚ်|us|ကိုန်ဗဟုဝစ်ဣတ္တိလိၚ်|as}} # {{alt form|ast|el}} ==အာက်သေတ်ဗါဲဇြေနဳ== {{az-variant|ил|a-cls=ایل|a-n=ایل}} ===နိရုတ်=== {{inh+|az|trk-oat|یل|tr=yıl}}၊ နူကဵုဝေါဟာ {{inh|az|trk-pro|*yïl}} ===ဗွဟ်ရမ္သာၚ်=== * {{audio|az|LL-Q9292 (aze)-Azerbaijani audiorecordings-il.wav|a=Baku}} * {{audio|az|LL-Q9292 (aze)-Firuze Nesibli-an.wav}} ===နာမ်=== {{az-noun}} # သၞာံ။ #: {{syn|az|sənə|sal|am}} ====လဟုတ်စှ်ေ==== {{az-decl-noun|i|c}} ==ဗူနာတ်== ===နာမ်=== {{head|bfn|noun}} # ဍာ်။ ==ဒိန်နေတ်== ===နာမ်=== {{head|da|noun|g=c}} # ခရက်၊ ပရှ်။ ===ကြိယာ=== {{head|da|verb form}} # {{infl of|da|ile||imp}} ==အေတ်ဗေါတ်ကရာတ်ဃှေတ် မာယာန်== ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|emy|myn-pro|*il-}} ===ကြိယာ=== {{head|emy|verb}} # သကဵုဗဵု။ ==ဖာရဝ်သဳ== [[File:Barefeet Soles.jpg|thumb|{{lang|fo|iljar}}]] ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|fo|non|il}} ===နာမ်=== {{fo-noun|f|iljar|iljar}} # မဆေၚ်စပ်ကဵုဂတာဇိုၚ်။ {{fo-decl-noun-f8|il}} ==ဖပြၚ်ဂဝ်-ဖရဝ်ပေါန်သာဝ်== ===နိရုတ်=== {{inh+|frp|la-lat|illī}} ကဵု {{inh|frp|la|ille}} ===သဗ္ဗနာမ်=== {{head|frp|pronoun|postpositive|-il|g=m}} {{tlb|frp|orbl}} # ညး၊ ဍေံ။ # ဏံ၊ ဂှ်။ #: {{syn|frp|o}} ==ပြၚ်သေတ်== {{wikidata lexeme|L9257}} ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|fr|frm|il}}၊ နူကဵုဝေါဟာ {{inh|fr|fro|il}}၊ နကဵုအဆက်ဝေါဟာ {{inh|fr|la-lat|illī}} ===ဗွဟ်ရမ္သာၚ်=== * {{fr-IPA}} {{IPA|fr|q1=informal|/i/}} * {{IPA|fr|q1=preconsonantal|/i/|q2=prevocalic|/j/|a=Quebec,informal}} * {{audio|fr|Fr-il.ogg}} * {{audio|fr|LL-Q150 (fra)-DSwissK-il.wav|a=<<Switzerland>> (<<Valais>>)}} * {{audio|fr|LL-Q150 (fra)-Lepticed7-il.wav|a=<<France>> (<<Toulouse>>)}} * {{audio|fr|LL-Q150 (fra)-LoquaxFR-il.wav|a=<<France>> (<<Vosges>>)}} * {{audio|fr|LL-Q150 (fra)-Mecanautes-il.wav|a=France}} * {{audio|fr|LL-Q150 (fra)-Opsylac-il.wav|a=<<France>> (<<Grenoble>>)}} * {{audio|fr|LL-Q150 (fra)-Penegal-il.wav|a=<<France>> (<<Vosges>>)}} * {{audio|fr|LL-Q150 (fra)-Poslovitch-il.wav|a=<<France>> (<<Vosges>>)}} * {{audio|fr|LL-Q150 (fra)-T. Le Berre-il.wav|a=<<France>> (<<Hérault>>)}} * {{audio|fr|LL-Q150 (fra)-Touam-il.wav|a=<<France>> (<<Saint-Étienne>>)}} * {{audio|fr|LL-Q150 (fra)-WikiLucas00-il.wav|a=<<France>> (<<Lyon>>)}} * {{audio|fr|LL-Q150 (fra)-X-Javier-il.wav|a=<<France>> (<<Massy>>)}} * {{homophones|fr|ils|île|îles|y|Ille}} * {{rhymes|fr|il|s=1}} ===သဗ္ဗနာမ်=== {{head|fr|pronoun|g=m|ကိုန်ဨကဝုစ်ပူဂဵု-တတိယ||ကိုန်ဗဟုဝစ်|ils|ဗပေၚ်စုတ်|le|ပြကမ္မကာရက|lui|မသ္ပဇြိုဟ်နက်|lui|နာမ်မုက်ထ္ၜးတၠဒြပ်|son}} # ညး၊ ဍေံ။ # ဏံ၊ ဂှ်။ ===မဒုၚ်လွဳစ=== * {{desc|gcr|i}} ==ပရိဥူလဳယာန်== ===ပွံၚ်နဲတၞဟ်=== * {{alt|fur|al||Western and Southern Friulian}} * {{alt|fur|el||Northern Friulian}} ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|fur|la|illum}} ===ပစ္စဲ=== {{head|fur|ပစ္စဲ|g=m-s|ကိုန်ဗဟုဝစ်|i}} # နကဵု၊ ဆေၚ်စပ်။ ====ပရေၚ်ကၠောံ==== {{fur-definite articles}} ==ဟေဲယှေန် ခရေဝ်အဝ်လ်== ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|ht|fr|île}} ===ဗွဟ်ရမ္သာၚ်=== * {{IPA|ht|/il/}} ===နာမ်=== {{head|ht|noun}} # တ္ကံ။ ==အာက်သလာန်== [[File:Soles2 zps1c20deea.jpg~original.jpg|thumb|{{m|is|il|Iljar|soles}}.]] ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|is|non|il}}၊ နူကဵုဝေါဟာ {{inh|is|gem-pro|*iljō}} ===ဗွဟ်ရမ္သာၚ်=== * {{is-IPA}} * {{rhymes|is|ɪːl|s=1}} ===နာမ်=== {{is-noun|@@}} # မဆေၚ်စပ်ကဵုဂတာဇိုၚ်။ ====လဟုတ်စှ်ေ==== {{is-ndecl|f,,jar.j}} ==ဣဒဝ်== ===ဗွဟ်ရမ္သာၚ်=== * {{IPA|io|/il/}} ===သဗ္ဗနာမ်=== {{head|io|pronoun|ကိုန်ဗဟုဝစ်|ili|ပၟိက်သၟိက်မိက်ဂွံပိုၚ်ပြဳ|ilua|ပၟိက်သၟိက်မိက်ဂွံပိုၚ်ပြဳကိုန်ဗဟုဝစ်|ilui}} # {{apocopic form of|io|ilu}} ညး၊ ဍေံ။ ==အေန်တာလိၚ်္ဂဝ်== ===သဗ္ဗနာမ်=== {{head|ia|pronoun}} # {{non-gloss|သဗ္ဗနာမ်ဆေၚ်စပ်ကဵုပူဂဵုမရပ်စပ်မၞုံကဵုအပြံၚ်အလှာဲကြိယာဂမၠိုၚ်}}။ ==အာဲယျာလာန်== ===နိရုတ်=== {{root|ga|ine-pro|*pelh₁-}} ဝေါဟာကၠုၚ်နူ {{inh|ga|sga|il}}၊ နကဵုအဆက်နူ {{inh|ga|cel-pro|*ɸilus}}၊ နကဵုမဆေၚ်စပ်ကဵုနူ {{inh|ga|ine-pro|*pélh₁us}}၊ နူအဆက်နကဵု {{der|ga|ine-pro|*pelh₁-}} ====နာမဝိသေသန==== {{ga-adj|gsm=~|gsf=~e|pl=~e|comp=~e}} # {{lb|ga|literary}} မဂၠိုၚ်။ ====နာမဝိသေသန ၂ ==== {{ga-adj|gsm=~|gsf=~e|pl=~e|comp=~e|var=1}} # {{alternative form of|ga|oll}} ====လဟုတ်စှ်ေ==== {{ga-decl-adj||il|gsf=~e|pl=~e}} ==အဳတလဳ== ===ဗွဟ်ရမ္သာၚ်=== {{it-pr|il<audio:LL-Q652 (ita)-Happypheasant-il.wav><rhyme:->}} ===ပစ္စဲ=== {{head|it|ပစ္စဲ|g=m-s|ကိုန်ဗဟုဝစ်|i|ဣတ္တိလိၚ်|la}} # နကဵု၊ ဆေၚ်စပ်။ #: {{alti|it|lo|l'}} ====လဟုတ်စှ်ေ==== {{it-definite articles}} ===ပွံၚ်နဲတၞဟ်=== * {{alt|it|er||regional|Pisa|Lucca|Rome}} * {{alt|it|el||archaic|or|regional|Rome}} * {{alt|it|i'||Tuscan}} * {{alt|it|'l||archaic|or|pronunciation spelling}} ===သဗ္ဗနာမ်=== {{head|it|personal pronoun|g=m-s}} {{tlb|it|obsolete}} # {{alt of|it|lo|from=Tuscan}} ==ပြၚ်သေတ်လဒေါဝ်== ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|frm|fro|il}} ===သဗ္ဗနာမ်=== {{head|frm|pronoun|g=m}} # ညး၊ ဍေံ။ # ဏံ၊ ဂှ်။ ===မဒုၚ်လွဳစ=== * {{desc|fr|il}} ==နဝ်ဝေ ဗော်ခ်မဝ်== ===နာမ်=== {{nb-noun-c}} # မဆေၚ်စပ်ကဵုဂတာဇိုၚ်။ #: {{syn|nb|fotsåle}} ==နဝ်ဝေ နဳနိုတ်== ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|nn|non|il|g=f}}၊ နူကဵုဝေါဟာ {{der|nn|gem-pro|*iljō|g=f}}, {{m|gem-pro|*ili|g=n}} ===နာမ်=== {{nn-noun-f1}} # မဆေၚ်စပ်ကဵုဂတာဇိုၚ်၊ ဗွဲတၟေၚ်မဆေၚ်စပ်ကဵုဒကုတ်လဒေါဝ်။ #: {{syn|nn|fotsole}} ====ပရေၚ်ကၠောံ==== {{nn-noun-infl |Aasen1=Il |Aasen2=''Ili'' |Aasen3=''Iljar'' |Aasen4=''Iljarna'' |1901d=''iljarne'' (''iljane'') |1917b=ila, ''ili'' |1917d=''iljane'' |1938b=ila [''ili''] |1959c=''iljar'' [iler] |1959d=''iljane'' [ilene] |2012a=il |2012b=ila |2012c=iler |2012d=ilene |notes=<small>ညံၚ်ရဴ ''il''၊ ဗဵုရံၚ် {{m|nn|fet}} ကဵု {{m|nn|hes}}တဏအ်ညိကီု။</small> }} ==နူဇြေတ်ခ်== ===ဗွဟ်ရမ္သာၚ်=== * {{IPA|blc|/ʔil/}} ===တံရိုဟ်=== {{head|blc|root}} # သကဵုတတ်အာ၊ တတ်ၜက်အာ ဝါ အရာမွဲမွဲလ္ပာ်နာနာသာ်။ ==အၚ်္ဂလိက်တြေံ== ===နာမ်=== {{ang-noun|m|head=īl}} # {{alternative form of|ang|iġil}} ==ပြၚ်သေတ်တြေံ== ===နိရုတ်=== {{inh+|fro|la-lat|illī}} ===သဗ္ဗနာမ်=== {{head|fro|pronoun|g=m-s|ဣတ္တိလိၚ်|ele}} # ညး၊ ဍေံ။ ===မဒုၚ်လွဳစ=== * {{desctree|frm|il}} ===နိရုတ် ၂ === {{inh+|fro|la|illī}} ===ပွံၚ်နဲတၞဟ်=== * {{l|fro|ils}} {{q|late, analogical}} ===သဗ္ဗနာမ်=== {{head|fro|pronoun|g=m-p|ဣတ္တိလိၚ်|eles}} # ညးတံ၊ ဍေံတံ။ ===မဒုၚ်လွဳစ=== * {{desc|frm|ils}} ** {{desc|fr|ils}} ==အာဲယျာလာန်တြေံ== ===ပွံၚ်နဲတၞဟ်=== * {{alter|sga|hil}} ===နိရုတ်=== {{root|sga|ine-pro|*pelh₁-}} ဝေါဟာကၠုၚ်နူ {{inh|sga|cel-pro|*ɸelus}}၊ နူအဆက်နကဵု {{inh|sga|ine-pro|*pélh₁us}}၊ မဆက်ဆေန်နူ {{der|sga|ine-pro|*pelh₁-}} ===ဗွဟ်ရမ္သာၚ်=== * {{sga-IPA|i0l}} ====နာမဝိသေသန==== {{sga-adj|eq=lir|comp=lia}} # ဗွဲ၊ ဂၠိုၚ်။ ===မဒုၚ်လွဳစ=== * {{desc|ga|il|id=many}} * {{desc|gv|yl|id=many}} ==နဳနိုတ်တြေံ== ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|non|gem-pro|*iljō}} ===နာမ်=== {{non-noun|f|iljar|iljar}} # မဆေၚ်စပ်ကဵုဂတာဇိုၚ်။ ====လဟုတ်စှ်ေ==== {{non-decl-f-jo|il}} ===မဒုၚ်လွဳစ=== * {{desc|is|il}} * {{desc|fo|il}} * {{desc|nn|il}} * {{desc|nb|il}} * {{desc|gmq-osw|il}} ==သဝ်မာလဳ== [[File:Chartreuse eye color (human).jpg|thumb|Íl.]] ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{der|so|cus-pro|*ʔil-}} ===ဗွဟ်ရမ္သာၚ်=== *{{IPA|so|/ˈʔɪ́l/}} *{{hyph|so|il}} ===နာမ်=== {{so-noun|g=f|head=íl|pl=indho|gpl=m}} # မတ်။ ====ပရေၚ်ကၠောံ==== {{so-decl|singular|íl|ili|iléed|ilyahay}} ==သွဳဒေန်== ===ဗွဟ်ရမ္သာၚ်=== * {{IPA|sv|/iːl/}} * {{rhymes|sv|iːl|s=1}} ===နိရုတ်=== {{inh+|sv|gmq-osw|īl}} ===နာမ်=== {{sv-noun|c}} # ကျာလဗိုတ်မလၟိုတ်ဏာခြုဟ်မွဲလစုတ်ဓဝ်၊ ဇြဟတ်ထတ်၊ အာမွဲအသိၚ်လွာဲဂှ်နကဵုကျာ။ # {{syn of|sv|ilning}} ====လဟုတ်စှ်ေ==== {{sv-infl-noun-c-ar}} ===နာမ်=== {{sv-noun|c}} # မခရေက်ခဗေက်။ =====လဟုတ်စှ်ေ===== {{sv-infl-noun-c-ar}} ==တူရကဳ== ===နိရုတ်=== ဝေါဟာကၠုၚ်နူ {{inh|tr|ota|ایل|tr=il}}၊ နူကဵုဝေါဟာ {{inh|tr|trk-pro|*ēl}} {{doublet|tr|el}}. ===ဗွဟ်ရမ္သာၚ်=== * {{IPA|tr|/il/}} ===နာမ်=== {{tr-noun|i|ler}} # ဗၞဳရး။ ====လဟုတ်စှ်ေ==== {{tr-infl-noun-c|i}} ==ဇြတ်ဇြဳလ်== ===ပွံၚ်နဲတၞဟ်=== * {{alter|tzo|ʼil}} ===ဗွဟ်ရမ္သာၚ်=== * {{IPA|tzo|/ʔil/}} ===ကြိယာ=== {{head|tzo|verb}} # သကဵုဗဵု။ ==ယူခေန်ထေတ် မာယျာန်== ===ကြိယာ=== {{yua-verb|t}} # သကဵုဗဵု။ # သကဵုကျဝ်။ ====သမ္ဗန္ဓ==== {{yua-conj-t|v=w}} 6y5njymex7n409vjtehi4j0h343lyu2 ထာမ်ပလိက်:abbr 10 299292 402116 2026-09-28T09:22:48Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "<abbr {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} title="{{#tag:nowiki|{{#invoke:string/templates|replace|{{{2|<noinclude>abbreviation</noinclude>}}}|"|&quot;}}}}">{{#switch: {{{3|}}} | i | IPA = {{IPA|{{{1|}}}}} | {{{1|<noinclude>abbr.</noinclude>}}} }}</abbr><noinclude> {{documentation}} </noinclude>" 402116 wikitext text/x-wiki <abbr {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} title="{{#tag:nowiki|{{#invoke:string/templates|replace|{{{2|<noinclude>abbreviation</noinclude>}}}|"|&quot;}}}}">{{#switch: {{{3|}}} | i | IPA = {{IPA|{{{1|}}}}} | {{{1|<noinclude>abbr.</noinclude>}}} }}</abbr><noinclude> {{documentation}} </noinclude> 3vqtb15xnoyrtkmui6d4b87io2xdfs9 ထာမ်ပလိက်:abbr/documentation 10 299293 402117 2026-09-28T09:24:30Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{documentation subpage}} ''See'' '''[[w:Template:abbr|Template:abbr]]''' ''at Wikipedia for details.'' <includeonly> [[ကဏ္ဍ:ထာမ်ပလိက်ဗီုပြၚ်လိက်အစဳအဇန်ဂမၠိုၚ်]] </includeonly>" 402117 wikitext text/x-wiki {{documentation subpage}} ''See'' '''[[w:Template:abbr|Template:abbr]]''' ''at Wikipedia for details.'' <includeonly> [[ကဏ္ဍ:ထာမ်ပလိက်ဗီုပြၚ်လိက်အစဳအဇန်ဂမၠိုၚ်]] </includeonly> q78773uqj9ikqrudbsj1zxdec97d8kc ကဏ္ဍ:တံရိုဟ်နူဇြေတ်ခ်ဂမၠိုၚ် 14 299294 402118 2026-09-28T09:30:09Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ဘာသာနူဇြေတ်ခ်]]" 402118 wikitext text/x-wiki [[ကဏ္ဍ:ဘာသာနူဇြေတ်ခ်]] n4p1h3oewrhtsfrgz972i64zmy8315d ကဏ္ဍ:နာမ်ဗူနာတ်ဂမၠိုၚ် 14 299295 402119 2026-09-28T09:32:38Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဗူနာတ်|ဗူနာတ်]] » :ကဏ္ဍ:ဝေါဟ..." 402119 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဗူနာတ်|ဗူနာတ်]] » [[:ကဏ္ဍ:ဝေါဟာအဓိကဗူနာတ်ဂမၠိုၚ်|ဝေါဟာတံသ္ဇိုၚ်]] » '''နာမ်ဂမၠိုၚ်''' :ဝေါဟာဗူနာတ်ပွမစၞောန်ထ္ၜးပူဂဵုအတေံ၊ မက္တဵုဒှ်ဂမၠိုၚ်၊ ဌာန်ဒတန်ဂမၠိုၚ်၊ ဥပပါတ်ဂမၠိုၚ်၊ ကဆံၚ်ဂုန်သတ္တိ ဝါ ကိုန်စဳရေၚ်ဂမၠိုၚ်။ [[ကဏ္ဍ:ဘာသာဗူနာတ်]][[ကဏ္ဍ:နာမ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဗ]] b4n7uih01n4czkes16z3xqonulyl1rh ကဏ္ဍ:ဘာသာဗူနာတ် 14 299296 402120 2026-09-28T09:33:58Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:အရေဝ်ဘာသာ|ဗ]][[ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|ဗ]]" 402120 wikitext text/x-wiki [[ကဏ္ဍ:အရေဝ်ဘာသာ|ဗ]][[ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|ဗ]] 7qbcqeqgirrjqw1wmd6fak9o11lzez8 ကဏ္ဍ:ဝေါဟာအဓိကဗူနာတ်ဂမၠိုၚ် 14 299297 402121 2026-09-28T09:35:22Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဗူနာတ်|ဗူနာတ်]] » '''ဝေါဟာတံသ..." 402121 wikitext text/x-wiki [[:ကဏ္ဍ:ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်|ဒၞာဲလုပ်အဝေါၚ်ကဵုပၟိက်]] » [[:ကဏ္ဍ:အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်|အရေဝ်ဘာသာအိုတ်သီုဂမၠိုၚ်]] » [[:ကဏ္ဍ:ဘာသာဗူနာတ်|ဗူနာတ်]] » '''ဝေါဟာတံသ္ဇိုၚ်ဂမၠိုၚ်''' :ဝေါဟာတံသ္ဇိုၚ်ဘာသာဗူနာတ်၊ ကဏ္ဍနူကဵုမပါ်ပရံဒကုတ်မဆေၚ်စပ်ကဵုမအရေဝ်ဝေါဟာ။ [[ကဏ္ဍ:ဘာသာဗူနာတ်]][[ကဏ္ဍ:ဝေါဟာအဓိကဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဗ]] d8aupvn5nf4zmkeluvie42slccz0e95 ကဏ္ဍ:ဝေါဟာတူရကဳနကဵုမပံၚ်ကောံတံရိုဟ်ဂမၠိုၚ် 14 299298 402122 2026-09-28T09:37:58Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ဘာသာတူရကဳ]]" 402122 wikitext text/x-wiki [[ကဏ္ဍ:ဘာသာတူရကဳ]] qswu8soke0pwv7cd1na4n4tn4d2xsaj ထာမ်ပလိက်:fo-decl-noun-f8 10 299299 402123 2026-09-28T09:39:52Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{#invoke:fo-noun|show|decl=f8}}<noinclude>{{tcat|ndecl:{{pagename}}}}</noinclude>" 402123 wikitext text/x-wiki {{#invoke:fo-noun|show|decl=f8}}<noinclude>{{tcat|ndecl:{{pagename}}}}</noinclude> g3yj84fam87uay6mwttzkwg2y28duwu ထာမ်ပလိက်:fur-definite articles 10 299300 402124 2026-09-28T09:45:57Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{inflection-table-top|title=ပစ္စဲမချိုတ်ပၠိုတ်ပရိဥူလဳယာန်ဂမၠိုၚ်}} ! ! ကိုန်ဨကဝုစ် ! ကိုန်ဗဟုဝစ် |- ! ပုလ္လိၚ် | {{l|fur|il}}<br>{{l|fur|l'}} | {{l|fur|i}} |- ! ဣတ္တိလိၚ် | {{l|fur|la}}<br>{{l|fur|l'}} | {{l|fur|lis}} {{inflection-table-bottom}}<noinclude>{{tcat|detdec..." 402124 wikitext text/x-wiki {{inflection-table-top|title=ပစ္စဲမချိုတ်ပၠိုတ်ပရိဥူလဳယာန်ဂမၠိုၚ်}} ! ! ကိုန်ဨကဝုစ် ! ကိုန်ဗဟုဝစ် |- ! ပုလ္လိၚ် | {{l|fur|il}}<br>{{l|fur|l'}} | {{l|fur|i}} |- ! ဣတ္တိလိၚ် | {{l|fur|la}}<br>{{l|fur|l'}} | {{l|fur|lis}} {{inflection-table-bottom}}<noinclude>{{tcat|detdecl}}</noinclude> b0icm2jkjc039uey47i5424o1vulic1 ကဏ္ဍ:ထာမ်ပလိက်ပရိဥူလဳယာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဖျေံလဝ်သန္နိဋ္ဌာန်ဂမၠိုၚ် 14 299301 402125 2026-09-28T09:50:42Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ထာမ်ပလိက်ပရိဥူလဳယာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဖျေံလဝ်သန္နိဋ္ဌာန်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ပ]]" 402125 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်ပရိဥူလဳယာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဖျေံလဝ်သန္နိဋ္ဌာန်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ပ]] fk1ryy65h8h5sjpqo9fwvbmqemnpfnf ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဖျေံလဝ်သန္နိဋ္ဌာန်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ် 14 299302 402126 2026-09-28T09:52:00Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ထာမ်ပလိက်ကဏ္ဍဒကုတ်ဍောတ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဖ]]" 402126 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်ကဏ္ဍဒကုတ်ဍောတ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဖ]] d5b536iysmd9uvue4o1vduqjrzrp60l ကဏ္ဍ:ထာမ်ပလိက်ပရိဥူလဳယာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ် 14 299303 402127 2026-09-28T09:53:48Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ထာမ်ပလိက်ပရိဥူလဳယာန်ဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ပ]]" 402127 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်ပရိဥူလဳယာန်ဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ပ]] pzprb2s39j0dh8pbr36brgn3c5c9ymc ကဏ္ဍ:ထာမ်ပလိက်ပရိဥူလဳယာန်ဂမၠိုၚ် 14 299304 402128 2026-09-28T09:54:59Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ဘာသာပရိဥူလဳယာန်]][[ကဏ္ဍ:ထာမ်ပလိက်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ပ]]" 402128 wikitext text/x-wiki [[ကဏ္ဍ:ဘာသာပရိဥူလဳယာန်]][[ကဏ္ဍ:ထာမ်ပလိက်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ပ]] ody611y2kxk9qmrtttrvkj9w68vqdhd မဝ်ဂျူ:utilities/require when needed 828 299305 402130 2026-09-28T10:15:50Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "return require [[Module:require when needed]]" 402130 Scribunto text/plain return require [[Module:require when needed]] diaswk5w2r77ssvzg6q9ftqe8ia5vym ကဏ္ဍ:ထာမ်ပလိက်အာက်သလာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမ်ဂမၠိုၚ် 14 299306 402133 2026-09-28T10:20:59Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ထာမ်ပလိက်အာက်သလာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]]" 402133 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်အာက်သလာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]] 7onymq7nh68rczrk0pl9d58bkkm2oah ထာမ်ပလိက်:ga-decl-adj 10 299307 402135 2026-09-28T10:43:10Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{#invoke:checkparams|error}}<!-- Validate template parameters -->{{inflection-table-top |title=မလဟုတ်စှ်ေဆေၚ်စပ်ကဵု {{m|ga||{{{1}}}{{{2}}}{{#if:{{{3|}}}|{{{3}}}|}}}} |palette=green |tall=yes}} ! class=outer rowspan="2" | ''မချိုတ်ပၠိုတ်'' ! colspan=2 | ကိုန်ဨကဝုစ် ! colspan=2 | ကိုန်ဗဟုဝစ် |- ! class="seconda..." 402135 wikitext text/x-wiki {{#invoke:checkparams|error}}<!-- Validate template parameters -->{{inflection-table-top |title=မလဟုတ်စှ်ေဆေၚ်စပ်ကဵု {{m|ga||{{{1}}}{{{2}}}{{#if:{{{3|}}}|{{{3}}}|}}}} |palette=green |tall=yes}} ! class=outer rowspan="2" | ''မချိုတ်ပၠိုတ်'' ! colspan=2 | ကိုန်ဨကဝုစ် ! colspan=2 | ကိုန်ဗဟုဝစ် |- ! class="secondary" | ပုလ္လိၚ် ! class="secondary" | ဣတ္တိလိၚ် ! class="secondary" | နာမ်ဇြဟတ်ထတ် ! class="secondary" | နာမ်ဇြဟတ်ဍိုန် |- ! မဒုၚ်ယၟု | {{l-self|ga|{{{1}}}{{{2}}}{{#if:{{{3|}}}|{{{3}}}|}}}} | rowspan=2 | {{l-self|ga|{{ga-lenition|{{{1}}}}}{{{2}}}{{#if:{{{3|}}}|{{{3}}}|}}}} | colspan=2 | {{l-self|ga|{{{1}}}{{#switch:{{{pl}}}|~a={{{2}}}a|~e={{{2}}}e|#default={{{pl|{{{2}}}}}}}}{{#ifeq:{{{3}}}|ach|acha|}}{{#ifeq:{{{3}}}|each|eacha|}}{{#ifeq:{{{3}}}|úil|úla|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|ir|ra|}}{{#ifeq:{{{3}}}|air|ra|}}}}{{#if:{{{1}}}|&#59;<br/>{{l-self|ga|{{ga-lenition|{{{1}}}}}{{#switch:{{{pl}}}|~a={{{2}}}a|~e={{{2}}}e|#default={{{pl|{{{2}}}}}}}}{{#ifeq:{{{3}}}|ach|acha|}}{{#ifeq:{{{3}}}|each|eacha|}}{{#ifeq:{{{3}}}|úil|úla|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|ir|ra|}}{{#ifeq:{{{3}}}|air|ra|}}}}<sup>2</sup>|}} |- ! ပရေၚ်ဂယိုၚ်လမျီု | rowspan=2 | {{l-self|ga|{{ga-lenition|{{{1}}}}}{{{gsm|{{{2}}}}}}{{#ifeq:{{{3}}}|ach|aigh|{{#ifeq:{{{3}}}|each|igh|{{#if:{{{3|}}}|{{{3}}}|}}}}}}}} | colspan=2 | {{l-self|ga|{{{1}}}{{#switch:{{{pl}}}|~a={{{2}}}a|~e={{{2}}}e|#default={{{pl|{{{2}}}}}}}}{{#ifeq:{{{3}}}|ach|acha|}}{{#ifeq:{{{3}}}|each|eacha|}}{{#ifeq:{{{3}}}|úil|úla|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|ir|ra|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|air|ra|}}}} |- ! ဗဳဇဂကူ | {{l-self|ga|{{{1}}}{{#ifeq:{{{gsf}}}|~e|{{{2}}}e|{{{gsf|{{{2}}}}}}}}{{#ifeq:{{{3}}}|ach|aí|}}{{#ifeq:{{{3}}}|each|í|}}{{#ifeq:{{{3}}}|úil|úla|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|ir|ra|}}{{#ifeq:{{{3}}}|air|ra|}}}} | {{l-self|ga|{{{1}}}{{#switch:{{{pl}}}|~a={{{2}}}a|~e={{{2}}}e|#default={{{pl|{{{2}}}}}}}}{{#ifeq:{{{3}}}|ach|acha|}}{{#ifeq:{{{3}}}|each|eacha|}}{{#ifeq:{{{3}}}|úil|úla|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|ir|ra|}}{{#ifeq:{{{3}}}|air|ra|}}}} | {{l-self|ga|{{{1}}}{{{2}}}{{#if:{{{3|}}}|{{{3}}}|}}}} |- ! ပြကမ္မကာရက | {{l-self|ga|{{{1}}}{{{2}}}{{#if:{{{3|}}}|{{{3}}}|}}}}{{#if:{{{1}}}|&#59;<br/>{{l-self|ga|{{ga-lenition|{{{1}}}}}{{{2}}}{{#if:{{{3|}}}|{{{3}}}|}}}}<sup>1</sup>|}} | {{l-self|ga|{{ga-lenition|{{{1}}}}}{{{2}}}{{#if:{{{3|}}}|{{{3}}}|}}}}{{#if:{{{gsm|}}}|&#59;<br/>{{l-self|ga|{{ga-lenition|{{{1}}}}}{{{gsm}}}}} {{i|archaic}}|{{#ifeq:{{{3}}}|ach|&#59;<br/>{{l-self|ga|{{ga-lenition|{{{1}}}}}{{{2}}}aigh}} {{i|archaic}}|{{#ifeq:{{{3}}}|each|&#59;<br/>{{l-self|ga|{{ga-lenition|{{{1}}}}}{{{2}}}igh}} {{i|archaic}}|}}}}}} | colspan=2 | {{l-self|ga|{{{1}}}{{#switch:{{{pl}}}|~a={{{2}}}a|~e={{{2}}}e|#default={{{pl|{{{2}}}}}}}}{{#ifeq:{{{3}}}|ach|acha|}}{{#ifeq:{{{3}}}|each|eacha|}}{{#ifeq:{{{3}}}|úil|úla|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|ir|ra|}}{{#ifeq:{{{3}}}|air|ra|}}}}{{#if:{{{1}}}|&#59;<br/>{{l-self|ga|{{ga-lenition|{{{1}}}}}{{#switch:{{{pl}}}|~a={{{2}}}a|~e={{{2}}}e|#default={{{pl|{{{2}}}}}}}}{{#ifeq:{{{3}}}|ach|acha|}}{{#ifeq:{{{3}}}|each|eacha|}}{{#ifeq:{{{3}}}|úil|úla|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|ir|ra|}}{{#ifeq:{{{3}}}|air|ra|}}}}<sup>2</sup>|}} |- | class="separator" colspan="999" | |- ! class="outer" | ''ပတဝ်ပတုပ်ရံၚ်'' | colspan=4 | {{#ifeq:{{{comp}}}|-|{{i|not comparable}}|níos {{l-self|ga|{{{irrcomp|{{{1}}}{{#ifeq:{{{gsf}}}|~e|{{{2}}}e|{{{comp|{{{gsf|{{{2}}}}}}}}}}}}}}{{#ifeq:{{{3}}}|ach|aí|}}{{#ifeq:{{{3}}}|each|í|}}{{#ifeq:{{{3}}}|úil|úla|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|ir|ra|}}{{#ifeq:{{{3}}}|air|ra|}}}}}} |- ! class="outer" | ''သဒ္ဒာ'' | colspan=4 | {{#ifeq:{{{comp}}}|-|{{i|not comparable}}|is {{l-self|ga|{{{irrcomp|{{{1}}}{{#ifeq:{{{gsf}}}|~e|{{{2}}}e|{{{comp|{{{gsf|{{{2}}}}}}}}}}}}}}{{#ifeq:{{{3}}}|ach|aí|}}{{#ifeq:{{{3}}}|each|í|}}{{#ifeq:{{{3}}}|úil|úla|}}{{#ifeq:{{{3}}}|amhail|amhla|}}{{#ifeq:{{{3}}}|ir|ra|}}{{#ifeq:{{{3}}}|air|ra|}}}}}} {{inflection-table-bottom|notes={{#if:{{{1}}}|<sup>၁</sup> ကာလနာမ်နွံဒၟံၚ်ဂတမသ္ပကဵုဍိုန်စှ်ေ ကဵု ဒလောံဗ္တောန်လဝ်နူကဵုပစ္စဲမချိုတ်ပၠိုတ်။<br /> <sup>၂</sup> ကာလနာမ်နွံဒၟံၚ်ဂတမတုဲဒှ်လဝ်ပ္ဍဲဗျဉ်ရမျာၚ်ဍိုန်။}}}}<noinclude>{{documentation}}</noinclude> ktqy896z1ui1mb8jl2ua7wrwrkpnqux ထာမ်ပလိက်:ga-decl-adj/documentation 10 299308 402136 2026-09-28T10:46:47Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{documentation subpage}} ==Usage== This template creates a declension table for Irish adjectives of all three declensions. If the adjective begins with a consonant other than ''s'' that is subject to lenition (one of ''b c d f g m p t'', capital or lower-case), place that consonant as positional parameter 1 and the rest of the lemma form as positional parameter 2, e.g. for {{m|ga|bog}} (first declension): <pre> {{ga..." 402136 wikitext text/x-wiki {{documentation subpage}} ==Usage== This template creates a declension table for Irish adjectives of all three declensions. If the adjective begins with a consonant other than ''s'' that is subject to lenition (one of ''b c d f g m p t'', capital or lower-case), place that consonant as positional parameter 1 and the rest of the lemma form as positional parameter 2, e.g. for {{m|ga|bog}} (first declension): <pre> {{ga-decl-adj|b|og|gsm=oig|gsf=oige|pl=~a}} </pre> If the adjective begins with ''s'' followed by a vowel, ''l'', ''n'', or ''r'', place the first two letters as positional parameter 1, e.g. for {{m|ga|seachtainiúil}} (second declension): <pre> {{ga-decl-adj|se|achtaini|úil}} </pre> In all other cases, leave positional parameter 1 blank and put the entire form as positional parameter 2 (except with first-declension adjectives in ''-ach'' and second-declension adjectives), e.g. for {{m|ga|aibí}} (third declension): <pre> {{ga-decl-adj||aibí}} </pre> ===First declension=== ====Not ending in ''-(e)ach''==== First-declension adjectives generally palatalize the final consonant in the genitive singular masculine, add ''-e'' to the palatalized final consonant in the genitive singular feminine and in the comparative, and add ''-a'' in the plural. Specify the '''genitive singular masculine''' with the parameter {{para|gsm}}, omitting the letters from positional parameter 1. If this form is identical to the lemma form, simply omit {{para|gsm}}. Specify the '''genitive singular feminine''' with the parameter {{para|gsf}}, again omitting the letters from positional parameter 1. If this form consists simply of ''e'' added to the lemma form, you can use the shortcut {{para|gsf|~e}}. Specify the '''nominative plural''' form with the parameter {{para|pl}}, again omitting the letters from positional parameter 1. If this form consists simply of ''a'' or ''e'' added to the lemma form, you can use the shortcut {{para|pl|~a}} or {{para|pl|~e}}. If this form is identical to the lemma form, simply omit this {{para|pl}}. For example, for {{m|ga|lán}}: <pre> {{ga-decl-adj||lán|gsm=láin|gsf=láine|pl=~a}} </pre> ====''-(e)ach''==== For first-declension adjectives in ''-(e)ach'' (but '''not''' ''-iach''), positional parameter 3 simply has to be set to <code>ach</code> or <code>each</code>. For example: <pre> {{ga-decl-adj|Sa|san|ach}} {{ga-decl-adj|g|léin|each}} </pre> For those in ''-iach'', however, {{para|gsf}} has to be set to the stem with ''iaiche'' instead of ''iach'' as the ending, and {{para|pl}} has to be set to <code>~a</code>. For example: <pre> {{ga-decl-adj||amfaibiach|gsf=amfaibiaiche|pl=~a}} </pre> ===Second declension=== For second-declension adjectives (i.e. those in ''-(i)úil'' (formerly ''&#8209;(e)amhail'') and ''&#8209;(a)ir''), set positional parameter 3 equal to <code>úil</code>, <code>amhail</code>, <code>ir</code>, or <code>air</code>. For example: <pre> {{ga-decl-adj|d|ath|úil}} {{ga-decl-adj|d|ifri|úil}} {{ga-decl-adj|f|ear|amhail}} {{ga-decl-adj|c|ó|ir}} {{ga-decl-adj|so|c|air}} </pre> At the moment, setting {{para|3}} equal to <code>ir</code> does '''not''' work for adjectives that end in a slender consonant or vowel + ''&#8209;ir'', such as ''saibhir''; use {{para|gsf}} and {{para|pl}} instead. ===Third declension=== Third-declension adjectives are the simplest, as they usually do not inflect. Thus: <pre> {{ga-decl-adj|b|ailí}} {{ga-decl-adj|sá|sta}} {{ga-decl-adj||nua|gsf=nuaí}} {{ga-decl-adj|so|na}} </pre> ===Comparatives (all declensions)=== If the '''comparative form''' is different from the genitive singular feminine form (including cases where the genitive singular feminine itself is identical to the lemma form), it may be specified (omitting the letters from positional parameter 1) with the parameter <code>comp=</code>. If this form is identical to the lemma form or the genitive singular feminine, simply omit this parameter. If the adjective is not comparable, specify <code>comp=-</code>, e.g. for {{m|ga|rua}}: <pre> {{ga-decl-adj||rua|gsf=ruaí|comp=-}} </pre> If the comparative form is irregular and begins with a different letter from the lemma form (e.g. {{m|ga|maith}} → {{m|ga|fearr}} and {{m|ga|beag}} → {{m|ga|lú}}), then specify the entire comparative form with the parameter <code>irrcomp=</code>. For example, for {{m|ga|maith}}: <pre> {{ga-decl-adj|m|aith|gsf=~e|pl=~e|irrcomp=fearr}} </pre><includeonly> [[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမဝိသေသနဂမၠိုၚ်]] </includeonly> s4w2qowhwsyrpufoldwabtc1xcw2i6t ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမဝိသေသနဂမၠိုၚ် 14 299309 402137 2026-09-28T10:47:17Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမဝိသေသနဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]]" 402137 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမဝိသေသနဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]] mlq40cl1aygevawct1ktfbd6l95w1sv ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ် 14 299310 402138 2026-09-28T10:48:49Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်ဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]]" 402138 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်ဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]] bhfl9vuhpe04w6d66w750fzdr1vlty1 ထာမ်ပလိက်:ga-lenition 10 299311 402139 2026-09-28T10:54:51Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{#invoke:checkparams|error}}<!-- Validate template parameters -->{{#switch:{{{1|}}} | b | B | c | C | d | D | f | F | g | G | m | M | p | P | t | T = {{{1}}}h | fl = fhl | Fl = Fhl | fr = fhr | Fr= Fhr | sa = sha | sá = shá | se = she | sé = shé | si = shi | sí = shí | sl = shl | sn = shn | so = sho | só = shó | sr = shr | su = shu | sú = shú | Sa = Sha | Sá = Shá | Se = She | Sé = Shé | Si = Shi | Sí..." 402139 wikitext text/x-wiki {{#invoke:checkparams|error}}<!-- Validate template parameters -->{{#switch:{{{1|}}} | b | B | c | C | d | D | f | F | g | G | m | M | p | P | t | T = {{{1}}}h | fl = fhl | Fl = Fhl | fr = fhr | Fr= Fhr | sa = sha | sá = shá | se = she | sé = shé | si = shi | sí = shí | sl = shl | sn = shn | so = sho | só = shó | sr = shr | su = shu | sú = shú | Sa = Sha | Sá = Shá | Se = She | Sé = Shé | Si = Shi | Sí = Shí | Sl = Shl | Sn = Shn | So = Sho | Só = Shó | Sr = Shr | Su = Shu | Sú = Shú | {{{1}}} }}<noinclude>[[ကဏ္ဍ:ထာမ်ပလိက်အာဲယျာလာန်ပရေၚ်ပြံၚ်လှာဲဗဳဇဂကူဂမၠိုၚ်]]</noinclude> 6813jsjfnhbth2l6r67hjtdxp8tpdyh ကဏ္ဍ:ထာမ်ပလိက်ပရေၚ်ပြံၚ်လှာဲဗဳဇဂကူဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ် 14 299313 402144 2026-09-28T10:59:32Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ထာမ်ပလိက်ကဏ္ဍဒကုတ်ဍောတ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဗ]]" 402144 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်ကဏ္ဍဒကုတ်ဍောတ်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|ဗ]] k5bdono1xoiuzhryt3fa4mr2zvauk64 ထာမ်ပလိက်:apoc of/documentation 10 299314 402146 2026-09-28T11:07:50Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{form of/fulldoc|withencap=1|pldesc=ဗီုပြၚ်ကုတ်ထပိုတ်မအရေဝ်လက္ကရဴ |cat=|exlang=it|etymtemp=apocopic form|shortcut=apoc of}} ==Examples== {|class="wikitable" ! Term !! Wikicode !! Output |- | {{m+|it|voler}} || {{demo2c|<nowiki>{{apocopic form of|it|volere}}</nowiki>}} |- | {{m+|roa-opt|amig'}} || {{demo2c|<nowiki>{{lb|roa-opt|sometimes before a vowel}} {{apoco..." 402146 wikitext text/x-wiki {{form of/fulldoc|withencap=1|pldesc=ဗီုပြၚ်ကုတ်ထပိုတ်မအရေဝ်လက္ကရဴ |cat=|exlang=it|etymtemp=apocopic form|shortcut=apoc of}} ==Examples== {|class="wikitable" ! Term !! Wikicode !! Output |- | {{m+|it|voler}} || {{demo2c|<nowiki>{{apocopic form of|it|volere}}</nowiki>}} |- | {{m+|roa-opt|amig'}} || {{demo2c|<nowiki>{{lb|roa-opt|sometimes before a vowel}} {{apocopic form of|roa-opt|amigo,amiga}}</nowiki>}} |- | {{m+|ceb|Arman}} || {{demo2c|<nowiki>{{apocopic form of|ceb|Armand,Armando}}</nowiki>}} |- | {{m+|osp|tod}} || {{demo2c|<nowiki>{{apocopic form of|osp|todo,toda|t=[[all]]}}</nowiki>}} |} ==See also== * {{temp|apheretic form of}} * {{temp|syncopic form of}} <includeonly> [[ကဏ္ဍ:ထာမ်ပလိက်ဗီုပြၚ်မဆေၚ်စပ်ဂမၠိုၚ်]] [[ကဏ္ဍ:ထာမ်ပလိက်ဗီုပြၚ်မဆေၚ်စပ်ကဵုသဒ္ဒာဂမၠိုၚ်]] </includeonly> t75xrtmvx9xjhg43f8yofakwcl0hhsf ထာမ်ပလိက်:it-definite articles 10 299315 402147 2026-09-28T11:11:15Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{inflection-table-top|title=[[w:en:Italian grammar#Articles|ပစ္စဲမချိုတ်ပၠိုတ်အဳတလဳဂမၠိုၚ်]]}} ! ! ကိုန်ဨကဝုစ် ! ကိုန်ဗဟုဝစ် |- ! ပုလ္လိၚ် | {{l|it|il}}<br>{{l|it|lo}} ({{l|it|l'}}) | {{l|it|i}}<br>{{l|it|gli}} |- ! ဣတ္တိလိၚ် | {{l|it|la}} ({{l|it|l'}}) | {{l|it|le}} {{inflection-t..." 402147 wikitext text/x-wiki {{inflection-table-top|title=[[w:en:Italian grammar#Articles|ပစ္စဲမချိုတ်ပၠိုတ်အဳတလဳဂမၠိုၚ်]]}} ! ! ကိုန်ဨကဝုစ် ! ကိုန်ဗဟုဝစ် |- ! ပုလ္လိၚ် | {{l|it|il}}<br>{{l|it|lo}} ({{l|it|l'}}) | {{l|it|i}}<br>{{l|it|gli}} |- ! ဣတ္တိလိၚ် | {{l|it|la}} ({{l|it|l'}}) | {{l|it|le}} {{inflection-table-bottom}}<noinclude>{{tcat|detdecl}}</noinclude> kf085c7zt0p0psqps7acutw8tz98pyo ကဏ္ဍ:ထာမ်ပလိက်အဳတခ်လဳအပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဖျေံလဝ်သန္နိဋ္ဌာန်ဂမၠိုၚ် 14 299316 402148 2026-09-28T11:12:43Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ထာမ်ပလိက်အဳတခ်လဳအပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဖျေံလဝ်သန္နိဋ္ဌာန်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]]" 402148 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်အဳတခ်လဳအပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဖျေံလဝ်သန္နိဋ္ဌာန်ဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]] ps398gvvluweho4p02c7l3bheq2l3v3 ကဏ္ဍ:ထာမ်ပလိက်အဳတခ်လဳအပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဂမၠိုၚ် 14 299317 402149 2026-09-28T11:14:26Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "[[ကဏ္ဍ:ထာမ်ပလိက်အဳတခ်လဳဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]]" 402149 wikitext text/x-wiki [[ကဏ္ဍ:ထာမ်ပလိက်အဳတခ်လဳဂမၠိုၚ်]][[ကဏ္ဍ:ထာမ်ပလိက်အပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏဗက်အလိုက်အရေဝ်ဘာသာဂမၠိုၚ်|အ]] idvzx95iiish3ifs5pop3qxdl5ib01c ထာမ်ပလိက်:alt form of 10 299319 402154 2026-09-28T11:16:41Z 咽頭べさ 33 咽頭べさ ပြံင်ပဆုဲလဝ် မုက်လိက် [[ထာမ်ပလိက်:alt form of]] ဇရေင် [[ထာမ်ပလိက်:alt of]] နကု မကလေင်ပညုင် 402154 wikitext text/x-wiki #REDIRECT [[ထာမ်ပလိက်:alt of]] cfcugxnfs200hkueutswh3e8zo1l4oe ထာမ်ပလိက်:alt of/documentation 10 299320 402155 2026-09-28T11:19:35Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{hatnote|This template is for definition sections. For the template used to list alternative spellings linking to other articles, see [[Template:alter]].}} {{form of/fulldoc|withfrom=1|withencap=1|shortcut=alt of,altform,alt form,altform of,alt form of|addlintrotext=For the difference between this template and [[Template:alternative spelling of]], see that template.|pldesc=Wiktionary:Forms and spellings|alternative..." 402155 wikitext text/x-wiki {{hatnote|This template is for definition sections. For the template used to list alternative spellings linking to other articles, see [[Template:alter]].}} {{form of/fulldoc|withfrom=1|withencap=1|shortcut=alt of,altform,alt form,altform of,alt form of|addlintrotext=For the difference between this template and [[Template:alternative spelling of]], see that template.|pldesc=[[Wiktionary:Forms and spellings|alternative forms]]}} ==Examples== {|class="wikitable" ! Term !! Wikicode !! Output |- | {{m+|ga|náimhde}} || {{demo2c|<nowiki>{{alt form|ga|naimhde}}: {{plural of|ga|námhaid,námha}}</nowiki>}} |- | {{m+|ja|蓜}} || {{demo2c|<nowiki>{{alt form|ja|配}}; {{only used in|ja|蓜島,蓜嶋}}</nowiki>}} |- | {{m+|enm|admiralle}} || {{demo2c|<nowiki>{{alternative form of|enm|amiral,emir,admiral}}</nowiki>}} |- | {{m+|enm|wat}} || {{demo2c|<nowiki>{{alternative form of|enm|wait,wath,wet,what,whate,whete,witen,wode,wold,woth,weten,wacche,wacchen,wachet,watchinges,wate,walte,weiten,witien}}</nowiki>}} |- | {{m+|ms|percaya}} || {{demo2c|<nowiki>{{lb|ms|informal}} {{alternative form of|ms|mempercayai,percayai}}</nowiki>}} |- | {{m+|hu|elveszejt}} || {{demo2c|<nowiki>{{lb|hu|transitive|dialectal}} {{alternative form of|hu|elveszt,elveszít<t:to lose [something]>}}</nowiki>}} |- | {{m+|as|ভালনে}} || {{demo2c|<nowiki>{{alt form|as|আপোনাৰ ভালনে,তোমাৰ ভালনে,তোৰ ভালনে}}</nowiki>}} |- | {{m+|mul|-- --}} || {{demo2c|<nowiki>{{alternative form of|mul|( ),— —|addl=; these are two sets of {{m|mul|--}} used to enclose [[parenthetical]] text, like two [[em dash]]es, especially when actual em dashes are not [[available]]}}.</nowiki>}} |} ==See also== * {{temp|alternative spelling of}} * {{temp|alternative case form of}} The following templates are also particularly noteworthy: * temporal: ** {{temp|obsolete form of}} ** {{temp|archaic form of}} ** {{temp|dated form of}} * conventional: ** {{temp|informal form of}} ** {{temp|nonstandard form of}} ** {{temp|standard form of}} ==TemplateData== {{TemplateDataHeader}} <templatedata> { "params": { "1": { "label": "language code", "example": "en", "type": "string", "required": true, "description": "language code for the term's language" }, "2": { "label": "term", "description": "The term that this term is the alternate form of", "example": "Judaeo-Spanish", "type": "wiki-page-name", "required": true }, "3": { "label": "displayed text", "description": "text to display for the linked term", "type": "line" }, "4": { "label": "gloss", "description": "a gloss of the term", "type": "string" }, "tr": { "label": "transliteration", "description": "a transliteration of the term", "type": "string" }, "sc": { "label": "script code", "description": "A script code for the term", "example": "Hant", "type": "string" }, "from": { "label": "dialect/region of origin", "description": "Names a dialect or region from which the term originates. Parameters from2 through from5 also available.", "example": "Southern US", "type": "string" }, "from2": { "label": "dialect/region of origin 2", "description": "Names a dialect or region from which the term originates. Parameters from2 through from5 also available.", "example": "Taiwanese Hokkien", "type": "string" } }, "description": "Indicates that a term is an alternate form of another term, such as contractions", "format": "inline" } </templatedata> <includeonly> <!-- CATEGORIES AND INTERWIKIS HERE, THANKS --> [[ကဏ္ဍ:ထာမ်ပလိက်ဗီုပြၚ်မဆေၚ်စပ်ဂမၠိုၚ်]] </includeonly> skotgt7dt509hvtlk35cnhhbel1heu4 ထာမ်ပလိက်:nn-noun-infl 10 299321 402156 2026-09-28T11:43:48Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{inflection-table-top|title=ပရေၚ်ကၠောံဝေါဟာဆေၚ်စပ်ကဵုဝၚ်နကဵု ''{{{title|{{pagename}}}}}''|tall=yes}} |- ! colspan=2 rowspan=2 | ! colspan=2 | ကိုန်ဨကဝုစ် ! colspan=2 | ကိုန်ဗဟုဝစ် |- ! class="secondary" | ဟွံချိုတ်ပၠိုတ..." 402156 wikitext text/x-wiki {{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{inflection-table-top|title=ပရေၚ်ကၠောံဝေါဟာဆေၚ်စပ်ကဵုဝၚ်နကဵု ''{{{title|{{pagename}}}}}''|tall=yes}} |- ! colspan=2 rowspan=2 | ! colspan=2 | ကိုန်ဨကဝုစ် ! colspan=2 | ကိုန်ဗဟုဝစ် |- ! class="secondary" | ဟွံချိုတ်ပၠိုတ် ! class="secondary" | မချိုတ်ပၠိုတ် ! class="secondary" | ဟွံချိုတ်ပၠိုတ် ! class="secondary" | မချိုတ်ပၠိုတ် |- | {{#if:{{{Aasen1|}}}| ! colspan=2 {{!}} {{{Aasen|Aasen<sup>1{{#if:{{{Aasenote|}}}|, {{{Aasenote|}}}}}</sup>}}} {{!}} {{{Aasen1|}}} {{!}} {{{Aasen2|}}} {{!}} {{{Aasen3|}}} {{!}} {{{Aasen4|}}} }} |- | {{#if:{{{1901|}}}{{{1901a|}}}{{{1901b|}}}{{{1901c|}}}{{{1901d|}}}{{{1901note|}}}| ! colspan=2 {{!}} {{{1901|1901<sup>{{{1901note|}}}</sup>}}} {{!}} {{{1901a|}}} {{!}} {{{1901b|}}} {{!}} {{{1901c|}}} {{!}} {{{1901d|}}} }} |- | {{#if:{{{1903|}}}{{{1903a|}}}{{{1903b|}}}{{{1903c|}}}{{{1903d|}}}{{{1903note|}}}| ! colspan=2 {{!}} {{{1903|1903<sup>{{{1903note|}}}</sup>}}} {{!}} {{{1903a|}}} {{!}} {{{1903b|}}} {{!}} {{{1903c|}}} {{!}} {{{1903d|}}} }} |- | {{#if:{{{1910|}}}{{{1910a|}}}{{{1910b|}}}{{{1910c|}}}{{{1910d|}}}{{{1910note|}}}| ! colspan=2 {{!}} {{{1910|1910<sup>{{{1910note|}}}</sup>}}} {{!}} {{{1910a|}}} {{!}} {{{1910b|}}} {{!}} {{{1910c|}}} {{!}} {{{1910d|}}} }} |- | {{#if:{{{1917|}}}{{{1917a|}}}{{{1917b|}}}{{{1917c|}}}{{{1917d|}}}{{{1917note|}}}| ! colspan=2 {{!}} {{{1917|1917<sup>{{{1917note|}}}</sup>}}} {{!}} {{{1917a|}}} {{!}} {{{1917b|}}} {{!}} {{{1917c|}}} {{!}} {{{1917d|}}} }} |- | {{#if:{{{1920|}}}{{{1920a|}}}{{{1920b|}}}{{{1920c|}}}{{{1920d|}}}{{{1920note|}}}| ! colspan=2 {{!}} {{{1920|1920<sup>{{{1920note|}}}</sup>}}} {{!}} {{{1920a|}}} {{!}} {{{1920b|}}} {{!}} {{{1920c|}}} {{!}} {{{1920d|}}} }} |- | {{#if:{{{1938|}}}{{{1938a|}}}{{{1938b|}}}{{{1938c|}}}{{{1938d|}}}{{{1938note|}}}| ! colspan=2 {{!}} {{{1938|1938<sup>{{{1938note|}}}</sup>}}} {{!}} {{{1938a|}}} {{!}} {{{1938b|}}} {{!}} {{{1938c|}}} {{!}} {{{1938d|}}} }} |- | {{#if:{{{1954|}}}{{{1954a|}}}{{{1954b|}}}{{{1954c|}}}{{{1954d|}}}{{{1954note|}}}| ! colspan=2 {{!}} {{{1954|1954<sup>{{{1954note|}}}</sup>}}} {{!}} {{{1954a|}}} {{!}} {{{1954b|}}} {{!}} {{{1954c|}}} {{!}} {{{1954d|}}} }} |- | {{#if:{{{1959|}}}{{{1959a|}}}{{{1959b|}}}{{{1959c|}}}{{{1959d|}}}{{{1959note|}}}| ! colspan=2 {{!}} {{{1959|1959<sup>{{{1959note|}}}</sup>}}} {{!}} {{{1959a|}}} {{!}} {{{1959b|}}} {{!}} {{{1959c|}}} {{!}} {{{1959d|}}} }} |- | {{#if:{{{1965|}}}{{{1965a|}}}{{{1965b|}}}{{{1965c|}}}{{{1965d|}}}| ! colspan=2 {{!}} {{{1965|1965<sup>{{{1965note|}}}</sup>}}} {{!}} {{{1965a|}}} {{!}} {{{1965b|}}} {{!}} {{{1965c|}}} {{!}} {{{1965d|}}} }} |- | {{#if:{{{1977|}}}{{{1977a|}}}{{{1977b|}}}{{{1977c|}}}{{{1977d|}}}| ! colspan=2 {{!}} {{{1977|1977<sup>{{{1977note|}}}</sup>}}} {{!}} {{{1977a|}}} {{!}} {{{1977b|}}} {{!}} {{{1977c|}}} {{!}} {{{1977d|}}} }} |- | {{#if:{{{1979|}}}{{{1979a|}}}{{{1979b|}}}{{{1979c|}}}{{{1979d|}}}| ! colspan=2 {{!}} {{{1979|1979<sup>{{{1979note|}}}</sup>}}} {{!}} {{{1979a|}}} {{!}} {{{1979b|}}} {{!}} {{{1979c|}}} {{!}} {{{1979d|}}} }} |- | {{#if:{{{1981|}}}{{{1981a|}}}{{{1981b|}}}{{{1981c|}}}{{{1981d|}}}| ! colspan=2 {{!}} {{{1981|1981<sup>{{{1981note|}}}</sup>}}} {{!}} {{{1981a|}}} {{!}} {{{1981b|}}} {{!}} {{{1981c|}}} {{!}} {{{1981d|}}} }} |- | {{#if:{{{1982|}}}{{{1982a|}}}{{{1982b|}}}{{{1982c|}}}{{{1982d|}}}| ! colspan=2 {{!}} {{{1982|1982<sup>{{{1982note|}}}</sup>}}} {{!}} {{{1982a|}}} {{!}} {{{1982b|}}} {{!}} {{{1982c|}}} {{!}} {{{1982d|}}} }} |- | {{#if:{{{1983|}}}{{{1983a|}}}{{{1983b|}}}{{{1983c|}}}{{{1983d|}}}| ! colspan=2 {{!}} {{{1983|1983<sup>{{{1983note|}}}</sup>}}} {{!}} {{{1983a|}}} {{!}} {{{1983b|}}} {{!}} {{{1983c|}}} {{!}} {{{1983d|}}} }} |- | {{#if:{{{1986|}}}{{{1986a|}}}{{{1986b|}}}{{{1986c|}}}{{{1986d|}}}| ! colspan=2 {{!}} {{{1986|1986<sup>{{{1986note|}}}</sup>}}} {{!}} {{{1986a|}}} {{!}} {{{1986b|}}} {{!}} {{{1986c|}}} {{!}} {{{1986d|}}} }} |- | {{#if:{{{1987|}}}{{{1987a|}}}{{{1987b|}}}{{{1987c|}}}{{{1987d|}}}| ! colspan=2 {{!}} {{{1987|1987<sup>{{{1987note|}}}</sup>}}} {{!}} {{{1987a|}}} {{!}} {{{1987b|}}} {{!}} {{{1987c|}}} {{!}} {{{1987d|}}} }} |- | {{#if:{{{1988|}}}{{{1988a|}}}{{{1988b|}}}{{{1988c|}}}{{{1988d|}}}| ! colspan=2 {{!}} {{{1988|1988<sup>{{{1988note|}}}</sup>}}} {{!}} {{{1988a|}}} {{!}} {{{1988b|}}} {{!}} {{{1988c|}}} {{!}} {{{1988d|}}} }} |- | {{#if:{{{1989|}}}{{{1989a|}}}{{{1989b|}}}{{{1989c|}}}{{{1989d|}}}| ! colspan=2 {{!}} {{{1989|1989<sup>{{{1989note|}}}</sup>}}} {{!}} {{{1989a|}}} {{!}} {{{1989b|}}} {{!}} {{{1989c|}}} {{!}} {{{1989d|}}} }} |- | {{#if:{{{1990|}}}{{{1990a|}}}{{{1990b|}}}{{{1990c|}}}{{{1990d|}}}| ! colspan=2 {{!}} {{{1990|1990<sup>{{{1990note|}}}</sup>}}} {{!}} {{{1990a|}}} {{!}} {{{1990b|}}} {{!}} {{{1990c|}}} {{!}} {{{1990d|}}} }} |- | {{#if:{{{1995|}}}{{{1995a|}}}{{{1995b|}}}{{{1995c|}}}{{{1995d|}}}| ! colspan=2 {{!}} {{{1995|1995<sup>{{{1995note|}}}</sup>}}} {{!}} {{{1995a|}}} {{!}} {{{1995b|}}} {{!}} {{{1995c|}}} {{!}} {{{1995d|}}} }} |- | {{#if:{{{2012|}}}{{{2012a|}}}{{{2012b|}}}{{{2012c|}}}{{{2012d|}}}| ! colspan=2 {{!}} {{{2012|2012<sup>{{{2012note|}}}</sup> (ကာလလၟုဟ်)}}} {{!}} {{{2012a|}}} {{!}} {{{2012b|}}} {{!}} {{{2012c|}}} {{!}} {{{2012d|}}} }} |- | {{#if:{{{2019|}}}{{{2019a|}}}{{{2019b|}}}{{{2019c|}}}{{{2019d|}}}| ! colspan=2 {{!}} {{{2019|2019<sup>{{{2019note|}}}</sup> (ကာလလၟုဟ်)}}} {{!}} {{{2019a|}}} {{!}} {{{2019b|}}} {{!}} {{{2019c|}}} {{!}} {{{2019d|}}} }} |- | {{#if:{{{alter1|}}}{{{alter2|}}}{{{alter3|}}}{{{alter4|}}}| ! colspan=2 {{!}} {{{misc|''တၞဟ်<sup>{{{alternote|}}}</sup>''}}} {{!}} ''{{{alter1|}}} '' {{!}} ''{{{alter2|}}} '' {{!}} ''{{{alter3|}}} '' {{!}} ''{{{alter4|}}} '' }} {{inflection-table-bottom|notes={{#if:{{{noitalics|}}}||* ဗီုပြၚ်ပ္ဍဲမချူလဝ်''မလိက်ဒစေၚ်''သီုမကိတ်ကဵုဟွံသေၚ်ဏီရ။}} {{#if:{{{nobrackets|}}}|| * ဗီုပြၚ်ပ္ဍဲမချူလဝ် [ဂွေၚ်] နကဵုမလုပ်အဝေါၚ်၊ ဆ္ဂးမစိုပ်ကဆံၚ်ဒုတိယဟေၚ်ရ။}} {{#if: {{{1901|}}}{{{1901a|}}}{{{1901b|}}}{{{1901c|}}}{{{1901d|}}}{{{1903|}}}{{{1903a|}}}{{{1903b|}}}{{{1903c|}}}{{{1903d|}}} | * ဗီုပြၚ်ပ္ဍဲမချူလဝ် (ဂွေၚ်တၟတ်ပံက်) မဗက်အလိုက်အတိုၚ်အသၟဝ် [[:en:Appendix:Norwegian Nynorsk spelling reforms#1901|မေတ်ဒ်လာမ်သ်နဝ်မာန်လေဝ်]]။|}} {{#if:{{{Aasen1|}}}{{{Aasen2|}}}{{{Aasen3|}}}{{{Aasen4|}}}| * <sup>၁</sup><small>နာမ်မစချူလဝ်ကဵုမလိက်ဇၞော်ဇၞော်သွက်ကဆံၚ်သၠုၚ်အိုတ်ဆေၚ်စပ်ကဵုကၠံသၞာံမရနုက်ကဵု၁၉။</small>|{{#if:{{{note1|}}}|<sup>၁</sup><small>{{{note1|}}}</small>|}}}} {{#if:{{{note2|}}}|<sup>၂</sup><small>{{{note2|}}}</small>|}} {{#if:{{{note3|}}}|<sup>၃</sup><small>{{{note3|}}}</small>|}} {{#if:{{{note4|}}}|<sup>၄</sup><small>{{{note4|}}}</small>|}} {{#if:{{{note5|}}}|<sup>၅</sup><small>{{{note5|}}}</small>|}} {{#if:{{{note6|}}}|<sup>၆</sup><small>{{{note6|}}}</small>|}} {{{notes|}}}}}<noinclude>{{documentation}}</noinclude> hkhm5njzcvbfwhzakk618ffgakomjid ထာမ်ပလိက်:nn-noun-infl/documentation 10 299322 402157 2026-09-28T11:50:44Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{documentation subpage}} {{shortcut|Template:nn-noun-infl}} This template may be used to create inflection tables showing the historical evolution of official forms. <includeonly> [[ကဏ္ဍ:ထာမ်ပလိက်နဝ်ဝေ နဳနိုတ်ဂမၠိုၚ်]] </includeonly>" 402157 wikitext text/x-wiki {{documentation subpage}} {{shortcut|Template:nn-noun-infl}} This template may be used to create inflection tables showing the historical evolution of official forms. <includeonly> [[ကဏ္ဍ:ထာမ်ပလိက်နဝ်ဝေ နဳနိုတ်ဂမၠိုၚ်]] </includeonly> emdzpujir5c9buu0btjnaz1eyd2sqh8 ထာမ်ပလိက်:non-decl-f-jo 10 299323 402158 2026-09-28T11:54:45Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{non-decl-blank-{{{form|full}}}{{#if:{{{indef|}}}|-indef}} | title = {{{title|''{{pagename}}''}}} | stem = ဇြဟတ်ထတ် တံမအရေဝ်-''{{#if:{{{2|}}}|i}}jō'' | g = ဣတ္တိလိၚ် | nsi = {{{nsi|{{{ns|{{#if:{{{2|}}}|{{{2}}}r|{{{1}}}}}}}}}}} | asi = {{{asi|{{{as|{{#if:{{{2|}}}|{{{2}}}i|{{{1}}}}}}}}}}} | dsi = {{{dsi|{{{ds|{{#if:{{{2|}}}|{{{2}}}i|{{{1}}}}}}}}}}} | gsi = {{{gsi|{{{gs..." 402158 wikitext text/x-wiki {{non-decl-blank-{{{form|full}}}{{#if:{{{indef|}}}|-indef}} | title = {{{title|''{{pagename}}''}}} | stem = ဇြဟတ်ထတ် တံမအရေဝ်-''{{#if:{{{2|}}}|i}}jō'' | g = ဣတ္တိလိၚ် | nsi = {{{nsi|{{{ns|{{#if:{{{2|}}}|{{{2}}}r|{{{1}}}}}}}}}}} | asi = {{{asi|{{{as|{{#if:{{{2|}}}|{{{2}}}i|{{{1}}}}}}}}}}} | dsi = {{{dsi|{{{ds|{{#if:{{{2|}}}|{{{2}}}i|{{{1}}}}}}}}}}} | gsi = {{{gsi|{{{gs|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}ar|{{{1}}}jar}}}}}}}} | nsd = {{{nsd|{{{ns|{{#if:{{{2|}}}|{{{2}}}r|{{{1}}}}}}}}in}}} | asd = {{{asd|{{{as|{{#if:{{{2|}}}|{{{2}}}|{{{1}}}}}}}}ina}}} | dsd = {{{dsd|{{{ds|{{#if:{{{2|}}}|{{{2}}}|{{{1}}}}}}}}inni}}} | gsd = {{{gsd|{{{gs|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}ar|{{{1}}}jar}}}}}innar}}} | npi = {{{npi|{{{np|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}ar|{{{1}}}jar}}}}}}}} | api = {{{api|{{{ap|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}ar|{{{1}}}jar}}}}}}}} | dpi = {{{dpi|{{{dp|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}um|{{{1}}}jum}}}}}}}} | gpi = {{{gpi|{{{gp|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}a|{{{1}}}ja}}}}}}}} | npd = {{{npd|{{{np|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}ar|{{{1}}}jar}}}}}nar}}} | apd = {{{apd|{{{ap|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}ar|{{{1}}}jar}}}}}nar}}} | dpd = {{{dpd|{{{dp|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}u|{{{1}}}ju}}}}}num}}} | gpd = {{{gpd|{{{gp|{{#if:{{{2|}}}|{{{3|{{{2}}}}}}a|{{{1}}}ja}}}}}nna}}} | notes = {{{notes|}}} }}<includeonly>{{#if:{{{2|}}}| | }}</includeonly><noinclude>{{documentation}}</noinclude> 15bo9bltiego9rg7mryu03j201w2yqf ထာမ်ပလိက်:non-decl-f-jo/documentation 10 299324 402159 2026-09-28T11:56:14Z 咽頭べさ 33 ခၞံကၠောန်လဝ် မုက်လိက် နကု "{{documentation subpage}} {{documentation needed}}<!-- Replace this with a short description of the purpose of the template, and how to use it. --> <includeonly> [[ကဏ္ဍ:ထာမ်ပလိက်နဳနိုတ်တြေံအပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမ်ဂမၠိုၚ်|f-jo]] </includeonly>" 402159 wikitext text/x-wiki {{documentation subpage}} {{documentation needed}}<!-- Replace this with a short description of the purpose of the template, and how to use it. --> <includeonly> [[ကဏ္ဍ:ထာမ်ပလိက်နဳနိုတ်တြေံအပြံၚ်အလှာဲပ္တဝ်ထ္ၜးပမာဏနာမ်ဂမၠိုၚ်|f-jo]] </includeonly> iakfsswpczbved4vxkrr3jcrg9pv20u