Wiktionary
thwiktionary
https://th.wiktionary.org/wiki/%E0%B8%A7%E0%B8%B4%E0%B8%81%E0%B8%B4%E0%B8%9E%E0%B8%88%E0%B8%99%E0%B8%B2%E0%B8%99%E0%B8%B8%E0%B8%81%E0%B8%A3%E0%B8%A1:%E0%B8%AB%E0%B8%99%E0%B9%89%E0%B8%B2%E0%B8%AB%E0%B8%A5%E0%B8%B1%E0%B8%81
MediaWiki 1.47.0-wmf.24
case-sensitive
สื่อ
พิเศษ
พูดคุย
ผู้ใช้
คุยกับผู้ใช้
วิกิพจนานุกรม
คุยเรื่องวิกิพจนานุกรม
ไฟล์
คุยเรื่องไฟล์
มีเดียวิกิ
คุยเรื่องมีเดียวิกิ
แม่แบบ
คุยเรื่องแม่แบบ
วิธีใช้
คุยเรื่องวิธีใช้
หมวดหมู่
คุยเรื่องหมวดหมู่
ภาคผนวก
คุยเรื่องภาคผนวก
ดัชนี
คุยเรื่องดัชนี
สัมผัส
คุยเรื่องสัมผัส
อรรถาภิธาน
คุยเรื่องอรรถาภิธาน
TimedText
TimedText talk
มอดูล
คุยเรื่องมอดูล
Event
Event talk
ก
0
8933
5775727
2695205
2026-10-20T11:12:53Z
Ai Ku Karng
17824
/* รูปแบบอื่น */ เขียนตามรูปแบบอักขระวิธีศิลาจารึกหลักที่1
5775727
wikitext
text/x-wiki
{{character info}}
{{also/auto}}
== ภาษาร่วม ==
=== การออกเสียง ===
* (''พยัญชนะต้น'') {{IPA|mul|/k-/}}
* (''พยัญชนะสะกด'') {{IPA|mul|/-k̚/}}
=== ตัวอักษร ===
{{mul-letter}}
# พยัญชนะในอักษรไทย ใช้แทนเสียง /k/ หรือเสียงที่ใกล้เคียงเช่น /ɡ/, /q/, /ɢ/, /ɠ/
== ภาษาไทย ==
{{wp}}
=== รูปแบบอื่น ===
* {{q|ลายสือไท}} [[ไฟล์:ก laisuethai.png|x24px|text-bottom|class=skin-invert-image|alt=ก]]
* {{alt|th|--.||รหัสมอร์ส}}
* {{q|อักษรเบรลล์}} {{l|mul|⠛}}
* {{q|ภาษามือ}} {{l|tsq|𝡀𝪜}}
=== การออกเสียง ===
{{th-pron|กอ|กอ-ไก่}}
=== ตัวอักษร ===
{{th-letter}}
# [[พยัญชนะ]][[ตัว]][[ที่]] 1 [[เรียก]][[ว่า]] ก [[ไก่]] [[เป็น]][[อักษรกลาง]] [[ใช้]][[เป็น]][[พยัญชนะต้น]] [[และ]][[เป็น]][[ตัวสะกด]][[ใน]][[มาตรากก]][[หรือ]][[แม่กก]] [[เช่น]] [[กก]] [[ปาก]] [[สัก]]
==== คำเกี่ยวข้อง ====
{{col2|th|ก กา|ก ข|ก ข ไม่กระดิกหู|ก หัน|ก.}}
== ภาษาบาลี ==
=== ปัจจัย ===
{{head|pi|ปัจจัย|head=-ก}}
# [[ผู้]], [[ผู้]][[กระทำ]] (ใช้ประกอบท้ายคำบางคำ)
#: {{uxi|pi|[[โฆสก]]|[[โฆษก]], ผู้ป่าวร้อง, ผู้โฆษณา}}
#: {{uxi|pi|[[ฑาหก]]|ผู้เผา หมายถึง [[ไฟ]]}}
#: {{uxi|pi|[[วาจก]]|ผู้กล่าว, ผู้บอก, ผู้พูด}}
#: {{uxi|pi|[[อุปตฺถมฺภก]]|[[อุปถัมภก]], ผู้ค้ำจุน, ผู้ค้ำชู, ผู้สนับสนุน, ผู้เลี้ยงดู}}
# ก [[สกรรถ]]
# [[สังขยา]][[ตัทธิต]] หรือ [[ปริมาณ]]ตัทธิต
{{suffixsee|pi}}
20didra0gvth7oiy9ef67rlx0f2be3r
ข
0
8935
5775728
2695206
2026-10-20T11:13:56Z
Ai Ku Karng
17824
/* รูปแบบอื่น */ เขียนตามรูปแบบอักขระวิธีศิลาจารึกหลักที่1
5775728
wikitext
text/x-wiki
{{character info}}
{{also/auto}}
== ภาษาร่วม ==
=== การออกเสียง ===
* (''พยัญชนะต้น'') {{IPA|mul|/kʰ-/}}
* (''พยัญชนะสะกด'') {{IPA|mul|/-k̚/}}
=== ตัวอักษร ===
{{mul-letter}}
# พยัญชนะในอักษรไทย ใช้แทนเสียง /kʰ/ หรือเสียงที่ใกล้เคียงเช่น /q/
== ภาษาไทย ==
{{wp}}
=== รูปแบบอื่น ===
* {{q|ลายสือไท}} [[ไฟล์:ข laisuethai.png|x24px|text-bottom|class=skin-invert-image|alt=ข]]
* {{alt|th|-.-.||รหัสมอร์ส}}
* {{q|อักษรเบรลล์}} {{l|mul|⠅}}
* {{q|ภาษามือ}} {{l|tsq|𝡀𝪜/𝠀𝪜}}
=== การออกเสียง ===
{{th-pron|ขอ|ขอ-ไข่}}
=== ตัวอักษร ===
{{th-letter}}
# [[พยัญชนะ]][[ตัว]][[ที่]] 2 [[เรียก]][[ว่า]] ข [[ไข่]] [[เป็น]][[อักษรสูง]] [[ใช้]][[เป็น]][[พยัญชนะต้น]] [[และ]][[เป็น]][[ตัวสะกด]][[ใน]][[มาตรากก]][[หรือ]][[แม่กก]] [[เช่น]] [[มุข]] [[เลข]]
eo1h13isefdn4wnbgiy38alzstthvpz
ฃ
0
8936
5775729
2695207
2026-10-20T11:16:06Z
Ai Ku Karng
17824
/* รูปแบบอื่น */ เขียนตามรูปแบบอักขระวิธีศิลาจารึกหลักที่1
5775729
wikitext
text/x-wiki
{{character info}}
== ภาษาร่วม ==
=== การออกเสียง ===
* (''พยัญชนะต้น'') {{IPA|mul|/kʰ-/|[x-]|qual2=โบราณ}}
* (''พยัญชนะสะกด'') {{IPA|mul|[-k̚]|qual1=ตามทฤษฎี}}
=== ตัวอักษร ===
{{mul-letter}}
# พยัญชนะในอักษรไทย ใช้แทนเสียง /kʰ/ หรือเสียงที่ใกล้เคียงเช่น /x/
== ภาษาไทย ==
{{wp}}
=== รูปแบบอื่น ===
* {{q|ลายสือไท}} [[ไฟล์:ฃ laisuethai.png|x24px|text-bottom|class=skin-invert-image|alt=ฃ]]
* {{alt|th|-.-.||รหัสมอร์ส}}
* {{q|อักษรเบรลล์}} {{l|mul|⠴⠅}}
=== การออกเสียง ===
{{th-pron|ขอ|ขอ-ขวด}}
=== ตัวอักษร ===
{{th-letter}}
# {{lb|th|obsolete}} [[พยัญชนะ]][[ตัว]][[ที่]] 3 [[เรียก]][[ว่า]] ฃ [[ขวด]] [[เป็น]][[อักษรสูง]] [[ปัจจุบัน]][[เลิก]][[ใช้]][[แล้ว]]
m8s7ckwtsh6dzup8t8bafqebznkbray
ไอ้หื่น
0
35073
5775712
1899445
2026-10-20T03:15:42Z
~2026-56296-28
19725
หน่วยคำเติมหน้า ไอ้‐ ไม่มีใช้เดี่ยว ๆ
5775712
wikitext
text/x-wiki
== ภาษาไทย ==
=== รากศัพท์ ===
{{prefix|th|ไอ้|หื่น}}
=== การออกเสียง ===
{{th-pron|ไอ้-หื่น}}
=== คำนาม ===
{{th-noun}}
# {{lb|th|ปาก}} [[ผู้ชาย]][[บ้ากาม]][[ที่]][[แสดง]][[ความต้องการ]][[ทาง]][[เพศ]][[อย่าง]][[แรงกล้า]] [[มัก]][[ใช้]][[กำลัง]][[ข่มขืน]][[ผู้หญิง]] (ใช้[[พาดหัวข่าว]])
epfbgigwzkgk79smp2b9b7zs3twbgrq
แจ๊ด
0
35996
5775731
1645239
2026-10-20T11:25:50Z
Ai Ku Karng
17824
5775731
wikitext
text/x-wiki
== ภาษาไทย ==
=== รากศัพท์ ===
แผลงมาจาก {{m|th|จัด}}
=== การออกเสียง ===
{{th-pron|แจ๊ด|แจ็๊ด}}
=== คำกริยาวิเศษณ์ ===
{{th-adv|-}}
# {{lb|th|ปาก}} [[จัด]], [[ยิ่ง]], [[ใน]][[คำ]][[ว่า]] [[แดง]]แจ๊ด
== ภาษาแสก ==
=== รากศัพท์ ===
{{inh+|skb|tai-pro|*cetᴰ}}, จาก{{der|skb|ltc|-}} {{ltc-l|七}}; ร่วมเชื้อสายกับ{{cog|th|เจ็ด}}, {{cog|lo|ເຈັດ}}, {{cog|khb|ᦵᦈᧆ}}, {{cog|blt|ꪹꪊꪸꪒ}}, {{cog|shn|ၸဵတ်း}}, {{cog|tdd|ᥓᥥᥖᥱ}}, {{cog|aho|𑜋𑜢𑜄𑜫}}, {{cog|pcc|xadt}}, {{cog|za|caet}}, {{cog|zhn|jiat}}
=== การออกเสียง ===
* {{IPA|skb|/tɕɛt̚⁴/|[tɕɛt̚˦˥˦]|a=บ้านบะหว้า}}
=== เลข ===
{{skb-num}}
# [[เจ็ด]]
r5n2crulzqh5s83xwk7w383ux99g5qm
มอดูล:category tree/รูปผัน
828
51422
5775722
5723277
2026-10-20T09:42:56Z
Octahedron80
267
5775722
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local en_utilities_module = "Module:en-utilities"
local th_utilities_module = "Module:th-utilities" --th
local insert = table.insert
local pluralize = require(en_utilities_module).pluralize
local th_pos_to_form = require(th_utilities_module).th_pos_to_form --th
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local degrees = {
["ขั้นกว่า"] = "that express a higher degree of an attribute when comparing one thing to another, or serve to set that thing apart from another",
["ขั้นสุด"] = "that express the highest possible degree of an attribute",
["ขั้นยกระดับ"] = "that, depending on the context, express either the comparative degree (a higher degree of an attribute when comparing one thing to another) or the superlative degree (the highest possible degree of an attribute)",
["ขั้นเกินจริง"] = "that express the highest possible degree of an attribute (like the superlative degree), but with an additional level of emphasis",
["ขั้นเกิน"] = "that express an excessive degree of some attribute",
["ขั้นเท่า"] = "that express the same or a similar degree of an attribute when comparing one thing to another",
}
local degree_pos = { "คำคุณศัพท์", "คำกริยาวิเศษณ์", "ตัวกำหนด", "คำสรรพนาม" }
for _, pos in ipairs(degree_pos) do
local plpos = --[[pluralize(pos)]] pos
for degree, desc in pairs(degrees) do
labels[plpos .. degree] = { --th
breadcrumb = degree,
description = "{{{langname}}} " .. plpos .. " " .. desc .. ".",
parents = {th_pos_to_form(degree_pos)}, --th
}
end
end
labels["รูปผัน"] = {
description = "{{{langname}}} inflected forms of other [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.",
umbrella_parents = "มูลฐาน",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["non-lemma forms"] = labels["รูปผัน"]
-- Handle specific types of non-lemma forms. Each spec is of the form {POS, PARENT_POS} where POS is the singular form
-- of a part of speech for which non-lemma forms exist (e.g. 'determiner' is listed because 'determiner forms' exist),
-- and PARENT_POS is the singular form of the parent category to add the category to. For example, the spec
-- {"circumfix", "morpheme"} means that 'circumfix forms' categories have the corresponding 'morpheme forms' categories
-- as their first parent. The second parent is the POS itself; e.g. 'morpheme forms' has 'morphemes' as its second
-- parent, with a sort key that places 'morpheme forms' at the beginning of the child categories. If PARENT_POS is
-- 'false', only the second parent appears as the parent. If a spec is a single string POS, the PARENT_POS defaults to
-- "non-lemma"; e.g. if the spec is "adjective", then 'adjective forms' categories have the corresponding
-- 'non-lemma forms' category as their first parent.
local specs = {
"คำคุณศัพท์",
"คำกริยาวิเศษณ์",
{"คำกำกับนาม", "ตัวกำหนด"},
{"หน่วยคำเติมคร่อม", "หน่วยคำเติม"},
"คำลักษณนาม",
"รูปติด",
"คำสันธาน",
"ตัวกำหนด",
{"รูปกริยากลาง", false},
"คำอุทาน",
"หน่วยคำเติม",
"คำนาม",
"เลข",
"รูปกริยาขยาย",
"คำอนุภาค",
{"รูปกริยาขยายอดีตกาล", "รูปกริยาขยาย"},
"predicative",
{"อุปสรรค", "หน่วยคำเติม"},
"คำวิสามานยนาม",
"คำปัจฉบท",
"คำบุพบท",
"คำสรรพนาม",
{"ปัจจัย", "หน่วยคำเติม"},
"คำกริยา",
}
for degree in pairs(degrees) do
for _, pos in ipairs(degree_pos) do
insert(specs, {pos .. degree, false}) --th
end
end
for _, spec in ipairs(specs) do
local pos, parent_pos
if type(spec) == "table" then
pos, parent_pos = unpack(spec)
else
pos = spec
end
if parent_pos == nil then
parent_pos = "รูปผัน"
end
local plpos, parents, breadcrumb = --[[pluralize(pos)]] pos, {}
if parent_pos == false then -- parent is the POS ([POS] » Forms)
breadcrumb = "รูป"
else
insert(parents, th_pos_to_form(parent_pos)) --th
end
insert(parents, {name = plpos, sort = "**"})
local pos_form = th_pos_to_form(pos) --th
labels[pos_form] = { --th
breadcrumb = breadcrumb,
description = ("{{{langname}}} %s that are inflected to display grammatical relations other than the main form."):format(plpos),
parents = parents,
}
if parent_pos == "รูปผัน" or pos == "คำกำกับนาม" then
-- 'noun suffix forms' etc. It doesn't make sense to have 'suffix suffix forms', 'circumfix suffix forms', etc. nor
-- 'past participle suffix forms' (for the latter, we should be using 'participle suffix forms').
labels["รูปปัจจัย" .. pos] = {
breadcrumb = pos,
description = ("{{{langname}}} forms of %s suffixes; alternatively, suffixes that form %s forms when added to %s."):format(pos, pos, plpos),
parents = {"รูปปัจจัย"},
}
end
end
labels["รูปกริยาขยายกรรตุวาจก"] = {
description = "{{{langname}}} participles that express an agent actively performing an action.",
parents = {"รูปกริยาขยาย"},
}
labels["active participles"] = labels["รูปกริยาขยายกรรตุวาจก"]
labels["รูปกริยาขยายเชิงคุณศัพท์กรรตุวาจก"] = {
description = "{{{langname}}} participles that function as adjectives and express an agent actively performing an action.",
parents = {"รูปกริยาขยาย", "คำคุณศัพท์"},
}
labels["active adjectival participles"] = labels["รูปกริยาขยายเชิงคุณศัพท์กรรตุวาจก"]
labels["รูปกริยาขยายเชิงคุณศัพท์"] = {
description = "{{{langname}}} participles that function as adjectives.",
parents = {"รูปกริยาขยาย", "คำคุณศัพท์"},
}
labels["adjectival participles"] = labels["รูปกริยาขยายเชิงคุณศัพท์"]
labels["รูปคุณศัพท์เพศหญิง"] = {
description = "{{{langname}}} adjectives that are inflected to give attributes to nouns associated to female beings.",
parents = {{name = "รูปคุณศัพท์", sort = "หญิง"}},
}
labels["adjective feminine forms"] = labels["รูปคุณศัพท์เพศหญิง"]
labels["รูปกริยาขยายเชิงกริยาวิเศษณ์"] = {
description = "{{{langname}}} participles that function as adverbs.",
parents = {"รูปกริยาขยาย", "คำกริยาวิเศษณ์"},
}
labels["adverbial participles"] = labels["รูปกริยาขยายเชิงกริยาวิเศษณ์"]
labels["agent participles"] = {
description = "{{{langname}}} participles that express an agent by who something is done.",
parents = {"รูปกริยาขยาย"},
}
labels["anterior adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express an action completed before the one expressed by the primary verb.",
parents = {"รูปกริยาขยาย", "คำกริยาวิเศษณ์"},
}
labels["รูปลักษณนามเอกพจน์"] = {
description = "{{{langname}}} classifiers that are inflected for singular number.",
parents = {"รูปลักษณนาม"},
}
labels["classifier singular forms"] = labels["รูปลักษณนามเอกพจน์"]
labels["collective plurals"] = {
description = "{{{langname}}} nominal plural forms with specifically collective semantics.",
parents = {"รูปนาม"},
}
labels["contemporary adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express an action occuring simultaneously with the one expressed by the primary verb.",
parents = {"รูปกริยาขยาย", "คำกริยาวิเศษณ์"},
}
labels["converbs"] = {
description = "{{{langname}}} verb forms that build clauses which function as adverbials.",
parents = {"รูปกริยา"},
}
labels["รูปกริยาเป็นนามบอกความเล็ก"] = {
description = "{{{langname}}} diminutives of gerunds.",
parents = {"รูปกริยา"},
}
labels["diminutive gerunds"] = labels["รูปกริยาเป็นนามบอกความเล็ก"]
labels["รูปกริยาขยายกรรตุวาจกอนาคตกาล"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in future time.",
parents = {"รูปกริยาขยาย"},
}
labels["future active participles"] = labels["รูปกริยาขยายกรรตุวาจกอนาคตกาล"]
labels["รูปกริยาขยายอนาคตกาล"] = {
description = "{{{langname}}} participles that indicate future events.",
parents = {"รูปกริยาขยาย"},
}
labels["future participles"] = labels["รูปกริยาขยายอนาคตกาล"]
labels["รูปกริยาขยายกรรมวาจกอนาคตกาล"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in future time.",
parents = {"รูปกริยาขยาย"},
}
labels["future passive participles"] = labels["รูปกริยาขยายกรรมวาจกอนาคตกาล"]
local function gerund_description(data)
local default_text = "{{{langname}}} verbs that are conjugated to indicate ongoing events at unspecified moments."
if not data.lang then
-- This happens e.g. in [[:Category:Gerunds by language]].
return default_text
else
local langcode = data.lang:getCode()
if langcode == "sq" or langcode == "kmr" or langcode == "liv" or data.lang:inFamily("gem", "itc") then
return "{{{langname}}} forms that generally act as an action noun for the verb that they are formed from."
elseif langcode == "sa" or langcode == "pi" then
return "{{{langname}}} verb forms used in a clause to indicate a prior action by the subject of the sentence."
else
return default_text
end
end
end
labels["รูปกริยาเป็นนาม"] = {
description = gerund_description,
additional = "{{small|[Edit function gerund_description() in [[Module:category tree/non-lemma forms]] to change this description.]}}",
parents = {"รูปกริยา"},
}
labels["gerunds"] = labels["รูปกริยาเป็นนาม"]
labels["imperfect participles"] = {
description = "{{{langname}}} participles that express an ongoing or continuous action.",
parents = {"รูปกริยาขยาย"},
}
labels["รูปกริยากลาง"] = {
description = "{{{langname}}} non-finite verb forms of various kinds.",
parents = {"รูปกริยา"},
}
labels["infinitives"] = labels["รูปกริยากลาง"]
labels["intensive adjectives"] = {
description = "{{{langname}}} adjectives that are derived from a base word to express a stronger concept than the base word.",
parents = {"รูปคุณศัพท์"},
}
labels["manuscript forms"] = {
description = "{{{langname}}} words as they appear in original manuscripts.",
parents = {"รูปผัน"},
}
labels["รูปกลาย"] = {
description = "{{{langname}}} terms whose initial consonant is mutated due to the effect of the preceding word.",
parents = {"รูปผัน"},
}
labels["mutated forms"] = labels["รูปกลาย"]
local inflected_pos_for_mutation = {
"คำคุณศัพท์",
"คำกริยาวิเศษณ์",
"ตัวกำหนด",
"คำอุทาน",
"คำนาม",
"เลข",
"รูปกริยาขยาย",
"คำอนุภาค",
"คำอุปสรรค",
"คำบุพบท",
"คำสรรพนาม",
"คำวิสามานยนาม",
"คำกริยา",
}
for _, pos in ipairs(inflected_pos_for_mutation) do
local plpos = --[[pluralize(pos)]] pos
local pos_form = th_pos_to_form(plpos) --th
labels[pos_form .. "กลาย"] = {
description = "{{{langname}}} " .. plpos .. " whose initial consonant is mutated due to the effect of the preceding word.",
parents = {pos_form, {name = "รูปกลาย", sort = pos}},
}
end
local mutation_types = {
-- FIXME, we should add these terms to [[Appendix:Glossary]] and link to them.
["eclipsed"] = "[[Appendix:Irish mutations#Eclipsis|eclipsis]]",
["lenited"] = "[[Appendix:Irish mutations#Lenition|lenition]]",
["h-prothesized"] = "[[h-prothesis]]",
["t-prothesized"] = "[[t-prothesis]]",
["aspirate-mutation"] = "[[aspirate mutation]]",
["hard-mutation"] = "[[hard mutation]]",
["mixed-mutation"] = "[[mixed mutation]]",
["nasal-mutation"] = "[[nasal mutation]]",
["soft-mutation"] = "[[soft mutation]]",
}
for muttype, desc in pairs(mutation_types) do
labels["รูปกลาย" .. muttype] = {
description = "{{{langname}}} terms whose initial consonant is mutated through " .. desc .. ", due to the effect of the preceding word.",
parents = {"รูปกลาย"},
}
end
labels["negative participles"] = {
description = "{{{langname}}} participles that express lack of an action being performed.",
parents = {"รูปกริยาขยาย"},
}
labels["รูปกริยาขยายเชิงนาม"] = {
description = "{{{langname}}} participles that function as nouns.",
parents = {"รูปกริยาขยาย", "คำนาม"},
}
labels["nominal participles"] = labels["รูปกริยาขยายเชิงนาม"]
labels["รูปกริยาขยาย"] = {
description = "{{{langname}}} verbal forms that behave syntactically like adjectives (or sometimes adverbs), and in some languages are often used in compound conjugations and/or reduced relative clauses.",
parents = {"รูปกริยา"},
}
labels["participles"] = labels["รูปกริยาขยาย"]
labels["รูปกริยาขยายกรรมวาจก"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it.",
parents = {"รูปกริยาขยาย"},
}
labels["passive participles"] = labels["รูปกริยาขยายกรรมวาจก"]
labels["รูปกริยาขยายเชิงคุณศัพท์กรรมวาจก"] = {
description = "{{{langname}}} participles that function as adjectives and express a patient having an action performed on it.",
parents = {"รูปกริยาขยาย", "คำคุณศัพท์"},
}
labels["passive adjectival participles"] = labels["รูปกริยาขยายเชิงคุณศัพท์กรรมวาจก"]
labels["past active aorist participles"] = {
description = "{{{langname}}} participles that express completed events in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["past active imperfect participles"] = {
description = "{{{langname}}} participles that express ongoing events in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["รูปกริยาขยายกรรตุวาจกอดีตกาล"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["past active participles"] = labels["รูปกริยาขยายกรรตุวาจกอดีตกาล"]
labels["รูปกริยาขยายเชิงกริยาวิเศษณ์อดีตกาล"] = {
description = "{{{langname}}} participles that function as adverbs and express actions in past time.",
parents = {"รูปกริยาขยายเชิงกริยาวิเศษณ์", "คำกริยาวิเศษณ์"},
}
labels["past adverbial participles"] = labels["รูปกริยาขยายเชิงกริยาวิเศษณ์อดีตกาล"]
labels["รูปกริยาขยายอดีตกาล"] = {
description = "{{{langname}}} participles that express actions in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["past participles"] = labels["รูปกริยาขยายอดีตกาล"]
labels["รูปกริยาขยายกรรมวาจกอดีตกาล"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["past passive participles"] = labels["รูปกริยาขยายกรรมวาจกอดีตกาล"]
labels["perfect participles"] = {
description = "{{{langname}}} participles that express having completed or undergone an action.",
parents = {"รูปกริยาขยาย"},
}
labels["perfect active participles"] = {
description = "{{{langname}}} participles that express an agent having completed an action.",
parents = {"รูปกริยาขยาย"},
}
labels["ปัจจัยพหูพจน์"] = {
description = "{{{langname}}} suffixes that form noun plurals.",
parents = {"ปัจจัยผันคำนาม"},
}
labels["plural suffixes"] = labels["ปัจจัยพหูพจน์"]
labels["prepositional pronouns"] = {
description = "{{{langname}}} pronouns that are combined with a preposition.",
umbrella_parents = "Lemmas subcategories by language",
parents = {"รูปสรรพนาม", {name = "คำบุพบท", sort = "คำสรรพนาม"}},
}
labels["รูปกริยาขยายกรรตุวาจกปัจจุบันกาล"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in present time.",
parents = {"รูปกริยาขยาย"},
}
labels["present active participles"] = labels["รูปกริยาขยายกรรตุวาจกปัจจุบันกาล"]
labels["รูปกริยาขยายเชิงกริยาวิเศษณ์ปัจจุบันกาล"] = {
description = "{{{langname}}} participles that function as adverbs and express actions in present time.",
parents = {"รูปกริยาขยายเชิงกริยาวิเศษณ์", "คำกริยาวิเศษณ์"},
}
labels["present adverbial participles"] = labels["รูปกริยาขยายเชิงกริยาวิเศษณ์ปัจจุบันกาล"]
labels["present middle participles"] = {
description = "{{{langname}}} participles that express an agent performing an action in present time in middle voice.",
parents = {"รูปกริยาขยาย"},
}
labels["รูปกริยาขยายปัจจุบันกาล"] = {
description = "{{{langname}}} participles that express actions occurring in the present time.",
parents = {"รูปกริยาขยาย"},
}
labels["present participles"] = labels["รูปกริยาขยายปัจจุบันกาล"]
labels["รูปกริยาขยายกรรมวาจกปัจจุบันกาล"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in present time.",
parents = {"รูปกริยาขยาย"},
}
labels["present passive participles"] = labels["รูปกริยาขยายกรรมวาจกปัจจุบันกาล"]
labels["pronunciation variants"] = {
description = "{{{langname}}} words that have alternative pronunciation-based spellings.",
parents = {"รูปผัน"},
}
labels["singulatives"] = {
description = "{{{langname}}} plural nouns that are inflected for singular number.",
parents = {"รูปนาม"},
}
for _, postype in ipairs { "คำหลัก", "รูปผัน"} do
local umbrella_parent = "หมวดหมู่ย่อยของ" .. mw.getContentLanguage():ucfirst(postype) .. "แบ่งตามภาษา"
local lemmas_link = "[[วิกิพจนานุกรม:คำหลัก|คำหลัก]]"
local postype_link = postype == "คำหลัก" and "รูปแปรของ" .. lemmas_link or
"รูปแปรของรูปผันของ" .. lemmas_link .. "อื่น"
labels[postype .. "แปร"] = {
description = "{{{langname}}} " .. postype_link .. ", i.e. secondary forms or spellings that are attested but typically not in common use.",
additional = ("Such terms may be uncommon spelling variants; dialectal forms; historical, archaic or obsolete " ..
"spellings; spellings in less-used scripts; or the like. They are kept out of the %s category to avoid " ..
"cluttering it. To add a term to this category, specify {{para|var|1}} in the call to {{tl|head}}, or set " ..
"{{cd|=var = true}} in the call to [[Module:headword]]. Commonly used variants should not be placed in " ..
"this category, but should be treated as normal %s."):format(postype, postype),
umbrella_parents = umbrella_parent,
breadcrumb = "รูปแปร",
parents = {postype},
}
end
labels["verb negative forms"] = {
description = "{{{langname}}} verbs that are conjugated to express negation.",
parents = {{name = "รูปกริยา", sort = "negative"}},
}
-- Add breadcrumb by chopping off the parent (or the parent's parent, etc.) from the end of the label, if possible.
require("Module:category tree/utilities").add_partial_breadcrumbs_to_labels(labels)
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "หมวดหมู่ย่อยของรูปผันแบ่งตามภาษา"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["หมวดหมู่ย่อยของรูปผันแบ่งตามภาษา"] = {
description = "Umbrella categories covering topics related to non-lemma forms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"หมวดหมู่ใหญ่รวมหัวข้อ",
{name = "รูปผัน", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
29oa2m60q4nrs30u5jbohh96ybzoafw
5775723
5775722
2026-10-20T09:43:50Z
Octahedron80
267
5775723
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local en_utilities_module = "Module:en-utilities"
local th_utilities_module = "Module:th-utilities" --th
local insert = table.insert
local pluralize = require(en_utilities_module).pluralize
local th_pos_to_form = require(th_utilities_module).th_pos_to_form --th
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local degrees = {
["ขั้นกว่า"] = "that express a higher degree of an attribute when comparing one thing to another, or serve to set that thing apart from another",
["ขั้นสุด"] = "that express the highest possible degree of an attribute",
["ขั้นยกระดับ"] = "that, depending on the context, express either the comparative degree (a higher degree of an attribute when comparing one thing to another) or the superlative degree (the highest possible degree of an attribute)",
["ขั้นเกินจริง"] = "that express the highest possible degree of an attribute (like the superlative degree), but with an additional level of emphasis",
["ขั้นเกิน"] = "that express an excessive degree of some attribute",
["ขั้นเท่า"] = "that express the same or a similar degree of an attribute when comparing one thing to another",
}
local degree_pos = { "คำคุณศัพท์", "คำกริยาวิเศษณ์", "ตัวกำหนด", "คำสรรพนาม" }
for _, pos in ipairs(degree_pos) do
local plpos = --[[pluralize(pos)]] pos
for degree, desc in pairs(degrees) do
labels[plpos .. degree] = { --th
breadcrumb = degree,
description = "{{{langname}}} " .. plpos .. " " .. desc .. ".",
parents = {th_pos_to_form(pos)}, --th
}
end
end
labels["รูปผัน"] = {
description = "{{{langname}}} inflected forms of other [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.",
umbrella_parents = "มูลฐาน",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["non-lemma forms"] = labels["รูปผัน"]
-- Handle specific types of non-lemma forms. Each spec is of the form {POS, PARENT_POS} where POS is the singular form
-- of a part of speech for which non-lemma forms exist (e.g. 'determiner' is listed because 'determiner forms' exist),
-- and PARENT_POS is the singular form of the parent category to add the category to. For example, the spec
-- {"circumfix", "morpheme"} means that 'circumfix forms' categories have the corresponding 'morpheme forms' categories
-- as their first parent. The second parent is the POS itself; e.g. 'morpheme forms' has 'morphemes' as its second
-- parent, with a sort key that places 'morpheme forms' at the beginning of the child categories. If PARENT_POS is
-- 'false', only the second parent appears as the parent. If a spec is a single string POS, the PARENT_POS defaults to
-- "non-lemma"; e.g. if the spec is "adjective", then 'adjective forms' categories have the corresponding
-- 'non-lemma forms' category as their first parent.
local specs = {
"คำคุณศัพท์",
"คำกริยาวิเศษณ์",
{"คำกำกับนาม", "ตัวกำหนด"},
{"หน่วยคำเติมคร่อม", "หน่วยคำเติม"},
"คำลักษณนาม",
"รูปติด",
"คำสันธาน",
"ตัวกำหนด",
{"รูปกริยากลาง", false},
"คำอุทาน",
"หน่วยคำเติม",
"คำนาม",
"เลข",
"รูปกริยาขยาย",
"คำอนุภาค",
{"รูปกริยาขยายอดีตกาล", "รูปกริยาขยาย"},
"predicative",
{"อุปสรรค", "หน่วยคำเติม"},
"คำวิสามานยนาม",
"คำปัจฉบท",
"คำบุพบท",
"คำสรรพนาม",
{"ปัจจัย", "หน่วยคำเติม"},
"คำกริยา",
}
for degree in pairs(degrees) do
for _, pos in ipairs(degree_pos) do
insert(specs, {pos .. degree, false}) --th
end
end
for _, spec in ipairs(specs) do
local pos, parent_pos
if type(spec) == "table" then
pos, parent_pos = unpack(spec)
else
pos = spec
end
if parent_pos == nil then
parent_pos = "รูปผัน"
end
local plpos, parents, breadcrumb = --[[pluralize(pos)]] pos, {}
if parent_pos == false then -- parent is the POS ([POS] » Forms)
breadcrumb = "รูป"
else
insert(parents, th_pos_to_form(parent_pos)) --th
end
insert(parents, {name = plpos, sort = "**"})
local pos_form = th_pos_to_form(pos) --th
labels[pos_form] = { --th
breadcrumb = breadcrumb,
description = ("{{{langname}}} %s that are inflected to display grammatical relations other than the main form."):format(plpos),
parents = parents,
}
if parent_pos == "รูปผัน" or pos == "คำกำกับนาม" then
-- 'noun suffix forms' etc. It doesn't make sense to have 'suffix suffix forms', 'circumfix suffix forms', etc. nor
-- 'past participle suffix forms' (for the latter, we should be using 'participle suffix forms').
labels["รูปปัจจัย" .. pos] = {
breadcrumb = pos,
description = ("{{{langname}}} forms of %s suffixes; alternatively, suffixes that form %s forms when added to %s."):format(pos, pos, plpos),
parents = {"รูปปัจจัย"},
}
end
end
labels["รูปกริยาขยายกรรตุวาจก"] = {
description = "{{{langname}}} participles that express an agent actively performing an action.",
parents = {"รูปกริยาขยาย"},
}
labels["active participles"] = labels["รูปกริยาขยายกรรตุวาจก"]
labels["รูปกริยาขยายเชิงคุณศัพท์กรรตุวาจก"] = {
description = "{{{langname}}} participles that function as adjectives and express an agent actively performing an action.",
parents = {"รูปกริยาขยาย", "คำคุณศัพท์"},
}
labels["active adjectival participles"] = labels["รูปกริยาขยายเชิงคุณศัพท์กรรตุวาจก"]
labels["รูปกริยาขยายเชิงคุณศัพท์"] = {
description = "{{{langname}}} participles that function as adjectives.",
parents = {"รูปกริยาขยาย", "คำคุณศัพท์"},
}
labels["adjectival participles"] = labels["รูปกริยาขยายเชิงคุณศัพท์"]
labels["รูปคุณศัพท์เพศหญิง"] = {
description = "{{{langname}}} adjectives that are inflected to give attributes to nouns associated to female beings.",
parents = {{name = "รูปคุณศัพท์", sort = "หญิง"}},
}
labels["adjective feminine forms"] = labels["รูปคุณศัพท์เพศหญิง"]
labels["รูปกริยาขยายเชิงกริยาวิเศษณ์"] = {
description = "{{{langname}}} participles that function as adverbs.",
parents = {"รูปกริยาขยาย", "คำกริยาวิเศษณ์"},
}
labels["adverbial participles"] = labels["รูปกริยาขยายเชิงกริยาวิเศษณ์"]
labels["agent participles"] = {
description = "{{{langname}}} participles that express an agent by who something is done.",
parents = {"รูปกริยาขยาย"},
}
labels["anterior adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express an action completed before the one expressed by the primary verb.",
parents = {"รูปกริยาขยาย", "คำกริยาวิเศษณ์"},
}
labels["รูปลักษณนามเอกพจน์"] = {
description = "{{{langname}}} classifiers that are inflected for singular number.",
parents = {"รูปลักษณนาม"},
}
labels["classifier singular forms"] = labels["รูปลักษณนามเอกพจน์"]
labels["collective plurals"] = {
description = "{{{langname}}} nominal plural forms with specifically collective semantics.",
parents = {"รูปนาม"},
}
labels["contemporary adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express an action occuring simultaneously with the one expressed by the primary verb.",
parents = {"รูปกริยาขยาย", "คำกริยาวิเศษณ์"},
}
labels["converbs"] = {
description = "{{{langname}}} verb forms that build clauses which function as adverbials.",
parents = {"รูปกริยา"},
}
labels["รูปกริยาเป็นนามบอกความเล็ก"] = {
description = "{{{langname}}} diminutives of gerunds.",
parents = {"รูปกริยา"},
}
labels["diminutive gerunds"] = labels["รูปกริยาเป็นนามบอกความเล็ก"]
labels["รูปกริยาขยายกรรตุวาจกอนาคตกาล"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in future time.",
parents = {"รูปกริยาขยาย"},
}
labels["future active participles"] = labels["รูปกริยาขยายกรรตุวาจกอนาคตกาล"]
labels["รูปกริยาขยายอนาคตกาล"] = {
description = "{{{langname}}} participles that indicate future events.",
parents = {"รูปกริยาขยาย"},
}
labels["future participles"] = labels["รูปกริยาขยายอนาคตกาล"]
labels["รูปกริยาขยายกรรมวาจกอนาคตกาล"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in future time.",
parents = {"รูปกริยาขยาย"},
}
labels["future passive participles"] = labels["รูปกริยาขยายกรรมวาจกอนาคตกาล"]
local function gerund_description(data)
local default_text = "{{{langname}}} verbs that are conjugated to indicate ongoing events at unspecified moments."
if not data.lang then
-- This happens e.g. in [[:Category:Gerunds by language]].
return default_text
else
local langcode = data.lang:getCode()
if langcode == "sq" or langcode == "kmr" or langcode == "liv" or data.lang:inFamily("gem", "itc") then
return "{{{langname}}} forms that generally act as an action noun for the verb that they are formed from."
elseif langcode == "sa" or langcode == "pi" then
return "{{{langname}}} verb forms used in a clause to indicate a prior action by the subject of the sentence."
else
return default_text
end
end
end
labels["รูปกริยาเป็นนาม"] = {
description = gerund_description,
additional = "{{small|[Edit function gerund_description() in [[Module:category tree/non-lemma forms]] to change this description.]}}",
parents = {"รูปกริยา"},
}
labels["gerunds"] = labels["รูปกริยาเป็นนาม"]
labels["imperfect participles"] = {
description = "{{{langname}}} participles that express an ongoing or continuous action.",
parents = {"รูปกริยาขยาย"},
}
labels["รูปกริยากลาง"] = {
description = "{{{langname}}} non-finite verb forms of various kinds.",
parents = {"รูปกริยา"},
}
labels["infinitives"] = labels["รูปกริยากลาง"]
labels["intensive adjectives"] = {
description = "{{{langname}}} adjectives that are derived from a base word to express a stronger concept than the base word.",
parents = {"รูปคุณศัพท์"},
}
labels["manuscript forms"] = {
description = "{{{langname}}} words as they appear in original manuscripts.",
parents = {"รูปผัน"},
}
labels["รูปกลาย"] = {
description = "{{{langname}}} terms whose initial consonant is mutated due to the effect of the preceding word.",
parents = {"รูปผัน"},
}
labels["mutated forms"] = labels["รูปกลาย"]
local inflected_pos_for_mutation = {
"คำคุณศัพท์",
"คำกริยาวิเศษณ์",
"ตัวกำหนด",
"คำอุทาน",
"คำนาม",
"เลข",
"รูปกริยาขยาย",
"คำอนุภาค",
"คำอุปสรรค",
"คำบุพบท",
"คำสรรพนาม",
"คำวิสามานยนาม",
"คำกริยา",
}
for _, pos in ipairs(inflected_pos_for_mutation) do
local plpos = --[[pluralize(pos)]] pos
local pos_form = th_pos_to_form(plpos) --th
labels[pos_form .. "กลาย"] = {
description = "{{{langname}}} " .. plpos .. " whose initial consonant is mutated due to the effect of the preceding word.",
parents = {pos_form, {name = "รูปกลาย", sort = pos}},
}
end
local mutation_types = {
-- FIXME, we should add these terms to [[Appendix:Glossary]] and link to them.
["eclipsed"] = "[[Appendix:Irish mutations#Eclipsis|eclipsis]]",
["lenited"] = "[[Appendix:Irish mutations#Lenition|lenition]]",
["h-prothesized"] = "[[h-prothesis]]",
["t-prothesized"] = "[[t-prothesis]]",
["aspirate-mutation"] = "[[aspirate mutation]]",
["hard-mutation"] = "[[hard mutation]]",
["mixed-mutation"] = "[[mixed mutation]]",
["nasal-mutation"] = "[[nasal mutation]]",
["soft-mutation"] = "[[soft mutation]]",
}
for muttype, desc in pairs(mutation_types) do
labels["รูปกลาย" .. muttype] = {
description = "{{{langname}}} terms whose initial consonant is mutated through " .. desc .. ", due to the effect of the preceding word.",
parents = {"รูปกลาย"},
}
end
labels["negative participles"] = {
description = "{{{langname}}} participles that express lack of an action being performed.",
parents = {"รูปกริยาขยาย"},
}
labels["รูปกริยาขยายเชิงนาม"] = {
description = "{{{langname}}} participles that function as nouns.",
parents = {"รูปกริยาขยาย", "คำนาม"},
}
labels["nominal participles"] = labels["รูปกริยาขยายเชิงนาม"]
labels["รูปกริยาขยาย"] = {
description = "{{{langname}}} verbal forms that behave syntactically like adjectives (or sometimes adverbs), and in some languages are often used in compound conjugations and/or reduced relative clauses.",
parents = {"รูปกริยา"},
}
labels["participles"] = labels["รูปกริยาขยาย"]
labels["รูปกริยาขยายกรรมวาจก"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it.",
parents = {"รูปกริยาขยาย"},
}
labels["passive participles"] = labels["รูปกริยาขยายกรรมวาจก"]
labels["รูปกริยาขยายเชิงคุณศัพท์กรรมวาจก"] = {
description = "{{{langname}}} participles that function as adjectives and express a patient having an action performed on it.",
parents = {"รูปกริยาขยาย", "คำคุณศัพท์"},
}
labels["passive adjectival participles"] = labels["รูปกริยาขยายเชิงคุณศัพท์กรรมวาจก"]
labels["past active aorist participles"] = {
description = "{{{langname}}} participles that express completed events in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["past active imperfect participles"] = {
description = "{{{langname}}} participles that express ongoing events in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["รูปกริยาขยายกรรตุวาจกอดีตกาล"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["past active participles"] = labels["รูปกริยาขยายกรรตุวาจกอดีตกาล"]
labels["รูปกริยาขยายเชิงกริยาวิเศษณ์อดีตกาล"] = {
description = "{{{langname}}} participles that function as adverbs and express actions in past time.",
parents = {"รูปกริยาขยายเชิงกริยาวิเศษณ์", "คำกริยาวิเศษณ์"},
}
labels["past adverbial participles"] = labels["รูปกริยาขยายเชิงกริยาวิเศษณ์อดีตกาล"]
labels["รูปกริยาขยายอดีตกาล"] = {
description = "{{{langname}}} participles that express actions in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["past participles"] = labels["รูปกริยาขยายอดีตกาล"]
labels["รูปกริยาขยายกรรมวาจกอดีตกาล"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in past time.",
parents = {"รูปกริยาขยาย"},
}
labels["past passive participles"] = labels["รูปกริยาขยายกรรมวาจกอดีตกาล"]
labels["perfect participles"] = {
description = "{{{langname}}} participles that express having completed or undergone an action.",
parents = {"รูปกริยาขยาย"},
}
labels["perfect active participles"] = {
description = "{{{langname}}} participles that express an agent having completed an action.",
parents = {"รูปกริยาขยาย"},
}
labels["ปัจจัยพหูพจน์"] = {
description = "{{{langname}}} suffixes that form noun plurals.",
parents = {"ปัจจัยผันคำนาม"},
}
labels["plural suffixes"] = labels["ปัจจัยพหูพจน์"]
labels["prepositional pronouns"] = {
description = "{{{langname}}} pronouns that are combined with a preposition.",
umbrella_parents = "Lemmas subcategories by language",
parents = {"รูปสรรพนาม", {name = "คำบุพบท", sort = "คำสรรพนาม"}},
}
labels["รูปกริยาขยายกรรตุวาจกปัจจุบันกาล"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in present time.",
parents = {"รูปกริยาขยาย"},
}
labels["present active participles"] = labels["รูปกริยาขยายกรรตุวาจกปัจจุบันกาล"]
labels["รูปกริยาขยายเชิงกริยาวิเศษณ์ปัจจุบันกาล"] = {
description = "{{{langname}}} participles that function as adverbs and express actions in present time.",
parents = {"รูปกริยาขยายเชิงกริยาวิเศษณ์", "คำกริยาวิเศษณ์"},
}
labels["present adverbial participles"] = labels["รูปกริยาขยายเชิงกริยาวิเศษณ์ปัจจุบันกาล"]
labels["present middle participles"] = {
description = "{{{langname}}} participles that express an agent performing an action in present time in middle voice.",
parents = {"รูปกริยาขยาย"},
}
labels["รูปกริยาขยายปัจจุบันกาล"] = {
description = "{{{langname}}} participles that express actions occurring in the present time.",
parents = {"รูปกริยาขยาย"},
}
labels["present participles"] = labels["รูปกริยาขยายปัจจุบันกาล"]
labels["รูปกริยาขยายกรรมวาจกปัจจุบันกาล"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in present time.",
parents = {"รูปกริยาขยาย"},
}
labels["present passive participles"] = labels["รูปกริยาขยายกรรมวาจกปัจจุบันกาล"]
labels["pronunciation variants"] = {
description = "{{{langname}}} words that have alternative pronunciation-based spellings.",
parents = {"รูปผัน"},
}
labels["singulatives"] = {
description = "{{{langname}}} plural nouns that are inflected for singular number.",
parents = {"รูปนาม"},
}
for _, postype in ipairs { "คำหลัก", "รูปผัน"} do
local umbrella_parent = "หมวดหมู่ย่อยของ" .. mw.getContentLanguage():ucfirst(postype) .. "แบ่งตามภาษา"
local lemmas_link = "[[วิกิพจนานุกรม:คำหลัก|คำหลัก]]"
local postype_link = postype == "คำหลัก" and "รูปแปรของ" .. lemmas_link or
"รูปแปรของรูปผันของ" .. lemmas_link .. "อื่น"
labels[postype .. "แปร"] = {
description = "{{{langname}}} " .. postype_link .. ", i.e. secondary forms or spellings that are attested but typically not in common use.",
additional = ("Such terms may be uncommon spelling variants; dialectal forms; historical, archaic or obsolete " ..
"spellings; spellings in less-used scripts; or the like. They are kept out of the %s category to avoid " ..
"cluttering it. To add a term to this category, specify {{para|var|1}} in the call to {{tl|head}}, or set " ..
"{{cd|=var = true}} in the call to [[Module:headword]]. Commonly used variants should not be placed in " ..
"this category, but should be treated as normal %s."):format(postype, postype),
umbrella_parents = umbrella_parent,
breadcrumb = "รูปแปร",
parents = {postype},
}
end
labels["verb negative forms"] = {
description = "{{{langname}}} verbs that are conjugated to express negation.",
parents = {{name = "รูปกริยา", sort = "negative"}},
}
-- Add breadcrumb by chopping off the parent (or the parent's parent, etc.) from the end of the label, if possible.
require("Module:category tree/utilities").add_partial_breadcrumbs_to_labels(labels)
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "หมวดหมู่ย่อยของรูปผันแบ่งตามภาษา"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["หมวดหมู่ย่อยของรูปผันแบ่งตามภาษา"] = {
description = "Umbrella categories covering topics related to non-lemma forms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"หมวดหมู่ใหญ่รวมหัวข้อ",
{name = "รูปผัน", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
5db6xfy0mpze0rg35crfnav4x0gxr5c
แด๊ก
0
170428
5775730
1885579
2026-10-20T11:24:42Z
Ai Ku Karng
17824
/* ภาษาแสก */
5775730
wikitext
text/x-wiki
{{also/auto}}
== ภาษาแสก ==
=== รากศัพท์ ===
{{inh+|skb|tai-pro|*ɗekᴰ}}; ร่วมเชื้อสายกับ{{cog|th|เด็ก}}, {{cog|nod|ᨯᩮᩢ᩠ᨠ}}, {{cog|lo|ເດັກ}}
=== การออกเสียง ===
* {{IPA|skb|/dɛk̚⁴/|[dɛk̚˦˥˦]|a=บ้านบะหว้า}}
=== คำนาม ===
{{skb-noun}}
# [[เด็ก]]
9k1myg3ueq0kx2npbpz8gy20gtcrb18
มอดูล:languages/data/2/extra
828
312282
5775707
5771173
2026-10-19T14:09:06Z
Octahedron80
267
5775707
Scribunto
text/plain
local m = {}
m["aa"] = {
aliases = {"กาฟาร์", "Afar", "Qafar"},
}
m["ab"] = {
aliases = {"อับคัซ", "อับฮัซ", "Abkhaz", "Abkhazian", "Abxazo"},
}
m["ae"] = {
aliases = {"เซนด์", "แบกเตรียเก่า", "Avestan", "Zend", "Old Bactrian"},
}
m["af"] = {
aliases = {"แอฟริคานส์", "Afrikaans"},
}
m["ak"] = {
aliases = {"Akan"},
varieties = {"Twi-Fante", "Twi", {"Fante", "Fanti"}, "Asante", "Akuapem", "Abron", "Brong", "Wasa"},
}
m["am"] = {
aliases = {"Amharic"},
}
m["an"] = {
aliases = {"Aragonese"},
}
m["ar"] = {
-- FIXME, some of the following are varieties but it's not clear which ones
aliases = {"อาหรับมาตรฐาน", "อาหรับวรรณกรรม", "Arabic", "Standard Arabic", "Literary Arabic", "High Arabic"},
varieties = {
{"อาหรับมาตรฐานใหม่", "Modern Standard Arabic"},
{"อาหรับคลาสสิก", "Classical Arabic"},
{"อาหรับแบบยิว", "Judeo-Arabic"}
},
}
m["as"] = {
aliases = {"Assamese", "Asamiya"},
}
m["av"] = {
aliases = {"Avar", "Avaric"},
}
m["ay"] = {
aliases = {"Aymara"},
varieties = {
{"ไอย์มาราใต้", "Southern Aymara"},
{"ไอย์มาราตอนกลาง", "Central Aymara"}
},
}
m["az"] = {
aliases = {"อาเซอรี", "อาซารี", "เติร์กแบบอาเซอรี", "เติร์กแบบอาเซอร์ไบจาน", "Azerbaijani", "Azeri", "Azari", "Azeri Turkic", "Azerbaijani Turkic"},
varieties = {
{"อาเซอร์ไบจานเหนือ", "North Azerbaijani"},
{"อาเซอร์ไบจานใต้", "South Azerbaijani"},
{"Afshar", "Afshari", "Afshar Azerbaijani", "Afchar"},
{"Qashqa'i", "Qashqai", "Kashkay"},
"Sonqor"
},
}
m["ba"] = {
aliases = {"บัชคีร์", "บัชคอร์", "Bashkir"},
}
m["be"] = {
aliases = {"รัสเซียขาว", "Belarusian", "Belorussian", "Belarusan", "Bielorussian", "Byelorussian", "Belarussian", "White Russian"},
}
m["bg"] = {
aliases = {"Bulgarian"},
}
m["bh"] = {
aliases = {"พิหารี", "Bihari"},
}
m["bi"] = {
aliases = {"Bislama"},
}
m["bm"] = {
aliases = {"Bambara", "Bamanankan"},
}
m["bn"] = {
aliases = {"เบงกาลี", "บังลา", "Bengali", "Bangla"},
}
m["bo"] = {
aliases = {"Tibetan"},
varieties = {
{"Amdo Tibetan", "Amdo"},
"Dolpo",
{"Khams", "Khams Tibetan"}, "Khamba",
"Gola",
"Humla",
"Limi", {"Lhasa", "Lhasa Tibetan"}, "Lhomi", "Loke", "Lowa",
"Mugom", "Mugu", "Mustang",
"Nubri",
"Panang",
"Shing Saapa",
"Thudam", "Tichurong", "Tseku",
{"Ü", "Dbus"},
"Walungge"}, -- and "Gyalsumdo", "Lower Manang"? "Kyirong"?
}
m["br"] = {
aliases = {"Breton"},
varieties = {{"Gwenedeg", "Vannetais"}, {"Kerneveg", "Cornouaillais"}, {"Leoneg", "Léonard"}, {"Tregerieg", "Trégorrois"}},
}
m["ca"] = {
aliases = {"คาตาลัน", "Catalan"},
-- don't list varieties here that are in [[Module:etymology languages/data]]
}
m["ce"] = {
aliases = {"Chechen"},
}
m["ch"] = {
aliases = {"Chamorro", "Chamoru"},
}
m["co"] = {
aliases = {"Corsican", "Corsu"},
}
m["cr"] = {
aliases = {"Cree"},
}
m["cs"] = {
aliases = {"Czech"},
}
m["cu"] = {
aliases = {"สลาวิกคริสตจักรเก่า", "Old Church Slavonic", "Old Church Slavic"},
}
m["cv"] = {
aliases = {"Chuvash"},
}
m["cy"] = {
aliases = {"Welsh"},
varieties = {"Cofi Welsh", {"Dyfedeg", "Dyfed Welsh", "Demetian"}, {"Gwenhwyseg", "Gwent Welsh", "Gwentian"}, {"Gwyndodeg", "Gwynedd Welsh", "Venedotian"}, {"Powyseg", "Powys Welsh", "Powysian"}, "Patagonian Welsh"},
}
m["da"] = {
aliases = {"เดนิช", "Danish"},
}
m["de"] = {
aliases = {"เยอรมันสูง", "เยอรมันสูงใหม่", "ด็อยทช์", "German", "High German", "New High German", "Deutsch"},
varieties = {"Alsatian German", "American German",
"Bavarian German", "Belgian German",
"Central German",
"DDR German",
"East African German",
"German German",
"Hessian German",
"Indiana German",
"Liechtenstein German", "Lorraine German", "Luxembourgish German",
"Namibian German", "Northern German",
"Prussian German",
"Silesia German", "South African German", "Southern German", "South Tyrolean German", "Switzerland German",
"Texan German"},
}
m["dv"] = {
aliases = {"ดิเวฮิ", "Dhivehi", "Divehi", "Maldivian"},
varieties = {{"มาห์ล", "Mahal", "Mahl"}},
}
m["dz"] = {
aliases = {"Dzongkha"},
}
m["ee"] = {
aliases = {"Ewe"},
}
m["el"] = {
aliases = {"กรีกใหม่", "Greek", "Modern Greek", "Neo-Hellenic"},
}
m["en"] = {
aliases = {"อังกฤษใหม่", "English", "Modern English", "New English"},
varieties = {"Polari", "Yinglish"},
}
m["eo"] = {
aliases = {"Esperanto"},
}
m["es"] = {
aliases = {"คาสตีล", "Spanish", "Castilian"},
varieties = {{"Amazonian Spanish", "Amazonic Spanish"}, "Loreto-Ucayali Spanish"},
}
m["et"] = {
aliases = {"Estonian"},
}
m["eu"] = {
aliases = {"Basque", "Euskara"},
}
m["fa"] = {
aliases = {"ฟาร์ซี", "เปอร์เซียใหม่", "Persian", "Farsi", "New Persian", "Modern Persian"},
varieties = {{"Western Persian", "Iranian Persian"}, {"Eastern Persian", "Dari"}, {"Aimaq", "Aimak", "Aymaq", "Eimak"}},
}
m["ff"] = {
aliases = {"Fula", "Fulani"},
varieties = {"Adamawa Fulfulde", "Bagirmi Fulfulde", "Borgu Fulfulde", "Central-Eastern Niger Fulfulde", "Fulfulde", "Maasina Fulfulde", "Nigerian Fulfulde", "Pular", "Pulaar", "Western Niger Fulfulde"}, -- Maasina, etc are dialects, subsumed into this code; Pular and Pulaar are distinct
}
m["fi"] = {
aliases = {"ฟินนิช", "ซูโอมี", "Finnish", "Suomi"},
}
m["fj"] = {
aliases = {"ฟิจิ", "Fijian"},
}
m["fo"] = {
aliases = {"Faroese", "Faeroese"},
}
m["fr"] = {
aliases = {"ฝรั่งเศสใหม่", "French", "Modern French"},
varieties = {"African French", "Algerian French", "Alsatian French", "Antilles French", "Atlantic Canadian French",
"Belgian French",
"Congolese French",
"European French",
"French French",
"Haitian French",
"Ivorian French",
"Lorraine French", "Louisiana French", "Luxembourgish French",
"Malian French", "Marseille French", "Missourian French", "Moroccan French",
"Newfoundland French", "North American French",
"Picard French", "Provençal French",
"Quebec French",
"Réunion French", "Rwandan French",
"Tunisian French",
"West African French"},
}
m["fy"] = {
aliases = {"ฟรีเชีย", "West Frisian", "Western Frisian", "Frisian"},
}
m["ga"] = {
aliases = {"ไอร์แลนด์", "แกลิกแบบไอร์แลนด์", "Irish", "Irish Gaelic", "Gaelic"}, -- calling it simply "Gaelic" is rare in Ireland, but relatively common in the Irish diaspora
varieties = {{"Cois Fharraige Irish", "Cois Fhairrge Irish"}, {"Connacht Irish", "Connaught Irish"}, "Cork Irish", "Donegal Irish", "Galway Irish", "Kerry Irish", "Mayo Irish", "Munster Irish", "Ulster Irish", "Waterford Irish", "West Muskerry Irish"},
}
m["gd"] = {
aliases = {"Scottish Gaelic", "Gaelic", "Gàidhlig", "Scots Gaelic", "Scottish"},
varieties = {"Argyll Gaelic", "Arran Scottish Gaelic", {"Canadian Gaelic", "Canadian Scottish Gaelic", "Cape Breton Gaelic"}, "East Sutherland Gaelic", {"Galwegian Gaelic", "Gallovidian Gaelic", "Gallowegian Gaelic", "Galloway Gaelic"}, "Hebridean Gaelic", "Highland Gaelic"},
}
m["gl"] = {
aliases = {"Galician"},
}
m["gu"] = {
aliases = {"Gujarati"},
}
m["gv"] = {
aliases = {"แกลิกแบบเกาะแมน", "Manx", "Manx Gaelic"},
varieties = {"Northern Manx", "Southern Manx"},
}
m["ha"] = {
aliases = {"Hausa"},
}
m["he"] = {
aliases = {"อิฟริท", "Hebrew", "Ivrit"},
pseudo_families = "qfa-jew",
}
m["hi"] = {
aliases = {"ฮินดู", "Hindi"},
other_names = {"Hindavi"},
}
m["ho"] = {
aliases = {"Hiri Motu", "Pidgin Motu", "Police Motu"},
}
m["ht"] = {
aliases = {"ครีโอลไฮติ", "ไฮติครีโอล", "เฮติครีโอล", "ครีโอล", "Haitian Creole", "Creole", "Haitian", "Kreyòl"},
}
m["hu"] = {
aliases = {"มอยอร์", "Hungarian", "Magyar"},
}
m["hy"] = {
aliases = {"อาร์มีเนียใหม่", "Armenian", "Modern Armenian"},
varieties = {{"อาร์มีเนียตะวันออก", "Eastern Armenian"}, {"อาร์มีเนียตะวันตก", "Western Armenian"}},
}
m["hz"] = {
aliases = {"Herero"},
}
m["ia"] = {
aliases = {"Interlingua"},
}
m["id"] = {
aliases = {"มลายูแบบอินโดนีเซีย", "Indonesian"},
}
m["ie"] = {
aliases = {"ออกซิเดนทาล", "Interlingue", "Occidental"},
}
m["ig"] = {
aliases = {"Igbo"},
}
m["ii"] = {
aliases = {"อี๋แบบเสฉวน", "อี๋เหนือ", "อี๋แบบเหลียงซาน", "Sichuan Yi", "Nuosu", "Nosu", "Northern Yi", "Liangshan Yi"},
}
m["ik"] = {
aliases = {"Inupiak", "Iñupiaq", "Inupiatun"},
}
m["io"] = {
aliases = {"Ido"},
}
m["is"] = {
aliases = {"Icelandic"},
}
m["it"] = {
aliases = {"อิตาเลียน", "Italian"},
}
m["iu"] = {
aliases = {"Inuktitut"},
varieties = {
"Aivilimmiut",
{"Eastern Canadian Inuktitut", "Eastern Canadian Inuit"},
{"Inuinnaq", "Inuinnaqtun"},
{"Inuvialuktun", "Inuvialuk", "Western Canadian Inuktitut", "Western Canadian Inuit", "Western Canadian Inuktun"},
"Kivallirmiut",
"Natsilingmiut", "Nunavimmiutit", "Nunatsiavummiut",
{"Siglitun", "Siglit"}},
}
m["ja"] = {
aliases = {"ญี่ปุ่นใหม่", "Japanese", "Modern Japanese", "Nipponese", "Nihongo"},
}
m["jv"] = {
aliases = {"Javanese"},
}
m["ka"] = {
aliases = {"Georgian"},
varieties = {{"จอร์เจียแบบยิว", "Judeo-Georgian", "Kivruli", "Gruzinic"}},
}
m["kg"] = {
aliases = {"Kongo", "Kikongo"},
varieties = {"Koongo", "Laari", "San Salvador Kongo", "Yombe"},
}
m["ki"] = {
aliases = {"กีกูยู", "Kikuyu", "Gikuyu", "Gĩkũyũ"},
}
m["kj"] = {
aliases = {"Kuanyama", "Oshikwanyama"},
}
m["kk"] = {
aliases = {"คาซัคสถาน", "Kazakh"},
}
m["kl"] = {
aliases = {"กะลาลลิซุต", "Greenlandic", "Kalaallisut"},
}
m["km"] = {
aliases = {"กัมพูชา", "เขมรตอนกลาง", "เขมรใหม่", "Khmer", "Cambodian", "Central Khmer", "Modern Khmer"},
}
m["kn"] = {
aliases = {"กันนาดา", "Kannada"},
}
m["ko"] = {
aliases = {"เกาหลีใหม่", "Korean", "Modern Korean"},
}
m["kr"] = {
aliases = {"กานัวรี", "Kanuri"},
varieties = {"Kanembu", "Bilma Kanuri", "Central Kanuri", "Manga Kanuri", "Tumari Kanuri"},
}
m["ks"] = {
aliases = {"กัศมีร์", "Kashmiri", "Koshur"},
}
-- "kv" is treated as "koi", "kpv", see [[WT:LT]]
m["kw"] = {
aliases = {"คอร์นิช", "Cornish"},
}
m["ky"] = {
aliases = {"คีร์กีซสถาน", "Kyrgyz", "Kirghiz", "Kirgiz"},
}
m["la"] = {
aliases = {"ลาติน", "Latin"},
}
m["lb"] = {
aliases = {"Luxembourgish"},
}
m["lg"] = {
aliases = {"Luganda", "Ganda", "Oluganda"},
}
m["li"] = {
aliases = {"Limburgish", "Limburgan", "Limburgian", "Limburgic"},
}
m["ln"] = {
aliases = {"กาลา", "Lingala", "Ngala"},
}
m["lo"] = {
aliases = {"Lao", "Laotian"},
}
m["lt"] = {
aliases = {"Lithuanian"},
}
m["lu"] = {
}
m["lv"] = {
aliases = {"Latvian", "Lettish", "Lett"},
}
m["mg"] = {
aliases = {"Malagasy"},
varieties = {
{"Antankarana", "Antankarana Malagasy"},
{"Bara Malagasy", "Bara"}, {"Betsimisaraka Malagasy", "Betsimisaraka"}, {"Northern Betsimisaraka Malagasy", "Northern Betsimisaraka"}, {"Southern Betsimisaraka Malagasy", "Southern Betsimisaraka"}, {"Bushi", "Shibushi", "Kibushi"},
{"Masikoro Malagasy", "Masikoro"},
"Plateau Malagasy",
"Sakalava",
{"Tandroy Malagasy", "Tandroy"}, {"Tanosy", "Tanosy Malagasy"}, "Tesaka", {"Tsimihety", "Tsimihety Malagasy"}},
}
m["mh"] = {
aliases = {"Marshallese"},
}
m["mi"] = {
aliases = {"เมารี", "Maori", "Māori"},
}
m["mk"] = {
aliases = {"Macedonian"},
}
m["ml"] = {
aliases = {"มลยาลัม", "มาลายาลัม", "Malayalam"},
}
m["mn"] = {
aliases = {"Mongolian"},
varieties = {"Khalkha Mongolian"},
}
-- "mo" is treated as "ro", see [[WT:LT]]
m["mr"] = {
aliases = {"Marathi"},
}
m["ms"] = {
aliases = {"มาเลย์", "มลายู", "มลายูมาตรฐาน", "มลายูแบบมาเลเซีย", "Malay", "Malaysian", "Standard Malay"},
}
m["mt"] = {
aliases = {"Maltese"},
}
m["my"] = {
aliases = {"เมียนมา", "Burmese", "Myanmar"},
varieties = {"Mandalay Burmese", "Myeik Burmese", "Palaw Burmese", {"Rangoon Burmese", "Yangon Burmese"}, "Yaw Burmese"},
}
m["na"] = {
aliases = {"Nauruan", "Nauru"},
}
m["nb"] = {
aliases = {"บุ๊กมอล", "Norwegian Bokmål", "Bokmål"},
}
m["nd"] = {
aliases = {"North Ndebele"},
}
m["ne"] = {
aliases = {"เนปาลี", "Nepali", "Nepalese"},
varieties = {"Palpa"}, -- 3832956, former "plp", retired by ISO as spurious
}
m["ng"] = {
}
m["nl"] = {
aliases = {"Dutch"},
varieties = {{"เนเธอร์แลนด์", "Netherlandic"}, {"เฟลมิช", "Flemish"}}, -- FIXME, check this
}
m["nn"] = {
aliases = {"นอร์เวย์ใหม่", "นือนอสก์", "Norwegian Nynorsk", "New Norwegian", "Nynorsk"},
}
m["no"] = {
aliases = {"Norwegian"},
}
m["nr"] = {
aliases = {"South Ndebele"},
}
m["nv"] = {
aliases = {"Navajo", "Navaho", "Diné bizaad"},
}
m["ny"] = {
aliases = {"จีเจวา", "เชวา", "ชีเชวา", "Chichewa", "Chicheŵa", "Chinyanja", "Nyanja", "Chewa", "Cicewa", "Cewa", "Cinyanja"},
}
m["oc"] = {
aliases = {"อ็อกซิตัน", "Occitan"},
-- don't list varieties here that are in [[Module:etymology languages/data]]
}
m["oj"] = {
aliases = {"Ojibwe", "Ojibway", "Ojibwa"},
varieties = {{"Chippewa", "Ojibwemowin", "Southwestern Ojibwa"}},
}
m["om"] = {
aliases = {"Oromo"},
varieties = {"Orma", "Borana-Arsi-Guji Oromo", "West Central Oromo"},
}
m["or"] = {
aliases = {"โอเดีย", "Oriya", "Odia", "Oorya"},
}
m["os"] = {
aliases = {"Ossetian", "Ossete", "Ossetic"},
varieties = {"Digor", "Iron"},
}
m["pa"] = {
aliases = {"ปัญจาบี", "Punjabi", "Panjabi"},
}
m["pi"] = {
aliases = {"บาฬี", "ปาลิ", "ปาลี", "ปาฬิ", "ปาฬี", "Pali"},
}
m["pl"] = {
aliases = {"โปลิช", "Polish"},
}
m["ps"] = {
aliases = {"ปัชโต", "ปัชตุน", "ปุชโต", "ปัชตู", "อัฟกัน", "Pashto", "Pashtun", "Pushto", "Pashtu", "Afghani"},
varieties = {
{"ปาทานตอนกลาง", "ปัชโตตอนกลาง", "Central Pashto"},
{"ปาทานเหนือ", "ปัชโตเหนือ", "Northern Pashto"},
{"ปาทานใต้", "ปัชโตใต้", "Southern Pashto"},
{"Pukhto", "Pakhto", "Pakkhto"}
},
}
m["pt"] = {
aliases = {"โปรตุเกสใหม่", "Portuguese", "Modern Portuguese"},
}
m["qu"] = {
aliases = {"Quechua"},
}
m["rm"] = {
aliases = {"โรแมนช์", "โรมานช์", "โรมอนช์", "รูแมนช์", "รูเมานช์", "รูเมินช์", "Romansch", "Romansh", "Rumantsch", "Romanche"},
-- don't list varieties here that are in [[Module:etymology languages/data]]
varieties = {"Sursilvan-Oberland"}, -- extra variety in Glottolog; main varieties have their own etym codes
}
m["ro"] = {
aliases = {"รูมาเนีย", "Romanian", "Daco-Romanian", "Roumanian", "Rumanian"},
}
m["ru"] = {
aliases = {"Russian"},
}
m["rw"] = {
-- don't list varieties here that are in [[Module:etymology languages/data]]
aliases = {"Rwanda-Rundi"},
varieties = {{"Ha", "Giha"}, "Hangaza", "Vinza", "Shubi"}, -- Deleted "Subi", which normally refers to a different language
}
m["sa"] = {
aliases = {"Sanskrit"},
}
m["sc"] = {
aliases = {"Sardinian"},
-- don't list varieties here that are in [[Module:etymology languages/data]]
}
m["sd"] = {
aliases = {"สินธี", "Sindhi"},
}
m["se"] = {
aliases = {"Northern Sami", "North Sami", "Northern Saami", "North Saami"},
}
m["sg"] = {
aliases = {"Sango"},
}
m["sh"] = {
aliases = {"Serbo-Croatian", "BCS", "Croato-Serbian", "Serbocroatian"},
-- don't list varieties here that are in [[Module:etymology languages/data]]
varieties = {
{"บอสเนีย", "Bosnian"},
{"โครเอเชีย", "Croatian"},
{"มอนเตเนโกร", "Montenegrin"},
{"เซอร์เบีย", "Serbian"},
"Shtokavian"
},
}
m["si"] = {
aliases = {"Sinhalese", "Singhalese", "Sinhala"},
}
m["sk"] = {
aliases = {"Slovak"},
}
m["sl"] = {
aliases = {"สโลเวเนีย", "สโลวีน", "Slovene", "Slovenian"},
}
m["sm"] = {
aliases = {"Samoan"},
}
m["sn"] = {
aliases = {"Shona"},
}
m["so"] = {
aliases = {"Somali"},
}
m["sq"] = {
aliases = {"Albanian"},
-- don't list varieties here that are in [[Module:etymology languages/data]]
}
m["ss"] = {
aliases = {"สวาตี", "Swazi", "Swati"},
}
m["st"] = {
aliases = {"โซโท", "Sotho", "Sesotho", "Southern Sesotho", "Southern Sotho"},
}
m["su"] = {
aliases = {"Sundanese"},
}
m["sv"] = {
aliases = {"สวีดิช", "Swedish"},
}
m["sw"] = {
aliases = {"Swahili"},
varieties = {{"Settler Swahili", "KiSetla", "KiSettla", "Setla", "Settla", "Kitchen Swahili"}, {"Kihindi", "Indian Swahili"}, {"KiShamba", "Kishamba", "Field Swahili"}, {"Kibabu", "Asian Swahili"}, {"Kimanga", "Arab Swahili"}, {"Kitvita", "Army Swahili"}},
}
m["ta"] = {
aliases = {"Tamil"},
}
m["te"] = {
aliases = {"Telugu"},
}
m["tg"] = {
aliases = {"ทาจิกิสถาน", "เปอร์เซียแบบทาจิก", "Tajik", "Eastern Persian", "Tadjik", "Tadzhik", "Tajiki", "Tajik Persian", "Tajiki Persian"},
}
m["th"] = {
aliases = {"สยาม", "ไทยตอนกลาง", "Thai", "Siamese", "Central Thai"},
}
m["ti"] = {
aliases = {"ทิกรินยา", "Tigrinya"},
}
m["tk"] = {
aliases = {"เติร์กเมนิสถาน", "Turkmen"},
}
m["tl"] = {
aliases = {"Tagalog"},
}
m["tn"] = {
aliases = {"Tswana", "Setswana"},
}
m["to"] = {
aliases = {"ตองกา", "Tongan"},
}
m["tr"] = {
aliases = {"เติร์ก", "Turkish"},
}
m["ts"] = {
aliases = {"Xitsonga"},
}
m["tt"] = {
aliases = {"Tatar"},
}
-- "tw" is treated as "ak", see [[WT:LT]]
m["ty"] = {
aliases = {"Tahitian"},
}
m["ug"] = {
aliases = {"Uyghur", "Uigur", "Uighur", "Uygur"},
}
m["uk"] = {
aliases = {"Ukrainian"},
}
m["ur"] = {
aliases = {"Urdu"},
}
m["uz"] = {
aliases = {"อุซเบกิสถาน", "Uzbek"},
varieties = {
{"อุซเบกเหนือ", "Norther Uzbek"},
{"อุซเบกใต้","Southern Uzbek"}
},
}
m["ve"] = {
aliases = {"Venda"},
}
m["vi"] = {
aliases = {"ญวน", "อันนัม", "อนัม", "อนำ", "อานำ", "อานัม", "Vietnamese", "Annamese", "Annamite"},
}
m["vo"] = {
aliases = {"Volapük"},
}
m["wa"] = {
aliases = {"Walloon"},
varieties = {"Liégeois", "Namurois", "Wallo-Picard", "Wallo-Lorrain"},
}
m["wo"] = {
aliases = {"Wolof"},
varieties = {"Gambian Wolof"}, -- the subsumed dialect 'wof'
}
m["xh"] = {
aliases = {"Xhosa"},
}
m["yi"] = {
aliases = {"อิดดิช", "Yiddish"},
varieties = {"American Yiddish", "Daytshmerish Yiddish", "Mideastern Yiddish", "Galitzish",
{"Northeastern Yiddish", "Litvish", "Lithuanian Yiddish"},
{"Northwestern Yiddish", "Netherlandic Yiddish"},
{"Polish Yiddish", "Poylish"},
"South African Yiddish",
{"Southeastern Yiddish", "Ukrainian Yiddish", "Ukrainish"},
{"Southwestern Yiddish", "Judeo-Alsatian"},
"Udmurtish"
},
pseudo_families = "qfa-jew",
}
m["yo"] = {
aliases = {"Yoruba"},
}
m["za"] = {
aliases = {"Zhuang"},
-- FIXME, are all of the following distinct?
varieties = {
"Chongzuo Zhuang",
"Guibei Zhuang", "Guibian Zhuang",
"Central Hongshuihe Zhuang", "Eastern Hongshuihe Zhuang",
"Lianshan Zhuang", "Liujiang Zhuang", "Liuqian Zhuang",
{"Min Zhuang", "Minz Zhuang"},
"Nong Zhuang", -- see zhn
"Qiubei Zhuang",
"Shangsi Zhuang",
{"Dai Zhuang", "Wenma", "Wenma Thu", "Wenma Zhuang"},
"Yang Zhuang",
{"Yongbei Zhuang", "Wuming Zhuang", "Standard Zhuang"},
"Yongnan Zhuang", "Youjiang Zhuang",
"Zuojiang Zhuang"},
}
m["zh"] = {
aliases = {"Chinese"},
}
m["zu"] = {
aliases = {"อีซีซูลู", "Zulu", "isiZulu"},
}
return m
k3b9c3v5lsyq239w2i49blrjtnpgq0e
มอดูล:languages/data/3/g/extra
828
312319
5775700
5723238
2026-10-19T12:30:12Z
Octahedron80
267
5775700
Scribunto
text/plain
local m = {}
m["gaa"] = {
}
m["gab"] = {
aliases = {"Southern Gabri"},
}
m["gac"] = {
other_names = {"Great Andamanese creole", "Great Andamanese"},
}
m["gad"] = { -- not to be confused with gdk, gdg
other_names = {"Cagayan"},
}
m["gae"] = {
aliases = {"Baniwa of Guainía", "Baniwa of Maroa", "Warekena", "Guarequena", "Arekena"},
varieties = {{"Baniwa of Guainia", "Baniwa of Guainía"}, {"Warekena of Xie", "Warekena of Xié"}},
}
m["gaf"] = {
other_names = {"Gendeka", "Gene"},
}
m["gag"] = {
aliases = {"กากาอูซียา", "Gagauz"},
}
m["gah"] = {
other_names = {"Gahuku"},
}
m["gai"] = {
varieties = {"Borewar", "Boroi", "Botbot"},
}
m["gaj"] = {
varieties = {"Nuclear Gadsup", "Oyana"},
}
m["gak"] = {
}
m["gal"] = {
other_names = {"Galolen", "Talur"},
}
m["gam"] = {
-- There is a sister language Narak, which Wikipedia implies is different from the Narake alias of Kandawo,
-- but it may be confused.
aliases = {"Narake"},
}
m["gan"] = {
aliases = {"จีนกั้น", "Gan"},
}
m["gao"] = {
other_names = {"Gaj"},
}
m["gap"] = {
}
m["gaq"] = {
}
m["gar"] = {
}
m["gas"] = {
}
m["gat"] = {
}
m["gau"] = {
other_names = {"Gadaba", "San Gadaba", "Gadba", "Sano", "Kondekar", "Kondkor", "Konḍekor Gadaba", "Mudhili Gadaba"},
}
m["gaw"] = {
aliases = {"Nobanob", "Nobnob", "Garuh"}, -- Garuh is an alias per Wikipedia
varieties = {{"Ari", "Ari (Papua New Guinea)"}},
}
m["gay"] = {
}
m["gbb"] = {
}
m["gbd"] = {
aliases = {"Garadjari", "Karajarri"},
}
m["gbe"] = {
varieties = {"Gabiano", "Meiyari", "Setiali"},
}
m["gbf"] = {
}
m["gbg"] = {
other_names = {"Banziri", "Gbandere", "Gbanzili"},
}
m["gbh"] = {
}
m["gbi"] = {
varieties = {{"Kadai", "Kadai (Galela)"}, "Kadina", "Morotai", "Sopi"},
}
m["gbj"] = {
other_names = {"Gutob", "Gadaba", "Gadba", "Gutop", "Gudwa", "Godwa", "Gadwa", "Boi Gadaba"},
}
m["gbk"] = {
}
m["gbl"] = {
}
m["gbm"] = {
}
m["gbn"] = {
}
m["gbo"] = {
}
m["gbp"] = {
other_names = {"Bossangoa", "Gbaya of Bossangoa"},
}
m["gbq"] = {
other_names = {"Bozom", "Gbaya of Bozom", "Gbaya-Bozom"},
}
m["gbr"] = {
}
m["gbs"] = {
}
m["gbu"] = {
}
m["gbv"] = {
}
m["gbw"] = {
aliases = {"Gabi-Gabi", "Gabi Gabi", "Gubbi-Gubbi", "Gubbi Gubbi"}, -- contrast xby
}
m["gbx"] = {
other_names = {"Houla", "Kpla", "Offra", "Ophra", "Phla", "Pla", "Popo", "Xwla"},
}
m["gby"] = {
}
m["gcc"] = {
}
m["gcd"] = {
}
m["gce"] = {
}
m["gcf"] = {
other_names = {"Antillean Creole French", "Guadeloupean Creole", "Guadeloupean Creole French", "Saint Lucian Creole", "Saint Lucian Creole French"},
}
m["gcl"] = {
}
m["gcn"] = {
varieties = {{"Bareji", "Bareji (Gaina)"}, "Nuclear Gaina"},
}
m["gcr"] = {
other_names = {"French Guianese Creole", "Guianese French Creole", "Guyanais", "Guyanese French Creole"},
}
m["gct"] = {
other_names = {"Alemán Coloniero"},
}
m["gdb"] = {
other_names = {"Pottangi Ollar Gadaba", "Ollar Gadaba", "Ollaro", "Hallari", "Allar", "Hollar Gadbas"},
}
m["gdc"] = {
}
m["gdd"] = {
}
m["gde"] = {
}
m["gdf"] = {
}
m["gdg"] = { -- not to be confused with gad, gdk
}
m["gdh"] = {
}
m["gdi"] = {
}
m["gdj"] = {
other_names = {"Gurdjar", "Kunggara"},
}
m["gdk"] = { -- not to be confused with gad, gdg
}
m["gdl"] = {
}
m["gdm"] = {
}
m["gdn"] = {
varieties = {"East Umanakaina", "Upper Ugu River"},
}
m["gdo"] = {
aliases = {"Ghodoberi"},
}
m["gdq"] = {
aliases = {"Mahri"},
}
m["gdr"] = {
-- per Glottolog:
varieties = {"Abam", "Dorogori", "Gamaewe", "Guiam", "Iamega", "Kapal", "Kuru", "Peawa", "Podari", "Rual",
{"Ume", "Ume (Papua New Guinea)"}, "Wipim", "Woigo", "Wonie", "Yuta"},
}
m["gds"] = {
}
m["gdt"] = {
}
m["gdu"] = {
}
m["gdx"] = {
}
m["gea"] = {
}
m["geb"] = {
}
m["gec"] = {
}
m["ged"] = {
}
m["geg"] = {
}
m["geh"] = {
aliases = {"Hutterite German", "Tirolean"},
}
m["gei"] = {
}
m["gej"] = {
}
m["gek"] = {
other_names = {"Yiwom"},
}
m["gel"] = {
other_names = {"Kag-Fer-Jiir-Koor-Ror-Us-Zuksun", "ut-Ma'in", "Fakai", "Kag", "Puku", "Fakanchi", "Et-Kag", "Jiir", "Gelanchi", "Et-Jiir", "Kur", "Kere", "Kar", "Keri-Ni", "Kelli-Ni", "Kelanchi", "Kelinci", "Zuksun", "Zussun", "Et-Zuksun", "Ror", "Et-Maror", "Tudanchi", "Er-Gwar", "Fer", "Fere", "Et-Fer", "Wipsi-Ni", "Kukum", "Us", "Et-Us", "Koor", "Kulu"},
}
m["geq"] = {
}
m["ges"] = {
}
m["gev"] = {
aliases = {"Eviya"},
}
m["gew"] = {
}
m["gex"] = {
}
m["gey"] = {
}
m["gez"] = {
aliases = {"เอธิโอเปีย", "Ge'ez", "Ethiopic", "Gi'iz", "Geez"},
}
m["gfk"] = {
}
m["gft"] = {
}
m["gga"] = {
}
m["ggb"] = {
}
m["ggd"] = {
}
m["gge"] = {
}
m["ggg"] = {
}
m["ggk"] = {
}
m["ggl"] = {
}
m["ggt"] = {
}
m["ggu"] = {
}
m["ggw"] = {
}
m["gha"] = {
aliases = {"Ghadamès"},
}
m["ghc"] = {
aliases = {"ไอริชใหม่ช่วงต้น", "แกลิกใหม่ช่วงต้น", "Classical Gaelic", "Early Modern Irish", "Early Modern Gaelic", "Hiberno-Scottish Gaelic"},
}
m["ghe"] = {
}
m["ghh"] = {
}
m["ghk"] = {
}
m["ghl"] = {
}
m["ghn"] = {
}
m["gho"] = {
}
m["ghr"] = {
}
m["ghs"] = {
varieties = {"Sekare"},
}
m["ght"] = {
}
m["gia"] = {
}
m["gib"] = {
}
m["gid"] = {
}
m["gie"] = {
aliases = {"Gabogbo", "Gaɓogbo"}, -- Gabogbo is Glottolog's name
}
m["gig"] = {
}
m["gih"] = {
}
m["gii"] = {
aliases = {"Gariire"},
}
m["gil"] = {
aliases = {"คิริบาส", "Gilbertese", "Kiribati", "Kiribatese"},
}
m["gim"] = {
aliases = {"Gimi", "Gimi (Goroka)", "Papuan Gimi", "Labogai"},
varieties = {"East Gimi", "West Gimi"},
}
m["gin"] = {
aliases = {"Hinuq", "Hinux", "Ginukh", "Ginux"},
}
m["gip"] = {
aliases = {"Gimi", "Austronesian Gimi", "Loko"},
}
m["giq"] = {
other_names = {"Hagei", "Hakhi"},
}
m["gir"] = {
other_names = {"Vandu"},
}
m["gis"] = {
}
m["git"] = {
}
m["giu"] = {
}
m["giw"] = {
other_names = {"Telue", "Doulou", "Tolo"},
}
m["gix"] = {
}
m["giy"] = {
}
m["giz"] = {
}
m["gji"] = {
}
m["gjk"] = {
}
m["gjm"] = {
}
m["gjn"] = {
}
m["gjr"] = {
}
m["gju"] = {
aliases = {"Gojari", "Gujari", "Gujuri", "Gujjari", "Gujri", "Gurjari"},
}
m["gka"] = {
}
m["gkd"] = {
aliases = {"Magɨ"},
}
m["gke"] = {
}
m["gkn"] = {
}
m["gko"] = {
}
m["gkp"] = {
}
m["glc"] = {
}
m["gld"] = {
other_names = {"Goldi", "Hezhen"},
}
m["glh"] = {
}
m["glj"] = {
}
m["glk"] = {
}
m["glo"] = {
}
m["glr"] = {
}
m["glu"] = {
aliases = {"Sara Gula"},
}
m["glw"] = {
}
m["gly"] = {
}
m["gma"] = {
}
m["gmb"] = {
}
m["gmd"] = {
}
m["gmg"] = {
aliases = {"Magɨyi"},
}
m["gmh"] = {
aliases = {"Middle High German"},
}
m["gml"] = {
aliases = {"Middle Low German"},
}
m["gmm"] = {
}
m["gmn"] = {
}
m["gmr"] = {
aliases = {"Mirniny"},
}
m["gmu"] = {
}
m["gmv"] = {
aliases = {"เกมู", "Gamo", "Gemu"},
}
m["gmx"] = {
}
m["gmy"] = {
aliases = {"Mycenaean Greek"},
}
m["gmz"] = {
other_names = {"Mgbolizhia"},
}
m["gna"] = {
}
m["gnb"] = {
}
m["gnc"] = {
}
m["gnd"] = {
other_names = {"Zulgo", "Gemzek", "Mineo"},
}
m["gne"] = {
}
m["gng"] = {
}
m["gnh"] = {
}
m["gni"] = {
aliases = {"Guniyandi"},
}
m["gnj"] = {
aliases = {"Ngen"},
}
m["gnk"] = {
aliases = {"Gana", "Gǁana", "Gxana", "Dxana", "Xgana"},
}
m["gnl"] = {
}
m["gnm"] = {
}
m["gnn"] = {
}
m["gnq"] = {
}
m["gnr"] = {
}
m["gnt"] = {
aliases = {"Warta Thuntai"}, -- Glottolog's name; their code shows they formerly used Guntai
varieties = {"Balamuk", "Bensbach", "Korombo 1", "Korombo 2", {"Wando", "Wando (Kan)"}},
}
m["gnu"] = {
}
m["gnw"] = {
other_names = {"Simba", "Simba Guarani"},
}
m["gnz"] = {
}
m["goa"] = {
}
m["gob"] = {
}
m["goc"] = {
}
m["god"] = {
}
m["goe"] = {
}
m["gof"] = {
aliases = {"โกฟฟา", "Gofa", "Goffa"},
}
m["gog"] = {
}
m["goh"] = {
aliases = {"เยอรมันสูงโบราณ", "Old High German"},
}
m["goi"] = {
aliases = {"Gobosi", "Gebusi", "Nomad"},
-- possibly Bibo and Nuclear Gobasi are the same
varieties = {"Honibo", "Nuclear Gobasi", "Oiba", "Bibo"},
}
m["goj"] = {
}
-- gok is a spurious language, see [[w:Spurious languages]]
m["gol"] = {
}
m["gon"] = {
aliases = {"Gondi"},
varieties = {"Southern Gondi", "Northern Gondi", "Aheri Gondi", "Adilabad Gondi", "Dorla Gondi", "Koya Gondi", "Maria Gondi", "Muria Gondi", "Raj Gondi"},
}
m["goo"] = {
}
m["gop"] = {
}
m["goq"] = {
}
m["gor"] = {
}
m["got"] = {
aliases = {"กอทิก", "กอทิค", "กอธิก", "กอธิค", "โกทิก", "โกทิค", "โกธิก", "โกธิค", "Gothic"},
}
m["gou"] = {
aliases = {"Gawar"},
}
m["gov"] = {
}
m["gow"] = {
aliases = {"Gorowa"},
}
m["gox"] = {
}
m["goy"] = {
}
m["goz"] = {
}
m["gpa"] = {
}
m["gpn"] = {
other_names = {"Tayap", "Gapun"},
pseudo_families = "paa",
}
m["gqa"] = {
}
m["gqi"] = {
aliases = {"Guìqióng", "Guichong"},
}
m["gqn"] = { -- a variety of 'ter'
other_names = {"Guana", "Guaná", "Guana (Brazil)", "Arawakan Guana"},
}
m["gqr"] = {
}
m["gqu"] = {
other_names = {"Gao", "Aqao", "Qau Gelao"},
}
m["gra"] = {
}
m["grc"] = {
aliases = {"กรีกคลาสสิก", "Ancient Greek", "Classical Greek"},
varieties = {"Egyptian Ancient Greek"},
}
m["grd"] = {
}
m["grg"] = {
aliases = {"Madi (Papua New Guinea)", "Gira", "Girara", "Gorovu"},
}
m["grh"] = {
}
m["gri"] = {
other_names = {"Gari", "Tangarare", "Sughu", "West Guadalcanal"},
}
m["grj"] = {
}
m["grm"] = {
}
m["gro"] = {
}
m["grq"] = {
}
m["grs"] = {
}
m["grt"] = {
aliases = {"Garo", "Garrow", "Mandi", "Mande"},
}
m["gru"] = {
other_names = {"Soddo", "Aymälläl"},
}
m["grv"] = {
}
m["grw"] = {
}
m["grx"] = {
aliases = {"Muno"}, -- per Glottolog
}
m["gry"] = {
}
m["grz"] = {
}
m["gse"] = {
}
m["gsg"] = {
aliases = {"Deutsche Gebärdensprache"},
}
m["gsl"] = {
}
m["gsm"] = {
}
m["gsn"] = {
}
m["gso"] = {
}
m["gsp"] = {
}
m["gss"] = {
}
m["gsw"] = {
aliases = {"เยอรมันแบบสวิส", "Alemannic German", "Swiss German"},
varieties = {"Walser German", "Walserdeutsch", "Walser", "Wallisertiitsch", "Italian Walser", "Pomattertitsch", "Formazza", "Kampel", "Remmaljertittschu", "Rimella", "Chalchoufe", "Titzschu", "Alagna", "Greschóneytitsch", "Greschóney", "Greschoney", "Gressoney", "Éischemtöitschu", "Issime"},
}
m["gta"] = {
pseudo_families = "sai",
}
m["gtu"] = {
aliases = {"Aghu Tharnggala", "Aghu Tharnggalu", "Tharrnggala", "Gogo Mini", "Kuku Mini"},
}
m["gua"] = {
}
m["gub"] = {
}
m["guc"] = {
aliases = {"Guajiro", "Goajiro", "Uagiro"},
}
m["gud"] = {
}
m["gue"] = {
}
m["guf"] = {
}
m["gug"] = {
aliases = {"Paraguayan Guarani", "Jopará", "Yopará"},
}
m["guh"] = {
aliases = {"Sikuani"},
}
m["gui"] = {
other_names = {"Ava Guaraní", "Chiriguanos"},
}
m["guk"] = {
}
m["gul"] = {
other_names = {"Geechee", "Sea Island Creole English"},
}
m["gum"] = {
}
m["gun"] = {
other_names = {"Mbyá", "Mbya", "Mbyhá", "Mbiá", "Mbua", "Mbüá", "Mbü'a", "Mbü'a Guaraní", "Jeguaká Tenondé", "Bwihá", "Caiua", "Kaiwá", "Kayová", "Cahygua", "Caingua"},
}
m["guo"] = {
}
m["gup"] = {
other_names = {"Bininj Gunwok", "Bininj Gun-Wok", "Bininj Kunwok", "Bininj Kun-Wok", "Kunwinjkuan", "Kunwinjku", "Gunwinjgu", "Kuninjku", "Kundjeyhmi", "Gundjeihmi", "Manyallaluk Mayali", "Mayali", "Kundedjnjenghmi", "Kune Dulerayek", "Kune Narayek", "Kune"},
}
m["guq"] = {
other_names = {"Guayaki"},
}
m["gur"] = {
aliases = {"แฟร์แฟร์", "Frafra", "Farefare"},
other_names = {"Gurene", "Gurenɛ", "Gurenne", "Gudenne", "Gudeni", "Zuadeni", "Nankani", "Naani", "Nankanse", "Ninkare", "Booni"},
}
m["gus"] = {
}
m["gut"] = {
}
m["guu"] = {
aliases = {"Yãnomãmɨ", "Yãnomamɨ", "Yąnomamö", "Yanomami", "Yanomamï", "Yanomamỳ", "Occidental Yanomami", "Xamathari", "Xamatari", "Shamatari", "Xamatauteri", "Guaica", "Guajaribo", "Guaharibo"},
varieties = {"Cobari"},
}
m["guv"] = {
}
m["guw"] = {
other_names = {"Gun-Gbe", "Gungbe"},
}
m["gux"] = {
}
m["guz"] = {
}
m["gva"] = {
other_names = {"Guana", "Guaná", "Guana (Paraguay)", "Mascoian Guana"},
}
m["gvc"] = {
}
m["gve"] = {
}
m["gvf"] = {
varieties = {"Kia", "Marigl", "Nuclear Golin", "Yuri"},
}
m["gvj"] = {
other_names = {"Awá", "Ayaya", "Guaxare", "Wazaizara"},
varieties = {"Anambé of Ehrenreich", "Anambe of Ehrenreich"}, -- tentatively putting here, though it could also be given its own code
}
m["gvl"] = {
}
m["gvm"] = {
}
m["gvn"] = {
}
m["gvo"] = {
other_names = {"Gavião of Jiparaná", "Digüt", "Ikolen", "Gavião do Rondônia", "Zoró"},
}
m["gvp"] = {
}
m["gvr"] = {
}
m["gvs"] = {
}
m["gvy"] = {
}
m["gwa"] = {
}
m["gwb"] = {
}
m["gwc"] = {
}
m["gwd"] = {
}
m["gwe"] = {
}
m["gwf"] = {
}
m["gwg"] = {
}
m["gwi"] = {
other_names = {"Gwich’in", "Kutchin", "Takudh", "Tukudh", "Loucheux"},
}
m["gwj"] = {
aliases = {"Gǀwi", "Gǀui", "ǀGwi", "Dcui", "Gcui", "Cgui"},
}
m["gwm"] = {
}
m["gwn"] = {
}
m["gwr"] = {
}
m["gwt"] = {
}
m["gwu"] = {
}
m["gww"] = {
}
m["gwx"] = {
}
m["gxx"] = {
}
m["gya"] = {
}
m["gyb"] = {
}
m["gyd"] = {
}
m["gye"] = {
}
m["gyf"] = {
}
m["gyg"] = {
}
m["gyi"] = {
}
m["gyl"] = {
}
m["gym"] = {
aliases = {"Guaymí", "Guayami", "Movere", "Chiriquí", "Valiente"},
}
m["gyn"] = {
aliases = {"Guyanese Creole", "Creolese", "Guyanese"},
}
m["gyo"] = {
}
m["gyr"] = {
aliases = {"Gwarayú"},
}
m["gyy"] = {
}
m["gza"] = {
}
m["gzn"] = {
aliases = {"Giman"},
}
return m
rzpms0l16hx8h4dpp0pk5d50mc2e5r2
มอดูล:languages/data/3/f/extra
828
312325
5775701
5684389
2026-10-19T12:31:30Z
Octahedron80
267
5775701
Scribunto
text/plain
local m = {}
m["faa"] = {
other_names = {"Namumi", "Namome", "Namo Me", "Kaipu", "Kaibu", "Some"},
pseudo_families = "paa",
}
m["fab"] = {
other_names = {"Fa d'Ambu"},
}
m["fad"] = {
aliases = {"Wagi (Papua New Guinea)"}, -- Glottolog
}
m["faf"] = {
aliases = {"Faghani"},
}
m["fag"] = {
}
m["fah"] = {
aliases = {"Fali of Baissa"},
}
m["fai"] = {
varieties = {"Angkiyakmin", "Faiwolmin", "Wopkeimin"},
}
m["faj"] = {
aliases = {"Faita", "Kulsab"},
}
m["fak"] = {
aliases = {"Fang", "Fang (Cameroon)"},
}
m["fal"] = {
}
m["fam"] = {
}
m["fan"] = {
aliases = {"Pahouin", "Fang (Equatorial Guinea)", "Fang (Gabon)", "Fang"},
}
m["fap"] = {
other_names = {"Paloor", "Falor", "Palar", "Sili", "Sili-Sili", "Waro"},
}
m["far"] = {
}
m["fau"] = {
}
m["fax"] = {
aliases = {"Fala"},
other_names = {"Xalimego"},
}
m["fay"] = {
}
m["faz"] = {
}
m["fbl"] = {
aliases = {"West Albay Bikol"}, -- our former name, ISO's name
}
m["fcs"] = {
}
m["fer"] = {
}
m["ffi"] = {
}
m["fgr"] = {
}
m["fia"] = {
}
m["fie"] = {
}
m["fif"] = {
aliases = {"Fayfi", "Fifi"},
}
m["fip"] = {
}
m["fir"] = {
}
m["fit"] = {
aliases = {"Tornedalen Finnish"},
}
m["fiw"] = {
}
m["fkk"] = {
aliases = {"Kirya-Konzəl"},
}
m["fkv"] = {
}
m["fla"] = {
other_names = {"Flathead", "Salish", "Séliš", "Kalispel-Pend d'oreille", "Kalispel"},
}
m["flh"] = {
aliases = {"Abawiri"}, -- per Glottolog
}
m["fli"] = {
aliases = {"Fali of Mubi"},
}
m["fll"] = {
}
m["fln"] = {
other_names = {"Yalgawarra", "Wurima", "Mutumui"},
}
m["flr"] = {
}
m["fly"] = {
other_names = {"Flaaitaal"},
}
m["fmp"] = {
aliases = {"Feʼfeʼ"}
}
m["fmu"] = {
}
m["fng"] = {
}
m["fni"] = {
}
m["fod"] = {
}
m["foi"] = {
varieties = {"Ifigi", {"Kafa", "Kafa (Papua New Guinea)"}, "Kutubu", {"Mubi", "Mubi (Foi)"}},
}
m["fom"] = {
}
m["fon"] = {
}
m["for"] = {
varieties = {"North Central Fore", "Pamusa"},
}
m["fos"] = {
}
m["fpe"] = {
}
m["fqs"] = {
aliases = {"Momu-Fas"}, -- Glottolog's name
varieties = {"Eastern Fas", "Western Fas"},
}
m["frd"] = {
}
m["frm"] = {
aliases = {"ฝรั่งเศสยุคกลาง", "Middle French"},
}
m["fro"] = {
aliases = {"Old French"},
varieties = { {"Judeo-French", "Zarphatic"} },
}
m["frp"] = {
aliases = {"Franco-Provençal", "Arpetan", "Arpitan"},
}
m["frq"] = {
}
m["frr"] = {
aliases = {"North Frisian"},
}
m["frt"] = {
}
m["fse"] = {
}
m["fsl"] = {
}
m["fss"] = {
}
m["fud"] = {
aliases = {"Futunan", "Futunian", "Futuna"},
}
m["fuj"] = {
}
m["fum"] = {
}
m["fun"] = {
pseudo_families = "sai",
}
m["fur"] = {
aliases = {"Friulian"},
}
m["fut"] = {
}
m["fuu"] = {
}
m["fuy"] = {
pseudo_families = "paa",
}
m["fvr"] = {
}
m["fwa"] = {
}
m["fwe"] = {
}
return m
dzehh30v11tftg0vdotgql9nr7j5k7t
มอดูล:languages/data/3/e/extra
828
312329
5775702
5684388
2026-10-19T12:57:59Z
Octahedron80
267
5775702
Scribunto
text/plain
local m = {}
m["ebg"] = {
}
m["ebk"] = {
aliases = {"Eastern Bontok"},
}
m["ebr"] = {
}
m["ebu"] = {
}
m["ecr"] = {
}
m["ecs"] = {
}
m["ecy"] = {
}
m["eee"] = {
aliases = {"Ei", "Wuse", "Wusehua", "Kjang E"},
}
m["efa"] = {
}
m["efe"] = {
}
m["efi"] = {
}
m["ega"] = {
}
m["egl"] = {
aliases = {"Emilian", "Emiliano"},
}
m["ego"] = {
}
m["egy"] = {
aliases = {"อียิปต์โบราณ", "Egyptian", "Ancient Egyptian"},
}
m["ehu"] = {
}
m["eip"] = {
}
m["eit"] = {
}
m["eiv"] = {
aliases = {"Eivo"},
}
m["eja"] = {
}
m["eka"] = {
}
m["eke"] = {
}
m["ekg"] = {
varieties = {"Mapiya-Kegata", "Mee", "Simori", "Yabi"},
}
m["eki"] = {
}
m["ekl"] = {
-- FIXME, this should probably be called "Kol (Bangladesh)" as the
-- canonical name, Kolhe is hardly used.
aliases = {"Kol", "Kol (Bangladesh)"},
}
m["ekm"] = {
}
m["eko"] = {
varieties = {"Nathembo", "Sakati"}, -- Nathembo/Sakati, merged into eko by ISO, is 11030947
}
m["ekp"] = {
}
m["ekr"] = {
}
m["eky"] = {
aliases = {"Eastern Kayah"},
}
m["ele"] = {
}
m["elh"] = {
}
m["eli"] = {
}
m["elk"] = {
}
m["elm"] = {
}
m["elo"] = {
}
m["elu"] = {
}
m["elx"] = {
}
m["ema"] = {
-- FIXME, Emai is properly one of the dialects of Aoma
other_names = {"Aoma", "Ora", "Emai-Iuleha-Ora"},
}
m["emb"] = {
other_names = {"Palin", "Pari", "Sangau", "Sanggau"},
aliases = {"Maloh", "Malo", "Matoh", "Mbaloh", "Memaloh"},
varieties = {"Kalis"},
}
m["eme"] = {
other_names = {"Emerilon", "Emerion", "Mereo", "Melejo", "Mereyo", "Teco"},
}
m["emg"] = {
}
m["emi"] = {
}
m["emk"] = {
}
m["emm"] = {
}
m["emn"] = {
}
m["emp"] = {
}
m["ems"] = {
aliases = {"Alutiiq"},
}
m["emu"] = {
}
m["emw"] = {
}
m["emx"] = {
}
m["emy"] = {
other_names = {"Classic Ch'olti'an", "Ch'olti'"},
}
m["ena"] = {
varieties = {"Aci", "Aki"},
}
m["enb"] = {
}
m["enc"] = {
}
m["end"] = {
}
m["enf"] = {
}
m["enh"] = {
}
m["enl"] = {
other_names = {"Lengua"},
}
m["enm"] = {
aliases = {"อังกฤษยุคกลาง", "Middle English", "Medieval English", "Mediaeval English"},
}
m["enn"] = {
}
m["eno"] = {
}
m["enq"] = {
-- Varieties per Glottolog
varieties = {"Kaina", "Kandepe", "Kapona", "Laiagam", "Lapalama 1", "Lapalama 2", "Layapo", "Mae", "Maramuni",
"Sari", "Sau", "Tayato", "Yandapo"},
}
m["enr"] = {
aliases = {"Emumu"}, -- Glottolog; also ISO 639-3, but Emem was a proposed new value in 2007 adopted as an
-- alternative name.
}
m["enu"] = {
aliases = {"Ximoluo"},
}
m["env"] = {
}
m["enw"] = {
aliases = {"Enwan"},
}
m["enx"] = {
other_names = {"Lengua"},
}
m["eot"] = {
other_names = {"Beti"},
}
m["epi"] = {
}
m["era"] = {
}
m["erg"] = {
}
m["erh"] = {
}
m["eri"] = {
other_names = {"Erima"},
}
m["erk"] = {
other_names = {"Efate", "Vate", "Vaté"},
}
m["err"] = {
pseudo_families = "aus",
}
m["ers"] = {
other_names = {"Duoxu", "Erhsu"},
}
m["ert"] = {
}
m["erw"] = {
}
m["ese"] = {
other_names = {"Tiatinagua"},
}
m["esh"] = {
aliases = {"Eshtehardi"},
}
m["esl"] = {
}
m["esm"] = {
}
m["esn"] = {
}
m["eso"] = {
}
m["esq"] = {
pseudo_families = "nai",
}
m["ess"] = {
aliases = {"Central Siberian Yup'ik", "St. Lawrence Yupik", "St. Lawrence Yup'ik", "St. Lawrence Eskimo", "Siberian Yupik", "Siberian Yup'ik", "Siberian Yupik Eskimo", "Siberian Yup'ik Eskimo", "St. Lawrence Island Eskimo", "St. Lawrence Island Yupik", "St. Lawrence Island Yup'ik"},
}
m["esu"] = {
aliases = {"ยูปิก", "Yup'ik", "Central Alaskan Yup'ik", "Central Yupik", "Yugtun"},
}
m["esy"] = {
}
m["etb"] = {
}
m["etc"] = {
}
m["eth"] = {
}
m["etn"] = {
aliases = {"Eton"},
}
m["eto"] = {
aliases = {"Eton"},
}
m["etr"] = {
aliases = {"Etoro"},
varieties = {"Eastern Edolo", "Western Edolo"},
}
m["ets"] = {
other_names = {"Afenmai", "Afemai", "Etsako"},
}
m["ett"] = {
aliases = {"อีทรัสกัน", "Etruscan"},
}
m["etu"] = {
}
m["etx"] = {
}
m["etz"] = {
}
m["eve"] = {
aliases = {"Even"},
}
m["evh"] = {
}
m["evn"] = {
aliases = {"Evenki", "Tungus"}, --Solon goes tuw-sol
}
m["ewo"] = {
other_names = {"Kolo"},
}
m["ext"] = {
aliases = {"Extremaduran"},
}
m["eya"] = {
}
m["eyo"] = {
}
m["eza"] = {
aliases = {"Ezza", "Eza"},
}
m["eze"] = {
}
return m
9ehbw7hlldmlfevtdl17y0355lf853k
มอดูล:languages/data/3/d/extra
828
312385
5775703
5723627
2026-10-19T13:02:34Z
Octahedron80
267
5775703
Scribunto
text/plain
local m = {}
m["daa"] = {
aliases = {"Dangaleat", "Dangla", "Danal", "Dangal"},
}
m["dac"] = {
}
m["dad"] = {
}
m["dae"] = {
}
m["dag"] = {
}
m["dah"] = {
varieties = {"Dahating", "Gohing", "Gora", "Gwahamere", "Nuclear Gwahatike"},
}
m["dai"] = {
}
m["daj"] = {
}
m["dak"] = {
aliases = {"Dakota"},
}
m["dal"] = {
}
m["dam"] = {
}
m["dao"] = {
}
m["daq"] = {
other_names = {"Bison-Horn Maria", "Madia", "Madiya", "Maria (India)", "Maria"}, -- the last four are also names of daq's sibling lect, mrr
}
m["dar"] = {
aliases = {"Dargin"},
}
m["das"] = {
}
m["dau"] = {
}
m["dav"] = {
}
m["daw"] = {
}
m["dax"] = {
}
m["daz"] = {
}
m["dba"] = {
}
m["dbb"] = {
}
m["dbd"] = {
}
m["dbe"] = {
}
m["dbf"] = {
aliases = {"Elopi"},
}
m["dbg"] = {
aliases = {"Dogul Dom Dogon"},
}
m["dbi"] = {
}
m["dbj"] = {
aliases = {"อีดาฮัน", "Ida'an", "Idahan"},
}
m["dbl"] = {
}
m["dbm"] = {
}
m["dbn"] = {
}
m["dbo"] = {
}
m["dbp"] = {
}
m["dbq"] = {
}
m["dbr"] = {
}
m["dbt"] = {
aliases = {"Ben Tey Dogon"},
}
m["dbu"] = {
}
m["dbv"] = {
}
m["dbw"] = {
}
m["dby"] = { -- alias Bainapi ?
pseudo_families = "paa",
}
m["dcc"] = {
aliases = {"Dakhani", "Dakhini", "Dakhni", "Dakkani", "Dakkini", "Dakkni", "Dakkhani", "Dakkhini", "Dakkhni", "Deccan", "Deccany", "Dekhani", "Dekhini", "Duccany", "Dukhani", "Dukhni"},
}
m["dcr"] = {
aliases = {"Negerhollands"},
}
m["dda"] = {
aliases = {"Dardi Dardi", "Tati Tati", "Dadi-Dadi", "Dardi-Dardi", "Tati-Tati"},
}
m["ddd"] = {
}
m["dde"] = {
}
m["ddg"] = {
}
m["ddi"] = {
}
m["ddj"] = {
}
m["ddn"] = {
other_names = {"Dandawa", "Dendi (West Africa)", "Dendi (Benin)"},
}
m["ddo"] = {
aliases = {"Tsezi", "Dido"},
}
m["ddr"] = {
other_names = {"Yaitmathang"},
}
m["dds"] = {
}
m["ddw"] = {
}
m["dec"] = {
}
m["ded"] = {
varieties = {"Dzeigoc", "Fanic"},
}
m["dee"] = {
}
m["def"] = {
aliases = {"Dezhfili", "Dizfuli"},
}
m["deg"] = {
}
m["deh"] = {
}
m["dei"] = {
}
m["dem"] = {
pseudo_families = "paa",
}
m["dep"] = {
}
m["der"] = {
}
m["des"] = {
}
m["dev"] = {
}
m["dez"] = {
}
m["dga"] = {
}
m["dgb"] = {
aliases = {"Bunoge Dogon"},
}
m["dgc"] = {
}
m["dgd"] = {
}
m["dge"] = {
varieties = {"Degenang", "Sidbi"},
}
m["dgg"] = {
}
m["dgh"] = {
}
m["dgi"] = {
}
m["dgk"] = {
}
m["dgn"] = {
}
m["dgr"] = {
aliases = {"Tłicho", "Tlinchon"},
varieties = {"Tłı̨chǫ Yatıì", "Wıı̀lıı̀deh Yatıı̀"},
}
m["dgs"] = {
}
m["dgt"] = {
aliases = {"Ndra'ngith"},
}
m["dgw"] = {
aliases = {"Taungurong", "Dhagung-wurrung", "Thagungwurrung"},
}
m["dgx"] = {
}
m["dgz"] = {
}
m["dhd"] = {
aliases = {"Dhundari", "Jaipuri"},
}
m["dhg"] = {
}
m["dhi"] = {
}
m["dhl"] = {
}
m["dhm"] = {
other_names = {"Dhimba", "Dimba", "Oludhimba", "Oluthimba", "Otjidhimba", "Simba", "Tjimba"},
}
m["dhn"] = {
}
m["dho"] = {
}
m["dhr"] = {
aliases = {"Dhargari"},
}
m["dhs"] = {
}
m["dhu"] = {
}
m["dhv"] = {
}
m["dhw"] = {
other_names = {"Danwar", "Dhanwar", "Rai"},
}
m["dhx"] = {
}
m["dia"] = {
aliases = {"Alu-Sinagen"}, -- Glottolog's name
}
m["dib"] = {
}
m["dic"] = {
}
m["did"] = {
}
m["dif"] = {
other_names = {"Diyari", "Dirari"},
}
m["dig"] = {
other_names = {"Chidigo"},
}
m["dii"] = {
}
m["dij"] = {
}
m["dik"] = {
}
m["dil"] = {
}
m["dim"] = {
}
m["din"] = {
}
m["dio"] = {
}
m["dip"] = {
}
m["dir"] = {
}
m["dis"] = {
}
m["diu"] = {
other_names = {"Rumanyo", "Dirico", "Dciriku", "Diriku", "Rugciriku"},
}
m["diw"] = {
}
m["dix"] = {
other_names = {"Aveteian"},
}
m["diy"] = {
}
m["diz"] = {
}
m["dja"] = {
aliases = {"Dja dja wurrung"},
}
m["djb"] = {
}
m["djc"] = {
}
m["djd"] = {
aliases = {"Djamindjung"},
}
m["dje"] = {
}
m["djf"] = {
}
m["dji"] = {
}
m["djj"] = {
aliases = {"Djeebbana"},
}
m["djk"] = {
other_names = {"Ndyuka"},
}
m["djl"] = {
}
m["djm"] = {
aliases = {"Jamsay Dogon", "Jamsai"},
}
m["djn"] = {
}
m["djo"] = {
}
m["djr"] = {
}
m["dju"] = {
varieties = {"Karambit", "Nuclear Kapriman"},
}
m["djw"] = {
}
m["dka"] = {
other_names = {"Dakpakha", "Takpa", "Tawang Monpa"},
}
m["dkk"] = {
}
m["dkr"] = {
}
m["dks"] = {
}
m["dkx"] = {
}
m["dlg"] = {
}
m["dlk"] = {
aliases = {"Dahlik"},
}
m["dlm"] = {
aliases = {"Dalmatian", "Dalmatic"},
}
m["dln"] = {
}
m["dma"] = {
}
m["dmb"] = {
}
m["dmc"] = {
other_names = {"Bosiken", "Boskien", "Dimir", "Dimer"}, -- last two are erroneous per Boyd
}
m["dmd"] = {
aliases = {"Madhi-Madhi", "Madi Madi", "Madi-Madi", "Muthimuthi"},
}
m["dme"] = {
}
m["dmf"] = {
aliases = {"Medefidrin"},
}
m["dmg"] = {
aliases = {"Upper Kinabatangan"},
}
m["dmk"] = {
}
m["dml"] = {
}
m["dmm"] = {
}
m["dmo"] = {
}
m["dmr"] = {
}
m["dms"] = {
}
m["dmu"] = {
}
m["dmv"] = {
}
m["dmw"] = {
aliases = {"Mudbura"},
}
m["dmx"] = {
}
m["dmy"] = {
}
m["dna"] = {
}
m["dnd"] = {
}
m["dne"] = {
}
m["dng"] = {
aliases = {"Dungan"},
}
m["dni"] = {
varieties = {"Lower Bele", "Lower Grand Valley Hitigima", "Lower Kimbin", "Upper Bele", "Upper Pyramid"},
}
m["dnj"] = {
}
m["dnk"] = {
}
m["dnn"] = {
other_names = {"Dzùùn", "Dzuungoo", "Dzùùngoo"},
}
m["dno"] = {
aliases = {"Northern Lendu"},
}
m["dnr"] = {
}
m["dnt"] = {
}
m["dnu"] = {
}
m["dnv"] = {
}
m["dnw"] = {
}
m["dny"] = {
}
m["doa"] = {
varieties = {"Era", "Nuclear Dom"},
}
m["dob"] = {
}
m["doc"] = {
aliases = {"ก๊ำเหนือ", "Northern Kam", "Northern Gam", "Northern Dong"},
}
m["doe"] = {
}
m["dof"] = {
}
m["doh"] = {
}
m["doi"] = {
}
m["dok"] = {
}
m["dol"] = {
}
m["don"] = {
}
m["doo"] = {
}
m["dop"] = {
}
m["doq"] = {
}
m["dor"] = {
}
m["dos"] = {
}
m["dot"] = {
}
m["dov"] = {
other_names = {"Tokaleya", "Toka", "Leya", "Dombe"},
}
m["dow"] = {
}
m["dox"] = {
}
m["doy"] = {
}
m["doz"] = {
}
m["dpp"] = {
}
m["drb"] = {
}
m["drc"] = {
}
m["drd"] = {
}
m["drg"] = {
}
m["dri"] = {
other_names = {"C'lela", "C'Lela", "Chilela"},
}
m["drl"] = {
other_names = {"Darling", "Bandjigali"},
}
m["drn"] = {
}
m["dro"] = {
}
m["drq"] = {
}
m["drs"] = {
}
m["dru"] = {
}
m["dry"] = {
}
m["dsb"] = {
aliases = {"ซอร์บตอนล่าง", "Lower Sorbian", "Lower Lusatian", "Lower Wendish"},
}
m["dse"] = {
}
m["dsh"] = {
}
m["dsi"] = {
}
m["dsl"] = {
}
m["dsn"] = {
}
m["dso"] = {
}
m["dsq"] = {
}
m["dta"] = {
}
m["dtb"] = {
}
m["dtd"] = {
aliases = {"Diitidaht"},
}
m["dth"] = { -- contrast 'rrt'
}
m["dti"] = {
}
m["dtk"] = {
}
m["dtm"] = {
}
m["dto"] = {
aliases = {"Tommo So Dogon"},
}
m["dtp"] = {
aliases = {"กาดาซันดูซุน", "บุนดูลีวัน", "Central Dusun", "Kadazandusun", "Kadazan-Dusun", "Kadazan Dusun", "Kadazan", "Bunduliwan", "Boros Dusun"},
}
m["dtr"] = {
}
m["dts"] = {
}
m["dtt"] = {
}
m["dtu"] = {
}
m["dty"] = {
aliases = {"Dotyali"},
}
m["dua"] = {
}
m["dub"] = {
}
m["duc"] = {
pseudo_families = "paa",
}
m["due"] = {
}
m["duf"] = {
aliases = {"Ndrumbea", "Ndumbea", "Dubea", "Drubea", "Païta"},
}
m["dug"] = {
}
m["duh"] = {
}
m["dui"] = {
}
m["duk"] = {
aliases = {"Duduela"}, -- old name, still used by Glottolog
}
m["dul"] = {
}
m["dum"] = {
aliases = {"Middle Dutch"},
}
m["dun"] = {
}
m["duo"] = {
aliases = {"Dupaninan Agta", "Dupaningan", "Dupaninan"},
}
m["dup"] = {
}
m["duq"] = {
}
m["dur"] = {
}
m["dus"] = {
}
m["duu"] = {
other_names = {"Derung", "Dulong", "Trung"},
}
m["duv"] = {
varieties = {"Eastern Duvle", "Western Duvle"},
}
m["duw"] = {
}
m["dux"] = {
other_names = {"Duungooma"},
}
m["duy"] = {
}
m["duz"] = {
other_names = {"Duli-Gey", "Duli-Gewe"},
}
m["dva"] = {
}
m["dwa"] = {
}
m["dwr"] = {
aliases = {"ดาวูโร", "Dawro", "Dawuro"},
}
m["dwu"] = {
other_names = {"Gumatj", "Dual", "Duala", "Datiwuy", "Wulamba", "Liyagawumirr", "Marrangu", "Djampbarrpuyŋu", "Gupapuyngu", "Dhay'yi", "Dayi", "Dhalwangu"},
}
m["dww"] = {
}
m["dwy"] = {
}
m["dwz"] = {
other_names = {"Danuwar Rai", "Rai Danuwar"},
}
m["dya"] = {
}
m["dyb"] = {
}
m["dyd"] = {
}
-- dyg deleted as extinct and unattested; see comment in [[Module:languages/data/3/d]]
m["dyi"] = {
other_names = {"Djimini Senoufo", "Jimini", "Jinmini"},
}
m["dym"] = {
other_names = {"Yanda", "Yanda Dom", "Yanda Dom Dogon"},
}
m["dyn"] = {
}
m["dyo"] = {
other_names = {"Diola-Fogny", "Jola", "Joola", "Diola", "Fogny"},
}
m["dyu"] = {
}
m["dyy"] = {
aliases = {"Djabugay", "Dyabugay", "Djabugai", "Tjapukai"},
varieties = {"Gulay (Dyaabugay)", "Njakali", "Nuclear Dyaabugay"},
}
m["dza"] = {
other_names = {"Duguza"},
}
m["dzg"] = {
other_names = {"Daza", "Dasaga"},
}
m["dzl"] = {
other_names = {"Dzalakha", "Dzalamat", "Yangtsebikha"},
}
m["dzn"] = {
}
return m
7yco03p4h2m3b1yr50499x6g13jgypr
มอดูล:languages/data/3/c/extra
828
312386
5775704
5771090
2026-10-19T13:38:55Z
Octahedron80
267
5775704
Scribunto
text/plain
local m = {}
m["caa"] = {
aliases = {"Chorti", "Chʼortiʼ"},
}
m["cab"] = {
}
m["cac"] = {
}
m["cad"] = {
}
m["cae"] = {
}
m["caf"] = {
}
m["cag"] = {
}
m["cah"] = {
}
m["caj"] = {
}
m["cak"] = {
aliases = {"Cakchiquel", "Kakchiquel", "Cachiquel"},
}
m["cal"] = {
}
m["cam"] = {
aliases = {"Cemuhi", "Cemuhî"},
}
m["can"] = {
}
m["cao"] = {
}
m["cap"] = {
}
m["caq"] = {
aliases = {"Car Nicobarese", "Car"},
}
m["car"] = {
other_names = {"Carib", "Caribe", "Carina", "Cariña", "Cari'na", "Galibi", "Galibí", "Galibi Carib", "Kalihna", "Kalina", "Kali'na", "Kalinya", "Karìna", "Kari'nja", "Mainland Carib", "Maraworno", "Marworno"},
}
m["cas"] = {
other_names = {"Chimané", "Mosetén"},
pseudo_families = "sai",
}
m["cav"] = {
aliases = {"Cavinena"},
}
m["caw"] = {
aliases = {"Callahuaya", "Callawalla", "Pohena"},
}
m["cax"] = {
pseudo_families = "sai",
}
m["cay"] = {
}
m["caz"] = {
pseudo_families = "sai",
}
m["cbb"] = {
}
m["cbc"] = {
}
m["cbd"] = {
other_names = {"Carihona", "Karijona", "Karihona", "Jianacoto", "Jianácoto", "Hianakoto", "Hianacoto", "Hianákoto", "Guaque", "Omagua", "Umaua", "Umawa"},
}
m["cbg"] = {
}
m["cbi"] = {
aliases = {"Cha'palaa", "Chapalaa", "Cha'palaachi", "Chapalaachi", "Cayapa"},
}
m["cbj"] = {
}
m["cbk"] = {
aliases = {"ชาวากาโน", "ชาวาคาโน", "Chavacano", "Zamboanga Chavacano"},
}
m["cbl"] = {
other_names = {"Bualkhaw"},
}
m["cbn"] = {
aliases = {"Nyah Kur", "Nyahkur"},
}
m["cbo"] = {
}
m["cbq"] = {
aliases = {"Cuba", "Shuba"},
}
m["cbr"] = {
aliases = {"Cashibo", "Cacataibo"},
varieties = {"Nocamán"},
}
m["cbs"] = {
}
m["cbt"] = {
}
m["cbu"] = {
pseudo_families = "sai",
}
m["cbv"] = {
}
m["cbw"] = {
}
m["cby"] = {
other_names = {"Caraballo", "Yuri", "Aroje", "Yacumo", "Maku", "Macu", "Macusa"},
}
m["ccc"] = {
}
m["ccd"] = {
}
m["cce"] = {
}
m["ccg"] = {
other_names = {"Samba Daka", "Nakanyare"},
}
m["cch"] = {
aliases = {"Chawai"},
}
m["ccj"] = {
}
m["ccl"] = {
}
m["ccm"] = {
}
m["cco"] = {
}
m["ccp"] = {
aliases = {"Chakma", "Changmha"},
}
m["ccr"] = {
}
m["cda"] = {
}
m["cde"] = {
}
m["cdf"] = {
}
m["cdh"] = {
}
m["cdi"] = {
}
m["cdj"] = {
}
m["cdm"] = {
}
m["cdn"] = {
}
m["cdo"] = {
aliases = {"หมิ่นตง", "Min Dong", "Min Dong Chinese"},
}
m["cdr"] = {
}
m["cds"] = {
}
m["cdy"] = {
}
m["cdz"] = {
}
m["cea"] = {
}
m["ceb"] = {
aliases = {"เซบู", "Cebuano"},
}
m["ceg"] = {
}
m["cen"] = {
other_names = {"Cèn", "Chen"},
}
m["cet"] = {
aliases = {"Jalaa", "Cèntûm", "Cen Tuum"},
}
m["cfa"] = {
}
m["cfd"] = {
}
m["cfg"] = {
}
m["cfm"] = {
aliases = {"Falam"},
}
m["cga"] = {
}
m["cgc"] = {
}
m["cgg"] = {
}
m["cgk"] = {
}
m["chb"] = {
}
m["chc"] = {
}
m["chd"] = {
other_names = {"Oaxaca Chontal", "Oaxacan Chontal", "Chontal", "Tequistlatec", "Mountain Tequistlateco", "Highland Chontal", "Mountain Chontal"},
}
m["chf"] = {
aliases = {"Tabasco Chontal", "Yokot'an"},
}
m["chg"] = {
aliases = {"ชะกะไต", "จักกาไท", "Chagatai"},
}
m["chh"] = {
}
m["chj"] = {
}
m["chk"] = {
}
m["chl"] = {
}
m["chn"] = {
}
m["cho"] = {
}
m["chp"] = {
other_names = {"Dëne Sųłiné", "Dënesųłiné", "Dëne", "Dene Suline", "Denesuline", "Dene"},
}
m["chq"] = {
}
m["chr"] = {
aliases = {"Cherokee", "Tsalagi"},
varieties = {"Lower Cherokee", {"Middle Cherokee", "Kituwah", "Kituhwa", "Eastern Cherokee"}, {"Overhill Cherokee", "Otali", "Western Cherokee"}},
}
m["cht"] = {
}
m["chw"] = {
aliases = {"Chuwabu", "Cuwabo", "Cuwabu", "Cuabo", "Txuwabo", "Echuabo"},
}
m["chx"] = {
}
m["chy"] = {
aliases = {"Cheyenne"},
}
m["chz"] = {
}
m["cia"] = {
}
m["cib"] = {
}
m["cic"] = {
}
m["cid"] = {
pseudo_families = "nai",
}
m["cie"] = {
}
m["cih"] = {
}
m["cik"] = {
}
m["cim"] = {
aliases = {"คิมเบรียน", "ซิมบรี", "ซิมเบรียน", "Cimbrian"},
varieties = {"Luserna Cimbrian", "Sette Comuni Cimbrian", "Thirteen Communities Cimbrian"},
}
m["cin"] = {
}
m["cip"] = {
}
m["cir"] = {
other_names = {"Tiri", "Ciri", "Tîrî", "Mea", "Méa", "Haméa"},
}
m["ciy"] = {
}
m["cja"] = {
aliases = {"Western Cham"},
}
m["cje"] = {
}
m["cjh"] = {
}
m["cji"] = {
}
m["cjk"] = {
}
m["cjm"] = {
aliases = {"Eastern Cham"},
}
m["cjn"] = {
}
m["cjo"] = {
aliases = {"Ashéninka Pajonal"},
}
m["cjp"] = {
}
m["cjs"] = {
aliases = {"Shor"},
}
m["cjv"] = {
-- Per Glottolog, Duom Kobu is a dialect group of Gomia, Kebai and Sua.
varieties = {"Duom Kobu", "Gomia", "Kebai", "Sua", "Elimbari"},
}
m["cjy"] = {
aliases = {"จีนจิ้น", "ซานซี", "Jin", "Jinyu", "Jinhua", "Jinese", "Shanxinese", "Jin Chinese", "Jinyu Chinese"},
}
m["ckb"] = {
aliases = {"โซรานี", "Central Kurdish", "Sorani"},
}
m["ckh"] = {
aliases = {"Sak"},
}
m["ckl"] = {
aliases = {"Chibuk", "Chibok", "Chibbak", "Chibbuk", "Kyibaku", "Kibbaku", "Kibaku"},
}
m["ckn"] = {
aliases = {"Kaang"},
}
m["cko"] = {
aliases = {"Chakosi"},
}
m["ckq"] = {
}
m["ckr"] = {
}
m["cks"] = {
}
m["ckt"] = {
aliases = {"Chukchi"},
}
m["cku"] = {
}
m["ckv"] = {
aliases = {"กาวาลัน", "Kbalan", "Kebalan", "Kavalan"},
}
m["ckx"] = {
}
m["cky"] = {
}
m["ckz"] = {
aliases = {"Kaqchikel-Kʼicheʼ Mixed Language", "Cakchiquel-Quiché Mixed Language", "Cauque Mayan"},
}
m["cla"] = {
other_names = {"Bokkos", "Daffo-Butura", "Shagawu"},
}
m["clc"] = {
aliases = {"Tsilhqot'in", "Tsilhqut'in", "Tzilkotin"},
}
m["cld"] = {
}
m["cle"] = {
}
m["clh"] = {
}
m["cli"] = {
}
m["clj"] = {
aliases = {"Laitu"},
}
m["clk"] = {
other_names = {"Idu-Mishmi", "Idu Mishmi"},
}
m["cll"] = {
}
m["clm"] = {
aliases = {"Clallam", "S'Klallam"},
}
m["clo"] = {
other_names = {"Oaxaca Chontal", "Oaxacan Chontal", "Chontal", "Huamelultec", "Huamelula Chontal", "Coastal Chontal"},
}
m["clt"] = {
aliases = {"Lautu", "Lautu Chin", "Lutuv Chin"},
}
m["clu"] = {
}
m["clw"] = {
other_names = {"Chulim", "Chulym-Turkic", "Küerik", "Chulym Tatar", "Melets Tatar"},
}
m["cly"] = {
}
m["cma"] = {
aliases = {"Mạ", "Maa"},
}
m["cme"] = {
}
m["cmg"] = {
aliases = {"Classical Mongolian"},
}
m["cmi"] = {
}
m["cml"] = {
}
m["cmm"] = {
}
m["cmn"] = {
aliases = {"จีนแมนดาริน", "แมนดาริน", "Mandarin", "Mandarin Chinese", "Putonghua", "Guoyu", "Huayu", "Guanhua", "Beifanghua", "Standard Chinese"},
}
m["cmo"] = {
aliases = {"Central Mnong"},
}
m["cmr"] = {
other_names = {"Mro-Khimi Chin", "Mro", "Mro-Khimi"},
}
m["cms"] = {
aliases = {"Messapian"},
}
m["cmt"] = {
}
m["cna"] = {
}
m["cnb"] = {
aliases = {"Chinbon"},
}
m["cnc"] = {
aliases = {"Côông", "Coong"},
}
m["cng"] = {
}
m["cnh"] = {
aliases = {"ฮ่าค่า", "ชีนแบบฮาคา", "ชีนแบบฮ่าค่า", "ปาวี", "Lai", "Hakha Chin", "Hakha", "Haka Chin", "Haka", "Pawi"},
}
m["cni"] = {
aliases = {"Ashaninka"},
}
m["cnk"] = {
other_names = {"Khumi", "Khami", "Nisay", "Nise", "Eastern Khumi", "Eastern Khumi Chin"},
}
m["cnl"] = {
}
m["cno"] = {
}
m["cnp"] = {
aliases = {"Northern Pinghua", "Northern Ping"},
}
m["cns"] = {
varieties = {"Ajam", "Misman", "Simai"},
}
m["cnt"] = {
}
m["cnu"] = {
aliases = {"Shenwa"},
}
m["cnw"] = {
aliases = {"Ngawn"},
}
m["cnx"] = {
}
m["coa"] = {
aliases = {"Cocos Malay"},
}
m["cob"] = {
}
m["coc"] = {
}
m["cod"] = {
other_names = {"Kokama", "Kokáma", "Cocama-Cocamilla", "Kukama-Kukamiria", "Cocamilla", "Kokamíya", "Cocaima"},
}
m["coe"] = {
}
m["cof"] = {
other_names = {"Colorado", "Tsáchila"},
}
m["cog"] = {
aliases = {"Chong"},
}
m["coh"] = {
}
m["coj"] = {
}
m["cok"] = {
}
m["col"] = {
other_names = {"Columbia-Wenatchee", "Columbia-Moses", "Nxaamxcin", "Wenatchi", "Wenatchee"},
}
m["com"] = {
}
m["con"] = {
-- per Wikipedia [[w:Maku people]], Maku "is a pejorative term referring to several hunter-gatherer peoples of the
-- upper Amazon"
aliases = {"Cofan", "Kofan", "Kofane", "A'ingae", "Maku", "Macu"},
varieties = {"Aguarico", "Santa Rosa"},
pseudo_families = "sai",
}
m["coo"] = {
}
m["cop"] = {
aliases = {"Coptic"},
-- Don't include varieties in [[Module:etymology languages/data]]
}
m["coq"] = {
}
m["cot"] = {
}
m["cou"] = {
}
m["cov"] = {
aliases = {"Cao Miao"},
}
m["cow"] = {
}
m["cox"] = {
}
m["coy"] = {
}
m["coz"] = {
other_names = {"Chocho", "Chocholtec"},
}
m["cpa"] = {
}
m["cpb"] = {
}
m["cpc"] = {
aliases = {"Ajyíninka Apurucayali"},
}
m["cpg"] = {
aliases = {"Cappadocian"},
}
m["cpi"] = {
}
m["cpn"] = {
other_names = {"Chiripon", "Chiripong", "Kyerepong", "Okere"},
}
m["cpo"] = {
other_names = {"Kpeego", "Kpeen", "Numu"},
}
m["cps"] = {
}
m["cpu"] = {
}
m["cpx"] = {
aliases = {"หมิ่นแบบผู้เซียน", "หมิ่นผูเซียน", "Puxian Min", "Puxian", "Pu-Xian", "Pu-Xian Min", "Pu Xian", "Pu Xian Min", "Putian", "Xinghua", "Henghua", "Hinghua", "Henghwa", "Hinghwa"}
}
m["cpy"] = {
}
m["cqd"] = {
}
m["cra"] = {
}
m["crb"] = {
other_names = {"Igneri", "Inyeri", "Iñeri", "Island Carib", "Kalhiphona", "Karifuna"},
}
m["crc"] = {
}
m["crd"] = {
}
m["crf"] = {
}
m["crg"] = {
}
m["crh"] = {
aliases = {"Crimean Tatar"},
}
m["cri"] = {
aliases = {"Forro", "São Tomense"},
}
m["crj"] = {
}
m["crk"] = {
}
m["crl"] = {
}
m["crm"] = {
}
m["crn"] = {
}
m["cro"] = {
other_names = {"Apsalooke"},
}
m["crq"] = {
}
m["crr"] = {
}
m["crs"] = {
}
m["crt"] = {
}
m["crv"] = {
other_names = {"Tutet"},
}
m["crw"] = {
}
m["crx"] = {
}
m["cry"] = {
}
m["crz"] = {
}
m["csa"] = {
}
m["csb"] = {
aliases = {"Kashubian"},
}
m["csc"] = {
}
m["csd"] = {
}
m["cse"] = {
}
m["csf"] = {
}
m["csg"] = {
}
m["csh"] = {
aliases = {"Asho"},
}
m["csi"] = {
}
m["csj"] = {
aliases = {"Songlai"},
}
m["csk"] = {
}
m["csl"] = {
}
m["csm"] = {
}
m["csn"] = {
}
m["cso"] = {
}
m["csp"] = {
aliases = {"Southern Pinghua", "Southern Ping"},
}
m["csq"] = {
}
m["csr"] = {
}
m["css"] = {
other_names = {"Mutsun", "San Juan Bautista Costanoan", "Rumsien", "San Carlos Costanoan", "Carmeleno"},
}
m["cst"] = {
}
m["csv"] = {
aliases = {"Sumtu"},
}
m["csw"] = {
}
m["csx"] = {
aliases = {"CSL", "CBSL", "CBDSL", "Khmer Sign Language", "KSL"},
}
m["csy"] = {
aliases = {"Siyin"},
}
m["csz"] = {
other_names = {"Hanis", "Hanis Coos"},
}
m["cta"] = {
}
m["ctc"] = {
other_names = {"Chetco", "Siletz Dee-ni", "Deeni", "Tututni", "Siletz"},
}
m["ctd"] = {
other_names = {"Tedim", "Tiddim", "Sukte"},
}
m["cte"] = {
}
m["ctg"] = {
}
m["cth"] = {
aliases = {"Thaiphum"},
}
m["ctl"] = {
}
m["ctm"] = {
aliases = {"Sitimaxa", "Čitimaaša"},
pseudo_families = "nai",
}
m["ctn"] = {
}
m["cto"] = {
}
m["ctp"] = {
}
m["cts"] = {
aliases = {"Northern Catanduanes Bicolano"}, -- old name
}
m["ctt"] = {
aliases = {"Chetti"},
}
m["ctu"] = {
}
m["ctz"] = {
}
m["cua"] = {
}
m["cub"] = {
aliases = {"Cuveo", "Kubéo", "Kubeo", "Kubéu", "Kubeu", "Cobewa", "Cobéua", "Cobeua", "Kubéwa", "Kubewa", "Kobéua", "Kobeua", "Kobewa", "Pamiwa"},
}
m["cuc"] = {
}
m["cug"] = {
other_names = {"Chung", "Chungmboko", "Chung-Mboko", "Mboko"},
}
m["cuh"] = {
}
m["cui"] = {
}
m["cuj"] = {
}
m["cuk"] = {
}
m["cul"] = {
other_names = {"Kulina", "Kulína", "Kulyna", "Curina", "Corina", "Korina", "Culina-Madijá", "Madijá", "Madija", "Madiha", "Madihá"},
}
m["cuo"] = {
other_names = {"Cumanogota", "Cumana", "Cumaná", "Kumana", "Kumaná"},
}
m["cup"] = {
}
m["cuq"] = {
aliases = {"เกอหลง", "Cun", "Gelong"},
}
m["cur"] = {
}
m["cut"] = {
}
m["cuu"] = {
}
m["cuv"] = {
}
m["cuw"] = {
}
m["cux"] = {
}
m["cuy"] = {
aliases = {"Cuitlateco"},
pseudo_families = "nai",
}
m["cvg"] = {
}
m["cvn"] = {
}
m["cwa"] = {
}
m["cwb"] = {
}
m["cwd"] = {
}
m["cwe"] = {
}
m["cwg"] = {
aliases = {"Cheq Wong", "Cheq-Wong", "Ceq Wong"},
}
m["cwt"] = {
aliases = {"Kwatay"},
}
m["cya"] = {
}
m["cyb"] = {
aliases = {"Cayuvava", "Cayuwaba"},
pseudo_families = "sai",
}
m["cyo"] = {
}
m["czh"] = {
aliases = {"Huizhou Chinese"},
}
m["czk"] = {
pseudo_families = "qfa-jew",
}
m["czn"] = {
}
m["czo"] = {
aliases = {"หมิ่นจง", "หมิ่นกลาง", "Min Zhong", "Min Zhong Chinese"},
}
m["czt"] = {
aliases = {"Zotung"},
}
return m
o957iawy2jcb94jnd2aa8r9jc0yfz4q
มอดูล:languages/data/3/b/extra
828
312387
5775705
5723662
2026-10-19T13:53:34Z
Octahedron80
267
5775705
Scribunto
text/plain
local m = {}
m["baa"] = {
aliases = {"Mbambatana", "Bambatana"},
}
m["bab"] = {
}
m["bac"] = {
aliases = {"Badui"},
}
m["bae"] = {
aliases = {"Barawana"},
}
m["baf"] = {
other_names = {"Nu Baca", "Baca"},
}
m["bag"] = {
}
m["bah"] = {
aliases = {"Bahamian Creole English", "Bahamian", "Bahamas Creole", "Bahamas Creole English"},
}
m["baj"] = {
}
m["bal"] = {
aliases = {"บาลูจี", "Baluchi", "Balochi"},
varieties = {{"Southern Baluchi", "Southern Balochi"}, {"Eastern Baluchi", "Eastern Balochi"}, {"Western Baluchi", "Western Balochi"}},
}
m["ban"] = {
aliases = {"Balinese"},
}
m["bao"] = {
}
m["bap"] = {
}
m["bar"] = {
aliases = {"ออสโตร-บาวาเรีย", "Bavarian", "Austro-Bavarian"},
}
m["bas"] = {
aliases = {"Basa (Cameroon)", "Basa"},
}
m["bau"] = {
aliases = {"Bada", "Bada (Nigeria)"},
varieties = {"Mbat", "Galamkya"},
}
m["bav"] = {
other_names = {"Vengo"},
}
m["baw"] = {
}
m["bax"] = {
aliases = {"Bamun"},
}
m["bay"] = {
}
m["bba"] = {
aliases = {"Bariba"},
}
m["bbb"] = {
varieties = {"Birarie", "Muguani"},
}
m["bbc"] = {
aliases = {"Batak Toba"},
}
m["bbd"] = {
}
m["bbe"] = {
}
m["bbf"] = {
}
m["bbg"] = {
}
m["bbh"] = {
aliases = {"Bogan"},
}
m["bbi"] = {
aliases = {"Rombi", "Lombi", "Lombe"},
}
m["bbj"] = {
other_names = {"Ghomálá'", "Bamileke-Banjun"},
}
m["bbk"] = {
other_names = {"Kejom", "Kidzem"},
}
m["bbl"] = {
aliases = {"Bats", "Batsbi", "Tsova-Tush"},
}
m["bbm"] = { -- name includes prefix
other_names = {"Bango", "Mobango", "Ebango"},
}
m["bbn"] = {
}
m["bbo"] = {
other_names = {"Bobo Fing", "Black Bobo", "Northern Bobo Madaré", "Bobo", "Jèrè", "Kukoma", "Kure", "Sankuma", "Tankri", "Yaba"},
}
m["bbp"] = {
}
m["bbq"] = {
}
m["bbr"] = {
}
m["bbs"] = {
}
m["bbt"] = {
}
m["bbu"] = {
other_names = {"Kulung", "Kulung (Nigeria)"},
}
m["bbv"] = {
}
m["bbw"] = {
}
m["bbx"] = { -- cf bvb
}
m["bby"] = {
}
m["bca"] = {
other_names = {"Jianchuan Bai"},
}
m["bcb"] = {
}
m["bcd"] = {
}
m["bce"] = {
aliases = {"Menyam", "Mamenyan"}, -- apparently called Mengambo in French
}
m["bcf"] = {
varieties = {"Gama", "Lower Bamu", "Nuhiro", "Sisiame", "Upper Bamu"},
}
m["bcg"] = {
other_names = {"Baga Binari", "Baga Mboteni"},
}
m["bch"] = {
}
m["bci"] = {
aliases = {"Baoulé", "Bawule"},
}
m["bcj"] = {
}
m["bck"] = {
}
m["bcl"] = {
aliases = {"บีโคลกลาง", "บีโคล", "Bikol Central", "Central Bikol", "Bikol"}, -- also "Central Bicolano"?
}
m["bcm"] = {
other_names = {"Bannoni", "Tsunari"},
}
m["bcn"] = {
other_names = {"Bali", "Bali (Nigeria)", "Abaali"},
}
m["bco"] = {
varieties = {"Kugenesi", "Nuclear Kaluli", "Ologo", "Walulu"},
}
m["bcp"] = {
other_names = {"Bali (Congo)", "Bali (Democratic Republic of the Congo)", "Baali", "Kibali", "Libaali"},
}
m["bcq"] = {
}
m["bcr"] = {
other_names = {"Babine", "Witsuwit'en", "Northern Carrier", "Western Carrier", "Nadot’en-Wets’uwet’en"},
}
m["bcs"] = {
}
m["bct"] = {
}
m["bcu"] = {
other_names = {"Awad Bing"},
}
m["bcv"] = {
other_names = {"Shoo", "Minda", "Nye"},
}
m["bcw"] = {
}
m["bcy"] = {
aliases = {"Bwatiye", "Bachama"},
}
m["bcz"] = {
}
m["bda"] = {
aliases = {"Baiot", "Baiote", "Bayotte"},
}
m["bdb"] = {
}
m["bdc"] = {
}
m["bdd"] = {
}
m["bde"] = {
}
m["bdf"] = {
}
m["bdg"] = {
}
m["bdh"] = {
other_names = {"Baka", "Baka (Sudan)"},
}
m["bdi"] = {
other_names = {"Northern Burun", "Maiak", "Mayak", "Mughaja", "Kurmuk"},
}
m["bdj"] = {
aliases = {"Bai", "Bari"},
-- Belanda and Biri/Bviri appear to be related tribes, not aliases or varieties
other_names = {"BGamba", "Gumba", "Mbegumba", "Mvegumba"},
}
m["bdk"] = {
aliases = {"Budugh"},
}
m["bdl"] = {
aliases = {"บาเจาแบบซูลาเวซี", "บาเจา", "Indonesian Bajau", "Indonesian Bajo", "Sulawesi Bajau", "Sulawesi Bajaw", "Bajau", "Bajaw", "Bajo"},
}
m["bdm"] = {
other_names = {"Yedina", "Kuri"},
}
m["bdn"] = {
}
m["bdo"] = {
}
m["bdp"] = {
}
m["bdq"] = {
aliases = {"บานา", "Bahnar"},
}
m["bdr"] = {
aliases = {"West Coast Bajau"},
}
m["bds"] = {
}
m["bdt"] = {
}
m["bdu"] = {
other_names = {"Bima", "Bakundu-Balue", "Balundu-Bima"},
}
m["bdv"] = {
}
m["bdw"] = {
aliases = {"Mbaham", "Mbahaam"},
}
m["bdx"] = {
}
m["bdy"] = {
}
m["bdz"] = {
}
m["bea"] = {
other_names = {"Dane-zaa", "Danezaa", "Danezaa ZaageɁ"},
}
m["beb"] = {
}
m["bec"] = {
}
m["bed"] = {
}
m["bee"] = {
}
m["bef"] = {
}
m["beg"] = {
other_names = {"Lemeting"},
}
m["beh"] = {
other_names = {"Berba", "Bieri"},
}
m["bei"] = {
aliases = {"Bekati’", "Bekatiq", "Bakati"},
}
m["bej"] = {
}
m["bek"] = {
}
m["bem"] = {
aliases = {"Bemba (Zambia)"},
}
m["beo"] = {
aliases = {"Bedamini", "Bedamuni", "Mougulu"}, -- per Wikipedia
varieties = {"Komofio", "North Beami"},
}
m["bep"] = {
aliases = {"Behoa"},
}
m["beq"] = {
other_names = {"Bembe", "Kibeembe"},
}
m["bes"] = {
}
m["bet"] = {
other_names = {"Bété of Guiberoua", "Western Bété"},
}
m["beu"] = {
aliases = {"เบอลาการ์", "Blagar", "Belagar"},
varieties = {"Coastal Blagar",
-- Coastal Blagar varieties:
"East-Northeast Pura", "Melangvala-Bakalang", "North-Northwest Pura", "Southern Pura",
"Hinterland Blagar",
-- Hinterlang Blagar varieties:
"Northern Hinterland Blagar", "Southern Hinterland Blagar",
},
}
m["bev"] = {
other_names = {"Bété of Daloa", "Northern Bété"},
}
m["bew"] = {
aliases = {"บาตาเวีย", "จาการ์ตา", "มลายูแบบเบอตาวี", "มลายูแบบบาตาเวีย", "มลายูแบบจาการ์ตา", "Betawi", "Batavian", "Jakartanese", "Betawi Malay", "Batavian Malay", "Jakarta Malay"},
}
m["bex"] = {
}
m["bey"] = {
aliases = {"Beli", "Beli (Papua New Guinea)", "Akuwagel"},
}
m["bez"] = {
other_names = {"Bena", "Bena (Tanzania)"},
}
m["bfa"] = {
other_names = {"Pojulu", "Pöjulu", "Fadjulu", "Fajelu", "Madi", "Pajulu"},
}
m["bfb"] = {
}
m["bfc"] = {
other_names = {"Bijiang Bai", "Lemo"},
}
m["bfd"] = {
}
m["bfe"] = {
}
m["bff"] = {
}
m["bfg"] = {
}
m["bfh"] = {
aliases = {"Mblafe-Ránmo"}, -- Glottolog's name
varieties = {"Mblafe", "Ránmo"},
}
m["bfi"] = {
aliases = {"BSL"},
}
m["bfj"] = {
}
m["bfk"] = {
}
m["bfl"] = {
}
m["bfm"] = {
}
m["bfn"] = {
}
m["bfo"] = {
}
m["bfp"] = {
}
m["bfq"] = {
aliases = {"Badaga"},
}
m["bfr"] = {
}
m["bfs"] = {
other_names = {"Dali Bai"},
}
m["bft"] = {
aliases = {"Balti"},
}
m["bfu"] = {
}
m["bfw"] = {
other_names = {"Remo"},
}
m["bfx"] = {
}
m["bfy"] = {
}
m["bfz"] = {
}
m["bga"] = {
other_names = {"Wurə-Gwamhyə-Mba", "Lyase"},
}
m["bgb"] = {
}
m["bgc"] = {
aliases = {"หรยาณวี", "Haryanvi"},
}
m["bgd"] = {
}
m["bge"] = {
}
m["bgf"] = {
}
m["bgg"] = {
}
m["bgi"] = {
}
m["bgj"] = {
}
m["bgk"] = {
}
m["bgl"] = {
aliases = {"Bo (Laos)"}, -- if 'bpw' is added, the disambig name will have to be made canonical
}
m["bgo"] = {
}
m["bgq"] = {
}
m["bgr"] = {
other_names = {"Bawm", "Banjogi"},
}
m["bgs"] = {
}
m["bgt"] = {
aliases = {"Bugotu"},
}
m["bgu"] = {
aliases = {"Kamkam"},
}
m["bgv"] = {
}
m["bgw"] = {
}
m["bgx"] = {
aliases = {"Balkan Turkic"},
}
m["bgy"] = {
}
m["bgz"] = {
}
m["bha"] = {
}
m["bhb"] = {
}
m["bhc"] = {
}
m["bhd"] = {
aliases = {"Bhadarwahi"},
}
m["bhe"] = {
}
m["bhf"] = {
aliases = {"Busa"}, -- per Glottolog
pseudo_families = "paa",
}
m["bhg"] = {
varieties = {"Ambasi", "Binandere Proper"},
}
m["bhh"] = {
aliases = {"Bukhori", "Bukharian", "Bukharic", "Buchari", "Buchori", "Bucharian", "Bucharic"},
pseudo_families = "qfa-jew",
}
m["bhi"] = {
}
m["bhj"] = {
}
m["bhl"] = {
varieties = {"Bim", "Nimtep Weng"},
}
m["bhm"] = {
aliases = {"Batahari", "Bat'hari", "Bautahari", "Botahari", "Bathara"},
}
m["bhn"] = {
}
m["bho"] = {
aliases = {"โภชปุรี", "Bhojpuri"},
}
m["bhp"] = {
aliases = {"Bimanese"},
}
m["bhq"] = {
aliases = {"Tukang Besi South"},
-- varieties = {"Popalia"}, - - double check; listed as a language by Collins (1983), identified with bhq by ABVD
}
m["bhs"] = {
}
m["bht"] = {
}
m["bhu"] = {
}
m["bhv"] = {
}
m["bhw"] = {
}
m["bhx"] = { -- spurious?
other_names = {"Bhalay-Gowlan"},
}
m["bhy"] = {
other_names = {"Ebhele", "Piri", "Kipiri"},
}
m["bhz"] = {
aliases = {"Bada (Indonesia)"},
}
m["bia"] = {
}
m["bib"] = {
}
m["bid"] = {
}
m["bie"] = {
}
m["bif"] = {
}
m["big"] = {
varieties = {"Ngowiye", "Yongolei"},
}
m["bij"] = {
other_names = {"Kwang", "Vaghat-Ya-Bijim-Legeri", "Vaghat", "Ya", "Bijim", "Legeri"},
}
m["bil"] = {
aliases = {"Bille"},
}
m["bim"] = {
}
m["bin"] = {
other_names = {"Bini"},
}
m["bio"] = {
other_names = {"Biaka"},
}
m["bip"] = {
other_names = {"Forest Bira"},
}
m["biq"] = {
}
m["bir"] = {
varieties = {"Pikaru"},
}
m["bit"] = {
varieties = {"Bitara"},
}
m["biu"] = {
}
m["biv"] = {
}
m["biw"] = {
aliases = {"Kol"},
}
m["bix"] = {
}
m["biy"] = {
}
m["biz"] = {
}
m["bja"] = {
aliases = {"Buja"},
}
m["bjb"] = {
other_names = {"Parnkalla", "Banggarla", "Parnkala", "Parnkarla", "Barngala", "Bangala", "Bungala", "Bungela", "Banggala", "Bahngala", "Pankalla", "Punkalla", "Pangkala", "Pankarla", "Parkalla", "Pakarla", "Bungeha", "Bahanga-La", "Kortabina", "Arkaba-tura", "Port Lincon", "Kooapidna", "Punkirla", "Wanbirujurari", "Willara", "Willeuroo"},
}
m["bjc"] = {
other_names = {"Bareji", "Aga Bereho"},
}
m["bje"] = {
other_names = {"Biao Min", "Jiaogong Mian"},
}
m["bjf"] = {
pseudo_families = "qfa-jew",
}
m["bjg"] = {
aliases = {"Bijago"},
}
m["bjh"] = {
}
m["bji"] = {
}
m["bjj"] = {
}
m["bjk"] = {
}
m["bjl"] = {
aliases = {"Bulu (Papua New Guinea)", "Bulu"},
}
m["bjm"] = {
}
m["bjn"] = {
aliases = {"Banjarese", "Banjar"},
}
m["bjo"] = {
}
m["bjp"] = {
}
m["bjr"] = {
}
m["bjs"] = {
other_names = {"Barbadian", "Barbadian Creole", "Barbadian Creole English"},
}
m["bjt"] = {
}
m["bju"] = {
}
m["bjv"] = {
}
m["bjw"] = {
}
m["bjx"] = {
}
m["bjy"] = {
}
m["bjz"] = {
varieties = {"Bareji", "Mado", "Nuclear Baruga", "Tafota Baruga"},
}
m["bka"] = {
other_names = {"Nyakyak", "Bambuka"},
}
m["bkc"] = {
aliases = {"Baka (Cameroon)"},
}
m["bkd"] = {
aliases = {"บูกิด", "บูกิดโนน", "Bukid", "Binukid", "Bukidnon"},
}
m["bkf"] = {
}
m["bkg"] = {
}
m["bkh"] = {
}
m["bki"] = {
}
m["bkj"] = {
other_names = {"Pande-Gongo"},
}
m["bkk"] = { -- written in Balti script
}
m["bkl"] = {
}
m["bkm"] = {
aliases = {"Kom"},
}
m["bkn"] = {
aliases = {"Bekatan", "Bakatan", "Baketan"},
}
m["bko"] = {
}
m["bkp"] = {
aliases = {"Boko", "Boko (Congo)", "Boko (Democratic Republic of the Congo)"},
}
m["bkq"] = {
aliases = {"Bakairi", "Bacairí", "Bacairi"},
}
m["bkr"] = {
}
m["bks"] = {
}
m["bkt"] = {
}
m["bku"] = {
}
m["bkv"] = {
}
m["bkw"] = {
aliases = {"Bekwil"},
}
m["bkx"] = {
}
m["bky"] = {
}
m["bkz"] = {
}
m["bla"] = {
other_names = {"Siksika", "Blackfeet"},
}
m["blb"] = {
pseudo_families = "paa",
}
m["blc"] = {
aliases = {"Nuxálk", "Bella Coola"},
}
m["bld"] = {
}
m["ble"] = {
}
m["blf"] = {
}
m["blg"] = {
}
m["blh"] = {
other_names = {"Belle", "Belleh", "Kowaao", "Kwaa"},
}
m["bli"] = {
other_names = {"Lia"},
}
m["blj"] = {
aliases = {"Bolongan"},
}
m["blk"] = {
aliases = {"ปะโอ", "กะเหรี่ยงดำ", "Pa'o Karen", "Pa'o", "Black Karen"},
}
m["bll"] = {
}
m["blm"] = {
aliases = {"Beli", "Behli", "Beili", "Jur Beli", "Beli (Sudan)", "'Bëlï", "´Bëlï", "’Bëlï"},
}
m["bln"] = {
aliases = {"Southern Catanduanes Bicolano"}, -- old name
other_names = {"Virac"},
}
m["blo"] = {
other_names = {"Bassila", "Basila", "Baseca", "Ouinji-Ouinji", "Winji-Winji"},
}
m["blp"] = {
}
m["blq"] = {
}
m["blr"] = {
other_names = {"Bulang", "Pulang", "Kontoi", "Shinman"},
}
m["bls"] = {
}
m["blt"] = {
aliases = {"ไทน้อย", "Tai Noi", "Tai Dam", "Black Tai"},
}
m["blv"] = {
other_names = {"Bolo", "Ngoya", "Kibala-Ngoya"},
}
m["blw"] = {
}
m["blx"] = {
}
m["bly"] = {
aliases = {"Nootre"},
}
m["blz"] = {
}
m["bma"] = {
}
m["bmb"] = {
other_names = {"Bemba", "Kinyabemba"},
}
m["bmc"] = {
}
m["bmd"] = {
aliases = {"Baga Maduri", "Baga Mandari"},
}
m["bme"] = {
}
m["bmf"] = {
}
m["bmg"] = {
}
m["bmh"] = {
other_names = {"Bemal"},
}
m["bmi"] = {
}
m["bmj"] = {
}
m["bmk"] = {
}
m["bml"] = {
}
m["bmn"] = {
aliases = {"Bina (New Guinea)", "Bina (Papua New Guinea)"},
}
m["bmo"] = {
}
m["bmp"] = {
}
m["bmq"] = {
}
m["bmr"] = {
}
m["bmt"] = {
}
m["bmu"] = {
aliases = {"Burum-Mindik"},
varieties = {"Siawari", "Somba"},
}
m["bmv"] = {
}
m["bmw"] = {
}
m["bmx"] = {
}
m["bmz"] = {
}
m["bna"] = {
}
m["bnb"] = {
}
m["bnd"] = {
aliases = {"Banda (Indonesia)"},
}
m["bne"] = {
}
m["bnf"] = {
other_names = {"Bonfia"},
}
m["bng"] = {
}
m["bni"] = {
other_names = {"Bobangi", "Bubangi"},
}
m["bnj"] = {
}
m["bnk"] = {
}
m["bnl"] = {
}
m["bnm"] = {
}
m["bnn"] = {
}
m["bno"] = {
aliases = {"บันโตอาโนน", "บีนันโตอาโนน", "Asi", "Bantoanon", "Binantoanon"},
}
m["bnp"] = {
}
m["bnq"] = {
}
m["bnr"] = {
}
m["bns"] = {
other_names = {"Bundelkhandi"},
}
m["bnu"] = {
}
m["bnv"] = {
aliases = {"Bonerif"}, -- Glottolog
}
m["bnw"] = {
}
m["bnx"] = {
}
m["bny"] = {
}
m["bnz"] = {
}
m["boa"] = {
}
m["bob"] = {
}
m["boe"] = {
}
m["bof"] = {
}
m["bog"] = {
}
m["boh"] = {
}
m["boi"] = {
}
m["boj"] = {
}
m["bok"] = {
}
m["bol"] = {
aliases = {"Bole"},
}
m["bom"] = {
aliases = {"Birom"},
}
m["bon"] = {
varieties = {"Boze-Giringarede", "Irupi-Drageli", "Kunini", "Masingle", "Sebe", "Sogal", "Tate"},
}
m["boo"] = {
}
m["bop"] = {
}
m["boq"] = {
pseudo_families = "paa",
}
m["bor"] = {
}
m["bot"] = {
}
m["bou"] = {
aliases = {"Boondei", "Boondéi"},
}
m["bov"] = {
other_names = {"Bowili", "Bowiri", "Liwuli", "Siwuri", "Tuwili", "Tora"},
}
m["bow"] = {
other_names = {"Bothar"},
}
m["box"] = {
aliases = {"Bwamu"},
}
m["boy"] = {
aliases = {"Bodo (Central African Republic)", "Bodo"},
}
m["boz"] = {
}
m["bpa"] = {
other_names = {"Dakaka", "South Ambrym", "Baiap"},
}
m["bpd"] = {
}
m["bpe"] = {
aliases = {"Barupu", "Warapu"},
varieties = {"Barapu-Warapu", "Pou"}, -- per Glottolog
}
m["bpg"] = {
}
m["bph"] = {
aliases = {"Botlix"},
}
m["bpi"] = {
}
m["bpj"] = {
}
m["bpk"] = {
}
m["bpl"] = {
}
m["bpm"] = {
}
m["bpn"] = {
}
m["bpo"] = {
}
m["bpp"] = {
aliases = {"Kaure-Narau"}, -- Glottolog's term
}
m["bpq"] = {
}
m["bpr"] = {
}
m["bps"] = {
}
m["bpt"] = {
}
m["bpu"] = {
}
m["bpv"] = {
}
-- bpw: Bo (Papua New Guinea): excluded in 2012 and re-evaluated in 2025 with the same conclusion; per Wikipedia: "It is
-- essentially undocumented, and its status as a separate language is unconfirmed."
m["bpx"] = {
}
m["bpy"] = {
aliases = {"Bishnupriya", "Manipuri Bishnupriya"},
}
m["bpz"] = {
}
m["bqa"] = {
}
m["bqb"] = {
}
m["bqc"] = {
aliases = {"Boko (Benin)"},
}
m["bqd"] = {
}
m["bqf"] = {
}
m["bqg"] = {
}
m["bqh"] = {
}
m["bqi"] = {
}
m["bqj"] = {
}
m["bqk"] = {
}
m["bql"] = {
aliases = {"Bilakura", "Karen"},
}
m["bqm"] = {
}
m["bqn"] = {
}
m["bqo"] = {
}
m["bqp"] = {
}
m["bqq"] = {
}
m["bqr"] = {
}
m["bqs"] = {
}
m["bqt"] = {
}
m["bqu"] = {
}
m["bqv"] = {
}
m["bqw"] = {
aliases = {"Buru"},
}
m["bqx"] = {
}
m["bqy"] = {
}
m["bqz"] = {
}
m["bra"] = {
aliases = {"Braj", "Braj Bhasha"},
}
m["brb"] = {
other_names = {"Laveh", "Rawe", "Brao"},
}
m["brc"] = {
aliases = {"Berbice Dutch", "Berbice Dutch Creole", "Berbice Creole"},
}
m["brd"] = {
}
m["brf"] = {
aliases = {"Bira"},
}
m["brg"] = {
aliases = {"Bauré"},
}
m["brh"] = {
aliases = {"บราฮุย", "Brahui"},
}
m["bri"] = {
}
m["brj"] = {
}
m["brk"] = {
aliases = {"Birked"},
}
m["brl"] = {
aliases = {"Sebirwa"},
}
m["brm"] = {
}
m["brn"] = {
}
m["bro"] = {
}
m["brp"] = {
varieties = {"Marikai", "Sipisi"},
}
m["brq"] = {
}
m["brr"] = {
}
m["brs"] = {
other_names = {"Ende", "West Kaili"},
}
m["brt"] = {
other_names = {"Njwande"},
}
m["bru"] = {
aliases = {"Eastern Bru"},
}
m["brv"] = {
aliases = {"Western Bru"},
}
m["brw"] = {
}
m["brx"] = {
aliases = {"Bodo", "Bodo (India)", "Boro", "Boro (India)", "Mech"},
}
m["bry"] = {
}
m["brz"] = {
}
m["bsa"] = {
pseudo_families = "paa",
}
m["bsb"] = {
}
m["bsc"] = {
other_names = {"Basari", "Oniyan", "Onian", "Onëyan", "Ayan", "Biyan", "Wo"},
}
m["bse"] = {
other_names = {"Babessi"},
}
m["bsf"] = {
}
m["bsg"] = {
}
m["bsh"] = {
other_names = {"Kati"},
}
m["bsi"] = {
}
m["bsj"] = {
}
m["bsk"] = {
}
m["bsl"] = {
}
m["bsm"] = {
}
m["bsn"] = {
}
m["bso"] = {
}
m["bsp"] = {
}
m["bsq"] = {
}
m["bsr"] = {
aliases = {"Basa-Kontagora"},
}
m["bss"] = {
}
m["bst"] = {
aliases = {"Basketto", "Baskatta", "Mesketo", "Misketto"},
}
m["bsu"] = {
}
m["bsv"] = {
}
m["bsw"] = {
}
m["bsx"] = {
}
m["bsy"] = {
}
m["bta"] = {
}
m["btc"] = {
aliases = {"Bati"},
}
m["btd"] = {
aliases = {"Batak Dairi"},
}
m["bte"] = {
}
m["btf"] = {
}
m["btg"] = {
}
m["bth"] = {
}
m["bti"] = {
}
m["btj"] = {
}
m["btm"] = {
aliases = {"Batak Mandailing", "Mandailing"},
}
m["btn"] = {
}
m["bto"] = {
aliases = {"Iriga Bicolano"}, -- old name
}
m["btp"] = {
}
m["btq"] = {
}
m["btr"] = {
}
m["bts"] = {
aliases = {"Batak Simalungun", "Simalungun"},
}
m["btt"] = {
}
m["btu"] = {
}
m["btv"] = {
}
m["btw"] = {
}
m["btx"] = {
aliases = {"Batak Karo"},
}
m["bty"] = {
}
m["btz"] = {
aliases = {"Batak Alas-Kluet"},
}
m["bua"] = {
aliases = {"Buriat", "Buryat"},
}
m["bub"] = {
}
m["bud"] = {
other_names = {"Tobote", "Ncam", "Basar", "Basari"},
}
m["bue"] = {
}
m["buf"] = {
}
m["bug"] = {
aliases = {"Buginese"},
}
m["buh"] = {
other_names = {"Yuno"},
}
m["bui"] = {
}
m["buj"] = {
}
m["buk"] = {
aliases = {"Bukaua", "Bugawac", "Gawac"},
}
m["bum"] = {
aliases = {"Bulu"},
}
m["bun"] = {
}
m["buo"] = {
}
m["bup"] = {
}
m["buq"] = {
aliases = {"Barem", "Bunabun", "Bububun", "Bunubun"},
}
m["bus"] = {
}
m["but"] = {
}
m["buu"] = {
}
m["buv"] = {
}
m["buw"] = {
}
m["bux"] = {
}
m["buy"] = {
other_names = {"Mani", "Bullom So", "Mandingi"},
}
m["bva"] = {
}
m["bvb"] = {
}
m["bvc"] = {
}
m["bvd"] = {
aliases = {"Mbaenggu", "Baegu"},
}
m["bve"] = {
}
m["bvf"] = {
}
m["bvg"] = {
}
m["bvh"] = {
}
m["bvi"] = {
}
m["bvj"] = {
}
m["bvk"] = {
}
m["bvl"] = {
}
m["bvm"] = {
}
m["bvn"] = {
varieties = {"Kasmin", "Masan"},
}
m["bvo"] = {
}
m["bvp"] = {
}
m["bvq"] = {
}
m["bvr"] = {
}
m["bvt"] = {
aliases = {"Bati"},
}
m["bvu"] = {
}
m["bvv"] = {
}
m["bvw"] = {
}
m["bvx"] = {
aliases = {"Dibole", "Bole"},
}
m["bvy"] = {
other_names = {"Babay", "Utudnon", "Leyte"},
}
m["bvz"] = {
varieties = {"Aumenefa", "Gesda Dae", {"Neao", "Neao (Indonesia)"}},
}
m["bwa"] = {
}
m["bwb"] = {
}
m["bwc"] = {
}
m["bwd"] = {
aliases = {"Bwaidoga"},
}
m["bwe"] = {
}
m["bwf"] = {
aliases = {"Bosilewa"},
}
m["bwg"] = {
}
m["bwh"] = {
}
m["bwi"] = {
other_names = {"Baniba", "Baniva", "Carutana", "Carútana", "Carúzana", "Izaneni", "Karu", "Tapuya"},
}
m["bwj"] = {
}
m["bwk"] = {
}
m["bwl"] = {
}
m["bwm"] = {
other_names = {"Mundugumor"},
}
m["bwn"] = {
aliases = {"Hm Nai", "Ng-nai", "Wunai"},
}
m["bwo"] = {
other_names = {"Boro", "Boro (Ethiopia)", "Borna", "Bworo", "Sinicho"},
}
m["bwp"] = {
aliases = {"Mandobo Bawah"},
varieties = {"Central Mandobo", "Kaisah", "Osso", "Selil", "Tinggam", -- Central Mandobo varieties
"Mariam Mandobo", "Kouh", "Mariam", -- Mariam Mandobo varieties
},
}
m["bwq"] = {
other_names = {"Bobo Madaré", "Southern Bobo Madaré", "Bobo", "Syabéré", "Sya", "Benge", "Sogokiré", "Voré", "Zara", "Bobo Jula", "Jula"},
}
m["bwr"] = {
other_names = {"Bura-Pabir", "Pabir", "Burra"},
}
m["bws"] = {
}
m["bwt"] = {
}
m["bwu"] = {
aliases = {"Buli"},
}
m["bww"] = {
}
m["bwx"] = {
other_names = {"Bu Nao", "Bunu", "Dongnu", "Dahua Dongnu", "Tung Nu", "Bunuo", "Pu No", "Naoklao", "Baonao", "Nao Klao", "Numao", "Nu Mhou", "Nunu", "Lingyun Nunu", "Nu Nu"},
}
m["bwy"] = {
}
m["bwz"] = {
}
m["bxa"] = {
other_names = {"Tairaha"},
}
m["bxb"] = {
}
m["bxc"] = {
}
m["bxd"] = {
}
m["bxe"] = {
other_names = {"Birale", "Birayle"},
}
m["bxf"] = {
}
m["bxg"] = {
aliases = {"Ngala"},
}
m["bxh"] = {
}
m["bxi"] = {
}
m["bxj"] = {
}
m["bxk"] = {
}
m["bxl"] = {
aliases = {"Blé"},
}
m["bxn"] = {
}
m["bxo"] = {
aliases = {"Barikanci", "Barikanchi Pidgin"},
}
m["bxp"] = {
}
m["bxq"] = {
}
m["bxs"] = {
}
m["bxv"] = {
}
m["bxw"] = {
aliases = {"Bankagooma"},
}
m["bxz"] = {
-- Glottolog splits Binahari into two languages
varieties = {{"Ma", "Binahari-Ma"}, {"Neme", "Binahari-Neme"}},
}
m["bya"] = {
other_names = {"Batak"},
}
m["byb"] = {
}
m["byc"] = {
}
m["byd"] = {
}
m["bye"] = {
varieties = {"Bouye", "Maurom"},
}
m["byf"] = {
}
m["byg"] = {
}
m["byh"] = {
}
m["byi"] = {
other_names = {"Buya"},
}
m["byj"] = {
aliases = {"Bina", "Bina (Nigeria)"},
}
m["byk"] = {
}
m["byl"] = {
}
m["bym"] = {
}
m["byn"] = {
aliases = {"Bilin", "Bilen", "Belen", "Bilein"},
}
m["byo"] = {
other_names = {"Piyo", "Biyue"},
}
m["byp"] = {
}
m["byq"] = {
aliases = {"Basai"},
}
m["byr"] = {
varieties = {"Gulicha", "Nuclear Baruya", "Usirampia", "Wantakia"},
}
m["bys"] = {
}
m["byt"] = {
}
m["byv"] = {
}
m["byw"] = {
}
m["byx"] = {
other_names = {"Kakat", "Baining"},
}
m["byz"] = {
}
m["bza"] = {
aliases = {"Gbandi"},
}
m["bzb"] = {
}
m["bzd"] = {
}
m["bze"] = {
}
m["bzf"] = {
varieties = {"Central Boikin", "East Boikin", "Haripmor", "Island Boikin", "Kunai", "Kwusaun",
{"Munji", "Munji (Papua New Guinea)"}, "West Boikin"},
}
m["bzg"] = {
other_names = {"Favorlang", "Poavosa", "Taokas"},
}
m["bzh"] = {
}
m["bzi"] = {
aliases = {"Bisu", "Mbisu"},
}
m["bzj"] = {
aliases = {"Belizean Creole English", "Belizean Kriol", "Belize Kriol English", "Kriol"},
}
m["bzk"] = {
other_names = {"Miskito Coast Creole", "Nicaraguan Creole English", "Nicaragua Creole English"},
}
m["bzl"] = { -- supposedly also called "Bolano", but I can find no evidence of that
other_names = {"Boano", "Austronesian Boano", "Totoli Boano"},
}
m["bzm"] = {
}
m["bzn"] = {
other_names = {"Boano", "Austronesian Boano", "Seram Boano"},
}
m["bzo"] = {
}
m["bzp"] = {
varieties = {"Barau", "Weriagar"},
}
m["bzq"] = {
aliases = {"Buli"},
}
m["bzr"] = {
}
m["bzs"] = {
other_names = {"LGB", "LSB", "LSCB", "Libras"},
}
m["bzu"] = {
other_names = {"Taurap"},
pseudo_families = "paa",
}
m["bzv"] = {
other_names = {"Naami"},
}
m["bzw"] = {
other_names = {"Basa (Nigeria)", "Basa-Benue"},
}
m["bzx"] = {
}
m["bzy"] = {
}
m["bzz"] = {
}
return m
o2tmckun936ux1ypg6cebebgeg7ojd6
มอดูล:languages/data/3/a/extra
828
312391
5775706
5770094
2026-10-19T13:58:34Z
Octahedron80
267
5775706
Scribunto
text/plain
local m = {}
m["aaa"] = {
aliases = {"Otuo"},
}
m["aab"] = {
other_names = {"Alumu", "Tesu"},
}
m["aac"] = {
}
m["aad"] = {
other_names = {"Alai"},
}
m["aaf"] = {
aliases = {"Eranadan"},
}
m["aag"] = {
}
m["aah"] = {
other_names = {"Abu' Arapesh", "Ua"},
}
m["aai"] = {
other_names = {"Arifama", "Miniafia"},
}
m["aak"] = {
aliases = {"Angave"},
varieties = {"Ankai", "Bu'u", "Miyatnu", "Sawuve", "Wiyagwa", "Wunavai"},
}
m["aal"] = {
}
m["aan"] = {
aliases = {"Anambe", "Anambe of Cairari"},
}
m["aap"] = {
other_names = {"Arára"},
}
m["aaq"] = {
other_names = {"Eastern Abenaki", "Eastern Abnaki"},
}
m["aas"] = {
other_names = {"Aasáx", "Aasá", "Asa", "Asá", "Asax", "Aramanik", "Laramanik"},
}
m["aau"] = {
}
m["aaw"] = {
other_names = {"Arove", "Arawe"},
}
m["aax"] = {
aliases = {"Mandobo Atas"},
varieties = {"Langgoan", "Maju Mandobo", "Wariktop", "Winiktit"},
}
m["aaz"] = {
}
m["aba"] = {
aliases = {"อับเบ", "Abé", "Abbé", "Abbey", "Abi"},
}
m["abb"] = {
other_names = {"Abo", "Bo", "Abaw", "Miang", "Mandouka"},
}
m["abc"] = {
}
m["abd"] = {
other_names = {"Manide"},
}
m["abe"] = {
other_names = {"Western Abenaki", "Abnaki", "Western Abnaki"},
}
m["abf"] = {
}
m["abg"] = {
}
m["abh"] = {
aliases = {"Tajiki Arabic"},
}
m["abi"] = {
}
m["abj"] = {
other_names = {"Bea", "Aka-Bea-da", "Akabeada", "Aka-Bia", "Bia", "Aka-Bia-da", "Akabiada", "Bojingiji"},
}
m["abl"] = {
other_names = {"Pepadun", "Lampung Nyo"},
}
m["abm"] = {
}
m["abn"] = {
}
m["abo"] = {
aliases = {"Abɔ̃"},
}
m["abp"] = {
}
m["abq"] = {
}
m["abs"] = {
}
m["abt"] = {
varieties = {"Maprik", "Wingei", "Wosera-Kamu", "Wosera-Mamu"},
}
m["abu"] = {
}
m["abv"] = {
aliases = {"Baharna Arabic", "Bahrani Arabic"},
}
m["abw"] = {
aliases = {"Abasakur"},
}
m["abx"] = {
}
m["aby"] = {
varieties = {"Auwaka", "Buniabura", {"Doma", "Doma (Papua New Guinea)"}, "Jari", "Mori"},
}
m["abz"] = {
varieties = {"Alakaman", "Atimelang", "Kobola", "Papuna"},
}
m["aca"] = {
aliases = {"Achawa", "Ajagua", "Axagua", "Achugua", "Ajaga", "Xagua", "Jagua"},
}
m["acb"] = {
}
m["acd"] = {
aliases = {"Kyode", "Gichode"},
}
m["ace"] = {
aliases = {"อาเจะห์", "Acehnese", "Achinese", "Atjehnese"},
}
m["ach"] = {
aliases = {"Acoli", "Shuli", "Acooli"},
}
m["aci"] = {
other_names = {"Cari", "Aka-Kari", "Kari", "Chariar"},
}
m["ack"] = {
other_names = {"Kora"},
}
m["acl"] = {
other_names = {"Bale", "Bele", "Akar-Bele", "Balawa", "Balwa", "Bojingiji"},
}
m["acm"] = {
aliases = {"อาหรับแบบเมโสโปเตเมีย", "Iraqi Arabic", "Mesopotamian Arabic"},
}
m["acn"] = {
other_names = {"Xiandao", "Chintaw"},
}
m["acp"] = {
}
m["acr"] = {
other_names = {"Achí", "Achi Maya", "Cubulco Achi", "Cubulco Achí", "Cubulco Achi'"},
}
m["acs"] = {
aliases = {"Akroá", "Coroá", "Acroa", "Acroá-Mirim"},
}
m["acu"] = {
other_names = {"Achuar-Shiwiar"},
}
m["acv"] = {
}
m["acw"] = {
aliases = {"Hijazi Arabic", "Hejazi Arabic", "West Arabian Arabic"},
}
m["acx"] = {
aliases = {"Omani Arabic"},
}
m["acy"] = {
aliases = {"Cypriot Arabic", "Cypriot Maronite Arabic", "Sanna"},
}
m["acz"] = {
aliases = {"Asheron"},
}
m["ada"] = {
aliases = {"Dangme"},
}
m["adb"] = { -- erroneously formerly known as "Adabe"
varieties = {"Rasua", {"Raklungu", "Klu'un Hahan Adabe", "Adabe"}, "Hresuk", "Dadu'a"},
}
m["add"] = {
other_names = {"Lidzonka"},
}
m["ade"] = {
}
m["adf"] = {
}
m["adg"] = {
varieties = {"Ayerrerenge"},
}
m["adh"] = {
}
m["adi"] = {
other_names = {"Abor", "Ashing", "Minyong", "Mising", "Padam", "Panggi", "Pasi", "Shimong", "Ajukru"},
}
m["adj"] = {
aliases = {"Adjukru", "Adyoukrou", "Adyukru", "Ajukru"},
}
m["adl"] = {
other_names = {"Gallong"},
}
m["adn"] = {
varieties = {"Aimoli"},
}
m["ado"] = {
other_names = {"Adjora"},
varieties = {"Auwa", "Nuclear Abu", {"Sabu", "Sabu (Papua New Guinea)"}},
}
m["adp"] = {
}
m["adq"] = {
other_names = {"Agotime"},
}
m["adr"] = {
}
m["ads"] = {
}
m["adt"] = {
}
m["adu"] = {
}
m["adw"] = {
aliases = {"Amundava"},
}
m["ady"] = {
aliases = {"เซอร์แคสเซียตะวันตก", "Adyghe", "Western Circassian"},
}
m["adz"] = {
}
m["aea"] = {
}
m["aeb"] = {
aliases = {"Tunisian Arabic"},
varieties = {"Judeo-Tunisian Arabic"}, --formerly ajt
}
m["aed"] = {
}
m["aee"] = {
other_names = {"Northeast Pashai", "Pashai"},
}
m["aek"] = {
}
m["ael"] = {
}
m["aem"] = {
}
m["aen"] = {
}
m["aeq"] = {
}
m["aer"] = {
varieties = {"Akarre", "Ikngerripenhe", "Mparntwe Arrernte", "Northern Arrernte"},
}
m["aes"] = {
other_names = {"Yaquina", "Yakwina", "Alseya", "Yakona"}, -- names of the two dialects that make up the language
}
m["aeu"] = {
other_names = {"Chepya"},
}
m["aew"] = {
aliases = {"Aion"}, -- not sure about "Porapora"
varieties = {"Northern Ambakich", "Southern Ambakich"},
}
m["aey"] = {
varieties = {"Haija", "Huar", "Jagahala"},
}
m["aez"] = {
aliases = {"Aiga"}, -- Orokaiva is a sister language per Glottolog
}
m["afb"] = {
}
m["afd"] = {
varieties = {"Andambit", "Imboin", "Kaiyam", "Kupin", "Namata"},
}
m["afe"] = {
}
m["afg"] = {
}
m["afh"] = {
}
m["afi"] = {
aliases = {"Chini"}, -- Glottolog's name, additional ISO name
}
m["afk"] = {
aliases = {"Nanubae-Imangae"}, -- Glottolog's name
varieties = {"Imanmeri",
"Nanbay", "Wamblamas", "Yamandim", -- the latter two are Nanbay subvarietiess
},
}
m["afn"] = {
}
m["afo"] = {
}
m["afp"] = {
varieties = {"Awim", "Imboin-Awim"},
}
m["afs"] = {
}
m["aft"] = {
other_names = {"Affiti", "Ditti"},
}
m["afu"] = {
aliases = {"Efutu"},
}
m["afz"] = {
}
m["agb"] = {
}
m["agc"] = {
}
m["agd"] = {
}
m["age"] = {
aliases = {"Mendi"},
}
m["agf"] = {
}
m["agg"] = {
aliases = {"Anggor"},
varieties = {{"Nai", "Nai (Angor)"}, "Samanai"},
}
m["agh"] = {
aliases = {"Angba"},
}
m["agj"] = {
}
m["agk"] = {
}
m["agl"] = {
other_names = {"Agala"},
}
m["agm"] = {
}
m["agn"] = {
aliases = {"อากูไตนึน", "Agutaynen"},
}
m["ago"] = {
}
m["agq"] = {
}
m["agr"] = {
}
m["ags"] = {
aliases = {"Isimbi"},
}
m["agt"] = {
}
m["agu"] = {
aliases = {"Aguacatec", "Aguacateco", "Awakatek", "Awakateko", "Awakateka", "Qa'yol"},
}
m["agv"] = {
other_names = {"Remontado Dumagat", "Sinauna", "Hatang Kayey"},
}
m["agw"] = {
}
m["agx"] = {
aliases = {"Agul"},
}
m["agy"] = {
}
m["agz"] = {
}
m["aha"] = {
}
m["ahb"] = {
}
m["ahg"] = {
}
m["ahh"] = {
}
m["ahi"] = {
aliases = {"Tiagbrmrin Aizi"},
}
m["ahk"] = {
aliases = {"Akha", "Aka", "Ako"},
}
m["ahl"] = {
aliases = {"Ahlon"},
}
m["ahm"] = {
aliases = {"Mobumrin Aizi"},
}
m["ahn"] = {
aliases = {"Ahan", "Ahaan"},
}
m["aho"] = {
aliases = {"อะหม", "Ahom"},
}
m["ahp"] = {
aliases = {"Aproumu Aizi"},
}
m["ahr"] = {
other_names = {"Khandeshi", "Khandesi"},
}
m["ahs"] = {
}
m["aht"] = {
}
m["aia"] = {
}
m["aib"] = {
other_names = {"Aynu", "Ainu", "Ainu (China)", "Aini", "Eyni", "Ejnu", "Abdal", "Äynú"},
}
m["aic"] = {
}
m["aid"] = {
}
m["aie"] = {
}
m["aif"] = {
}
m["aig"] = {
other_names = {"Leeward Caribbean Creole English", "Antiguan Creole English", "Kokoy Creole English", "Saint Kitts Creole", "Montserrat Creole", "Anguillan Creole"},
}
m["aih"] = {
}
m["aii"] = {
aliases = {"Assyrian Neo-Aramaic"},
}
m["aij"] = {
pseudo_families = "qfa-jew",
}
m["aik"] = {
}
m["ail"] = {
}
m["aim"] = {
}
m["ain"] = {
aliases = {"Ainu", "Ainu (Japan)"},
}
m["aio"] = {
aliases = {"ไทอ่ายตน", "Aiton", "Tai Aiton", "Aitonia", "Sham Doaniya"},
}
m["aip"] = {
}
m["air"] = {
}
m["ait"] = {
}
m["aiw"] = {
}
m["aix"] = {
}
m["aiy"] = {
}
m["aja"] = {
aliases = {"Aja", "Adja", "Aja (Sudan)"},
}
m["ajg"] = {
aliases = {"Adja", "Aja", "Aja (Benin)", "Aja (Togo)", "Ajagbe"},
}
m["aji"] = {
other_names = {"Houailou"},
}
m["ajn"] = {
}
m["ajp"] = {
aliases = {"South Levantine Arabic"},
}
m["ajs"] = {
aliases = {"Ghardaia Sign Language"},
pseudo_families = "qfa-jew",
}
m["ajw"] = {
}
m["ajz"] = {
}
m["akb"] = {
aliases = {"Batak Angkola"},
}
m["akc"] = {
varieties = {"Amberbaken", "Arfu", "Kebar"},
pseudo_families = "paa",
}
m["akd"] = {
aliases = {"Akpet-Ehom", "Ukpet-Ubeteng-Evia"},
varieties = {"Akpet", "Ukpet", "Ehom", "Ubeteng", "Ebeteng", "Evia"},
}
m["ake"] = {
aliases = {"Acauayo", "Acaguayo", "Akawai", "Acawai", "Accawai"},
}
m["akf"] = {
}
m["akg"] = {
}
m["akh"] = {
}
m["aki"] = {
aliases = {"Aiom", "Ayom"},
}
m["akj"] = {
other_names = {"Aka-Jeru"},
}
m["akk"] = {
aliases = {"Akkadian"},
}
m["akl"] = {
aliases = {"อักลาโนน", "Aklanon", "Aklan", "Akeanon"},
}
m["akm"] = {
other_names = {"Ba", "Bo"},
}
m["ako"] = {
}
m["akp"] = {
}
m["akq"] = {
}
m["akr"] = {
}
m["aks"] = {
other_names = {"Tchamba", "Akasele", "Tsamba"},
}
m["akt"] = {
}
m["aku"] = {
}
m["akv"] = {
}
m["akw"] = {
}
m["akx"] = {
other_names = {"Kede"},
}
m["aky"] = {
other_names = {"Kol", "Kawl", "Aka-Kawl", "Bojingiji"},
}
m["akz"] = {
aliases = {"Alabama"},
}
m["ala"] = {
}
m["alc"] = {
other_names = {"Qawasqar", "Alacaluf"},
}
m["ald"] = {
other_names = {"Alladyan", "Allagian", "Alaguian"},
}
m["ale"] = {
aliases = {"Aleutian"},
}
m["alf"] = {
}
m["alh"] = {
}
m["ali"] = {
}
m["alj"] = {
}
m["alk"] = {
}
m["all"] = {
other_names = {"Chatan"},
}
m["alm"] = {
}
m["alo"] = {
varieties = {"Allang", "Larike", "Wakasihu"},
}
m["alp"] = {
}
m["alq"] = {
}
m["alr"] = {
aliases = {"Alyutor"},
}
m["alt"] = {
aliases = {"Southern Altai", "Southern Altay", "Altai", "Altay"},
}
m["alu"] = {
aliases = {"Areare"},
}
m["alw"] = {
other_names = {"Alaba-K'abeena", "Alaaba", "K'abeena"},
}
m["alx"] = {
aliases = {"Alatil", "Mol"}, -- Alatil is ISO's old name (pre-2007); Mol is Glottolog's name
}
m["aly"] = {
}
m["alz"] = {
}
m["ama"] = {
}
m["amb"] = {
}
m["amc"] = {
}
m["ame"] = {
other_names = {"Amuesha"},
}
m["amf"] = {
aliases = {"Hamer", "Hamer-Banna"},
}
m["amg"] = {
other_names = {"Amarag"},
}
m["ami"] = {
other_names = {"Nataoran Amis"},
}
m["amj"] = {
other_names = {"Biltine", "Mimi"},
}
m["amk"] = {
other_names = {"Wadapi-Laut"},
}
m["aml"] = {
}
m["amm"] = {
aliases = {"Ama (New Guinea)", "Ama (Papua New Guinea)"},
}
m["amn"] = {
}
m["amo"] = {
other_names = {"Timap", "Map", "Among", "Amap", "Amon"},
}
m["amp"] = {
varieties = {"Karawari", "Kuvenmas"},
}
m["amq"] = {
}
m["amr"] = {
}
m["ams"] = {
aliases = {"Southern Amami-Oshima"},
}
m["amt"] = {
}
m["amu"] = {
other_names = {"Amuzgo", "Xochistlahuaca Amuzgo", "Northern Amuzgo", "Southern Amuzgo"},
}
m["amv"] = {
}
m["amw"] = {
}
m["amx"] = {
varieties = {"Eastern Anmatyerre", "Western Anmatyerre"},
}
m["amy"] = {
other_names = {"Ame", "Amijangal"},
}
m["amz"] = {
}
m["ana"] = {
aliases = {"Andaquí", "Andakí", "Andaki"},
}
m["anb"] = {
other_names = {"Shimigae", "Semigae", "Gae", "Gay", "Gaye", "Siaviri", "Katsakáti"},
}
m["anc"] = {
other_names = {"Angas", "Angass", "Hill Ngas", "Plain Ngas", "Hill Angas", "Plain Angas", "Karang", "Kerang"},
}
m["and"] = {
}
m["ane"] = {
aliases = {"Xaracuu"},
}
m["anf"] = {
}
m["ang"] = {
aliases = {"อังกฤษโบราณ", "แองโกล-แซกซัน", "Old English", "Anglo-Saxon"},
}
m["anh"] = {
other_names = {"Nent", "Angaua"},
}
m["ani"] = {
}
m["anj"] = {
}
m["ank"] = {
}
m["anl"] = {
other_names = {"Khaungtso", "Anu-Hkongso", "Anu-Hkongso Chin"}, -- the last is the ISO's unattested blend of the names of its two dialects and half of the name of the place where it's spoken
}
m["anm"] = {
other_names = {"Anal", "Anaal", "Namfau"}, -- Namfau is actually a placename
}
m["ann"] = {
}
m["ano"] = {
pseudo_families = "sai",
}
m["anp"] = {
}
m["anq"] = {
aliases = {"Jarawa (India)"},
}
m["anr"] = {
}
m["ans"] = {
}
m["ant"] = {
}
m["anu"] = {
aliases = {"Anyua", "Anywa", "Anyuak"},
}
m["anv"] = {
}
m["anw"] = {
other_names = {"Anang", "Annang", "Western Ibibio"},
}
m["anx"] = {
}
m["any"] = {
aliases = {"Anyin"},
}
m["anz"] = {
aliases = {"Anêm"},
varieties = {"Akiblik", "Coastal Anem"},
pseudo_families = "paa",
}
m["aoa"] = {
}
m["aob"] = {
pseudo_families = "paa",
}
m["aoc"] = {
other_names = {"Pemón", "Arekuna", "Arecuna", "Taurepan", "Taurepán", "Taurepang", "Taulipang", "Taulipáng", "Kamarakoto", "Camaracoto", "Camaragoto"},
}
m["aod"] = {
}
m["aoe"] = {
}
m["aof"] = {
}
m["aog"] = {
other_names = {"Pondo", "Kanda", "Maramba"},
}
m["aoi"] = {
aliases = {"Enindhilyagwa"},
}
m["aoj"] = {
other_names = {"Muhian", "Muhiang"},
varieties = {"Balif", "Filifita", "Iwam-Nagalemb", "Nagipaem", "Supari"},
}
m["aok"] = {
}
m["aol"] = {
aliases = {"Alor"},
}
m["aom"] = {
varieties = {"Asapa", "Gora-Bomahouji", "Zuwadza"},
}
m["aon"] = {
varieties = {"Bonahoi", "Timingir", "Urita", "Weril", "Werir"},
}
m["aor"] = {
}
m["aos"] = {
}
m["aot"] = {
aliases = {"Atong (India)", "Atong", "A'tong"},
}
m["aou"] = {
other_names = {"Ayo", "A'ou Gelao"},
}
m["aox"] = {
}
m["aoz"] = {
aliases = {"Dawanese", "Dawan", "Atoni"},
}
m["apb"] = {
other_names = {"South Malaita", "Apae'aa"},
}
m["apc"] = {
}
m["apd"] = {
aliases = {"Sudanese Arabic"},
}
m["ape"] = {
varieties = {"Coastal Arapesh", "Nuclear Bukiyip"},
}
m["apf"] = {
}
m["apg"] = {
}
m["aph"] = {
other_names = {"Athpariya"},
}
m["api"] = {
aliases = {"Apiacá"},
}
m["apj"] = {
aliases = {"Jicarilla Apache"},
}
m["apk"] = {
aliases = {"Kiowa Apache"},
}
m["apl"] = {
aliases = {"Lipan Apache"},
}
m["apm"] = {
other_names = {"Mescalero", "Mescalero-Chiricahua Apache"}, -- two dialects combined by Ethnologue
}
m["apn"] = {
aliases = {"Apinajé", "Apinagé", "Apinaye", "Apinaje", "Apinage"},
}
m["apo"] = {
aliases = {"Apalik"},
}
m["app"] = {
}
m["apq"] = {
other_names = {"Pucikwar", "Puchikwar", "Aka-Pucikwar", "Pujjukar", "Bójigiáb", "Bojigiab", "Bojigyab"}, -- last three may apply also to other languages
}
m["apr"] = {
}
m["aps"] = {
}
m["apt"] = {
other_names = {"Apa Tani", "Tanii"},
}
m["apu"] = {
}
m["apv"] = {
}
m["apw"] = {
aliases = {"Western Apache"},
}
m["apx"] = {
}
m["apy"] = {
aliases = {"Apalai"},
}
m["apz"] = {
varieties = {"Aiewomba", "Wajakes"},
}
m["aqc"] = {
}
m["aqd"] = {
}
m["aqg"] = {
}
m["aqm"] = {
}
m["aqn"] = {
}
m["aqp"] = {
other_names = {"Akokisa", "Orcoquiza", "Eastern Atakapa", "Western Atakapa"},
pseudo_families = "nai",
}
m["aqr"] = {
}
m["aqt"] = {
}
m["aqz"] = {
}
m["arc"] = {
aliases = {"แอราเมอิก", "Aramaic", "Aramaean", "Aramean"},
-- varieties are in [[Module:etymology language/data]]
}
m["ard"] = {
}
m["are"] = {
aliases = {"Western Arrarnta"}, -- Glottolog
varieties = {"Akerre", "Pertame", "Tyuretye Arrernte"},
}
m["arh"] = {
other_names = {"Ika"},
}
m["ari"] = {
}
m["arj"] = {
}
m["ark"] = {
}
m["arl"] = {
}
m["arn"] = {
aliases = {"Mapuche", "Mapudungün", "Mapuzugün", "Mapudungu", "Araucanian"},
varieties = {"Moluche", "Pehuenche", "Picunche"},
}
m["aro"] = {
}
m["arp"] = {
}
m["arq"] = {
aliases = {"Algerian Arabic"},
}
m["arr"] = {
other_names = {"Karo", "Karo (Brazil)", "Ramarama", "Itanga", "Itogapuc", "Itogapúk", "Ntogapid", "Ntogapig", "Arára", "Arára de Rondonia", "Arára do Jiparaná", "Uruku", "Urukú"},
}
m["ars"] = {
}
m["aru"] = {
aliases = {"Aruá", "Arawa", "Arawá"}, -- extinct, northern Brazil, cf. 'arx'
}
m["arv"] = {
}
m["arw"] = {
aliases = {"อาราวัก", "อาโรวัก", "อารวก", "โลโคโน", "Lokono", "Arawak", "Arowak", "Aruak", "Locono"},
}
m["arx"] = {
aliases = {"Arua", "Aruashi", "Aruáshi", "Aruachi"}, -- moribund, central Brazil, cf 'aru'
}
m["ary"] = {
aliases = {"Moroccan Arabic"},
varieties = {"Judeo-Moroccan Arabic"}, -- formerly aju
}
m["arz"] = {
aliases = {"Egyptian Arabic"},
}
m["asa"] = {
other_names = {"Asu", "Asu (Tanzania)", "Chasu", "Kipare", "Southern Pare", "South Pare"},
}
m["asb"] = {
}
m["asc"] = {
varieties = {"Matia", "Sapan"},
}
m["ase"] = {
aliases = {"American Sign Language", "Ameslan", "ASL"},
}
m["asf"] = {
aliases = {"Australian Sign Language"},
}
m["asg"] = {
aliases = {"Shingini"},
}
m["ash"] = {
other_names = {"Tequiraca", "Tekiráka", "Avishiri", "Auishiri", "Agouisiri", "Avirxiri", "Abiquira", "Abigira", "Aiwa", "Aewa"},
pseudo_families = "sai",
}
m["asi"] = {
}
m["asj"] = {
aliases = {"Sari", "Saari"},
}
m["ask"] = {
}
m["asl"] = {
}
m["asn"] = {
}
m["aso"] = {
varieties = {"Amaizuho", "Bohena", "Kongi", "Lunube Mado", "Upper Asaro"},
}
m["asp"] = {
}
m["asq"] = {
}
m["asr"] = {
aliases = {"Asur"},
}
m["ass"] = {
}
m["ast"] = {
aliases = {"Asturian"},
}
m["asu"] = {
other_names = {"Asurini", "Asuriní", "Asuriní of Tocantins", "Asuriní do Tocantins", "Akwawa", "Akwáwa"},
}
m["asv"] = {
}
m["asw"] = {
aliases = {"Australian Aborigines Sign Language"},
}
m["asx"] = {
varieties = {"Asat", "Aset", "Miratayak"}, -- per Glottolog
}
m["asy"] = {
}
m["asz"] = {
}
m["ata"] = {
aliases = {"Ata", "Wasi"},
-- Presumably Ata and Pele are the same as Lower and Upper, but which is which is impossible to tell.
varieties = {{"Ata", "Ata (New Britain)"}, {"Pele", "Pele (New Britain)"}, "Lower dialect", "Upper dialect"},
pseudo_families = "paa",
}
m["atb"] = {
}
m["atc"] = {
}
m["atd"] = {
}
m["ate"] = {
aliases = {"Mand"},
}
m["atg"] = {
other_names = {"Ivbie North", "Arhe", "Ivbie North-Okpela-Arhe"},
}
m["ati"] = {
}
m["atj"] = {
}
m["atk"] = {
}
m["atl"] = {
}
m["atm"] = {
}
m["ato"] = {
aliases = {"Atoŋ", "Atong"},
}
m["atp"] = {
}
m["atq"] = {
}
m["atr"] = {
}
m["ats"] = {
other_names = {"Atsina"},
}
m["att"] = {
}
m["atu"] = {
}
m["atv"] = {
aliases = {"Northern Altai", "Northern Altay", "Altai", "Altay"},
}
m["atw"] = {
aliases = {"Atsugé"},
}
m["atx"] = {
}
m["aty"] = {
aliases = {"Aneityum"},
}
m["atz"] = {
}
m["aua"] = {
}
m["aub"] = {
}
m["auc"] = {
other_names = {"Waorani", "Sabela", "Wao", "Huao", "Aushiri", "Ssabela", "Wao Terero", "Auka", "Auca"},
pseudo_families = "sai",
}
m["aud"] = {
}
m["aug"] = {
}
m["auh"] = {
}
m["aui"] = {
}
m["auj"] = {
aliases = {"Awjilah", "Augila"},
}
m["auk"] = {
}
m["aul"] = {
}
m["aum"] = {
other_names = {"Abewa", "Asu (Nigeria)"},
}
m["aun"] = {
varieties = {"Central Aunalei", "North Aunalei", "South Aunalei"},
}
m["auo"] = {
}
m["aup"] = {
aliases = {"Tirio", "Makaeyam", "Aturu", "Atura", "Adulu"},
varieties = {"Giribam"},
}
m["auq"] = {
other_names = {"A", "Korur", "Korurnus"}, -- no name attested? lect may be same as 'pdn'
}
m["aur"] = {
}
m["aut"] = {
}
m["auu"] = {
aliases = {"Auwje"},
}
m["auw"] = {
aliases = {"Awye"},
}
m["aux"] = {
}
m["auy"] = {
aliases = {"Awiyaana"},
}
m["auz"] = {
aliases = {"Uzbeki Arabic", "Uzbek Arabic"},
}
m["avb"] = {
}
m["avd"] = {
other_names = {"Alviri", "Vidari"},
}
m["avi"] = {
}
m["avk"] = {
aliases = {"Kotava"},
}
m["avm"] = {
}
m["avn"] = {
}
m["avs"] = {
}
m["avt"] = {
}
m["avu"] = {
}
m["avv"] = {
other_names = {"Avá", "Canoe"},
}
m["awa"] = {
aliases = {"อวธี", "โอธี", "Awadhi", "Oudhi"},
}
m["awb"] = {
aliases = {"Awa", "Awa (Papua New Guinea)"},
varieties = {"Ilakia", "Northeast Awa", "South Awa", "Tauna"},
}
m["awc"] = {
aliases = {"Cipu"},
}
m["awe"] = {
}
m["awg"] = {
other_names = {"Alngith", "Leningitij", "Mpakwithi"},
}
m["awh"] = {
aliases = {"Awban"},
}
m["awi"] = {
aliases = {"Awin", "Aiwin", "Akium"},
varieties = {"East Awin", "North Awin", "South Awin"},
}
m["awk"] = {
}
m["awm"] = {
}
m["awn"] = {
}
m["awo"] = {
}
m["awr"] = {
}
m["aws"] = {
varieties = {"Ia River Awyu", "Shiaxa", "Sjiagha", "Syiaxa", "Bamgi River Awyu", "Yenimu", "Jénimu", "Oser"},
}
m["awt"] = {
}
m["awu"] = {
}
m["awv"] = {
aliases = {"Kia River Awyu"}, -- per Glottolog
}
m["aww"] = {
aliases = {"Auwon"}, -- per Glottolog
}
m["awx"] = {
}
m["awy"] = {
}
m["axb"] = {
other_names = {"Abipon", "Callaga", "Kalyaga"},
}
m["axe"] = {
}
m["axg"] = {
}
m["axk"] = {
other_names = {"Yaka", "Yaka (Central African Republic)", "Aka", "Beka"}, -- cf 'iyx', 'yaf'
}
m["axl"] = {
other_names = {"Lower Southern Arrernte", "Southern Arrernte", "Southern Aranda"},
}
m["axm"] = {
aliases = {"Middle Armenian"},
}
m["axx"] = {
aliases = {"Xaragure"},
}
m["aya"] = {
varieties = {"Nubia", "Nuclear Awar"},
}
m["ayb"] = {
aliases = {"Ayizo Gbe"},
}
m["ayd"] = {
aliases = {"Ayapathu", "Badhu"},
}
m["aye"] = {
}
m["ayg"] = {
aliases = {"Nyanga", "Ginyanga"},
}
m["ayi"] = {
}
m["ayk"] = {
aliases = {"Akhukhu"},
}
m["ayl"] = {
aliases = {"Libyan Arabic"},
}
m["ayn"] = {
aliases = {"Yemeni Arabic"},
}
m["ayo"] = {
other_names = {"Morotoco", "Moro", "Ayoweo", "Ayoré", "Pyeta Yovai"},
}
m["ayp"] = {
aliases = {"North Mesopotamian Arabic"},
}
m["ayq"] = {
aliases = {"Ayi (New Guinea)", "Ayi (Papua New Guinea)"},
}
m["ays"] = {
}
m["ayt"] = {
other_names = {"Magbukun Ayta", "Mariveleño"},
}
m["ayu"] = {
}
-- ayy removed from ISO and deleted; see comment in [[Module:languages/data/3/a]]
m["ayz"] = {
aliases = {"Mai Brat", "Ajamaru", "Ayamaru"},
varieties = {{"Maisefa", varieties = {"Mayhapeh", "Maymare", "Maymaru"}},
"Mayasmaun", "Mayte"},
}
m["aza"] = {
}
m["azd"] = {
}
m["azg"] = {
other_names = {"Upper Eastern Amuzgo", "Oaxaca Amuzgo"},
}
m["azm"] = {
other_names = {"Lower Eastern Amuzgo"},
}
m["azn"] = {
}
m["azo"] = {
}
m["azt"] = {
}
m["azz"] = {
}
return m
4b1dpn34be0j7nprdhxugfk94am932d
แม่แบบ:mul-numberchart
10
335257
5775713
5719252
2026-10-20T08:18:54Z
Octahedron80
267
5775713
wikitext
text/x-wiki
{{top3}}
{{#ifeq:{{{type|all}}}|nondigit||
* [[w:ตัวเลขอาหรับตะวันออก|ตัวเลขอาหรับ (ตะวันออก)]]: {{#if:{{{arab|}}}|{{lang|mul|sc=Arab|{{{arab}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขอาหรับ|ตัวเลขอาหรับ (ตะวันตก)]]: {{#if:{{{numb|}}}|{{{numb}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|digit||
* [[w:ตัวเลขอาร์มีเนีย|ตัวเลขอาร์มีเนีย]]: {{#if:{{{armn|}}}|{{{armn}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|nondigit||
* [[w:ตัวเลขอัสสัม|ตัวเลขอัสสัม]]: {{#if:{{{beng|}}}|{{lang|mul|sc=Beng|{{{beng}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรบาหลี|ตัวเลขบาหลี]]: {{#if:{{{bali|}}}|{{lang|mul|sc=Bali|{{{bali}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขเบงกอล|ตัวเลขเบงกอล]]: {{#if:{{{beng|}}}|{{lang|mul|sc=Beng|{{{beng}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|all|
* [[w:ตัวเลขพราหมี|ตัวเลขพราหมี]]: {{#if:{{{brah|}}}|{{lang|mul|sc=Brah|{{{brah}}}}}{{#if:{{{brah2|}}}|, {{q|ประจำหลัก}} {{lang|mul|sc=Brah|{{{brah2}}}}}|}}|''กรุณาเพิ่มหากคุณทราบ''}}|{{#ifeq:{{{type}}}|digit|
* [[w:ตัวเลขพราหมี|ตัวเลขพราหมี]]: {{#if:{{{brah2|}}}|{{lang|mul|sc=Brah|{{{brah2}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}|{{#ifeq:{{{type}}}|nondigit|
* [[w:ตัวเลขพราหมี|ตัวเลขพราหมี]]: {{#if:{{{brah|}}}|{{lang|mul|sc=Brah|{{{brah}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}|
* <span style="foreground:red"> Type must be digit, nondigit, all or omitted.</span>
}}}}}}{{#ifeq:{{{type|all}}}|nondigit||
* [[w:อักษรจักมา|ตัวเลขจักมา]]: {{#if:{{{cakm|}}}|{{lang|mul|sc=Cakm|{{{cakm}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรจาม|ตัวเลขจาม]]: {{#if:{{{cham|}}}|{{lang|mul|sc=Cham|{{{cham}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|digit||
* [[w:ตัวเลขจีน|ตัวเลขจีน]]: {{#if:{{{hant|}}}|{{lang|mul|sc=Hant|{{{hant}}}}}{{#if:{{{hant2|}}}|, {{lang|mul|sc=Hant|{{{hant2}}}}}|}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:รอยคะแนน|รอยคะแนนจีน-ญี่ปุ่น-เกาหลี]]: {{#if:{{{cjktally|}}}|{{{cjktally}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:แท่งนับจีน|แท่งนับจีน]]: {{#if:{{{rod|}}}|{{{rod}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|nondigit||
* [[w:ตัวเลขอินเดีย|ตัวเลขเทวนาครี]]: {{#if:{{{deva|}}}|{{lang|mul|sc=Deva|{{{deva}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรดิเวส อกุรุ|ตัวเลขดิเวส อกุรุ]]: {{#if:{{{diak|}}}|{{lang|mul|sc=Deva|{{{diak}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|digit||
* [[w:ตัวเลขอียิปต์|ตัวเลขอียิปต์]]: {{#if:{{{egyp|}}}|{{lang|mul|sc=Egyp|{{{egyp}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรกืออึซ|ตัวเลขเอธิโอเปีย]]: {{#if:{{{ethi|}}}|{{{ethi}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรกอทิก|ตัวเลขกอทิก]]: {{#if:{{{goth|}}}|{{{goth}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขกรีก|ตัวเลขกรีก]]: {{#if:{{{grek|}}}|{{{grek}}}{{#ifeq:{{{grek2|}}}|-||, {{lc:{{{grek}}}}}}}{{#if:{{{grek2|}}}|{{#ifeq:{{{grek2|}}}|-||, {{{grek2}}}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|nondigit||
* [[w:ตัวเลขอินเดีย|ตัวเลขคุชราต]]: {{#if:{{{gujr|}}}|{{lang|mul|sc=Gujr|{{{gujr}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขอินเดีย|ตัวเลขคุรมุขี]]: {{#if:{{{guru|}}}|{{{guru}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:Hanifi Rohingya script|Hanifi Rohingya numerals]]: {{#if:{{{rohg|}}}|{{lang|mul|sc=Rohg|{{{rohg|}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|digit||
* [[w:ตัวเลขฮีบรู|ตัวเลขฮีบรู]]: {{#if:{{{hebr|}}}|{{lang|mul|sc=Hebr|{{{hebr|}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|nondigit||
* [[w:ตัวเลขชวา|ตัวเลขชวา]]: {{#if:{{{java|}}}|{{lang|mul|sc=Java|{{{java}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขอินเดีย|ตัวเลขกันนฑะ]]: {{#if:{{{knda|}}}|{{lang|mul|sc=Knda|{{{knda}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรกวิ|ตัวเลขกวิ]]: {{#if:{{{kawi|}}}|{{lang|mul|sc=Kawi|{{{kawi}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:Kayah Li alphabet|Kayah Li numerals]]: {{#if:{{{kali|}}}|{{lang|mul|sc=Kali|{{{kali}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขเขมร|ตัวเลขเขมร]]: {{#if:{{{khmr|}}}|{{lang|mul|sc=Khmr|{{{khmr}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรคุดาบาด|ตัวเลขคุดาบาด]]: {{#if:{{{sind|}}}|{{lang|mul|sc=Sind|{{{sind}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรธรรมล้านนา|ตัวเลขล้านนา]]: {{#if:{{{lana|}}}| {{q|ทางโลก}} {{lang|mul|sc=Lana|{{{lana}}}}}{{#if:{{{lana2|}}}|, {{q|ทางธรรม}} {{lang|mul|sc=Lana|{{{lana2}}}}}|}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขลาว|ตัวเลขลาว]]: {{#if:{{{laoo|}}}|{{lang|mul|{{{laoo}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรเลปชา|ตัวเลขเลปชา]]: {{#if:{{{lepc|}}}|{{lang|mul|sc=Lepc|{{{lepc}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรลิมบู|ตัวเลขลิมบู]]: {{#if:{{{limb|}}}|{{lang|mul|sc=Limb|{{{limb}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขอินเดีย|ตัวเลขมลยาฬัม]]: {{#if:{{{mlym|}}}|{{lang|mul|sc=Mlym|{{{mlym}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรมณีปุระ|ตัวเลขมณีปุระ]]: {{#if:{{{mtei|}}}|{{lang|mul|sc=Mtei|{{{mtei}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรมองโกเลีย|ตัวเลขมองโกเลีย]]: {{#if:{{{mong|}}}|{{{mong}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรพม่า|ตัวเลขพม่า]]: {{#if:{{{mymr|}}}|{{lang|mul|sc=Mymr|{{{mymr}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรอึนโก|ตัวเลขอึนโก]]: {{#if:{{{nkoo|}}}|{{lang|mul|sc=Nkoo|{{{nkoo}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:Ol Chiki script|Ol Chiki numerals]]: {{#if:{{{olck|}}}|{{lang|mul|sc=Olck|{{{olck}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|digit||
* [[w:อักษรเปอร์เซียเก่า|ตัวเลขเปอร์เซียเก่า]]: {{#if:{{{xpeo|}}}|{{lang|mul|sc=Xpeo|{{{xpeo}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|nondigit||
* [[w:ตัวเลขอินเดีย|ตัวเลขโอริยา]]: {{#if:{{{orya|}}}|{{lang|mul|sc=Orya|{{{orya}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรอุสมาน|ตัวเลขอุสมาน]]: {{#if:{{{osma|}}}|{{lang|mul|sc=Osma|{{{osma}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขอาหรับตะวันออก|ตัวเลขเปอร์เซีย]]: {{#if:{{{fa-arab|}}}|{{lang|mul|sc=Arab|{{{fa-arab}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|digit||
* [[w:ตัวเลขโรมัน|ตัวเลขโรมัน]]: {{#if:{{{latn|}}}|<samp>{{{latn}}}</samp>{{#ifeq:{{{latn2|}}}|-||, <samp>{{lc:{{{latn}}}}}</samp>}}{{#if:{{{latn2|}}}|{{#ifeq:{{{latn2|}}}|-||, {{{latn2}}}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|nondigit||
* [[w:อักษรเสาราษฏร์|ตัวเลขเสาราษฏร์]]: {{#if:{{{saur|}}}|{{lang|mul|sc=Saur|{{{saur}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรศารทา|ตัวเลขศารทา]]: {{#if:{{{shrd|}}}|{{lang|mul|sc=Shrd|{{{shrd}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|all|
* [[w:อักษรสิงหล|ตัวเลขสิงหล]]: {{#if:{{{sinh|}}}|{{lang|mul|sc=Sinh|{{{sinh}}}}}{{#if:{{{sinh2|}}}|, {{q|โบราณ}} {{lang|mul|sc=Sinh|{{{sinh2}}}}}|}}|''กรุณาเพิ่มหากคุณทราบ''}}|{{#ifeq:{{{type}}}|digit|
* [[w:อักษรสิงหล|ตัวเลขสิงหล]]: {{#if:{{{sinh|}}}|{{lang|mul|sc=Sinh|{{{sinh}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}|{{#ifeq:{{{type}}}|nondigit|
* [[w:อักษรสิงหล|ตัวเลขสิงหล]]: {{#if:{{{sinh2|}}}|{{lang|mul|sc=Sinh|{{{sinh2}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}|
* <span style="foreground:red"> Type must be digit, nondigit, all or omitted.</span>
}}}}}}{{#ifeq:{{{type|all}}}|nondigit||
* [[w:อักษรซุนดา|ตัวเลขซุนดา]]: {{#if:{{{sund|}}}|{{lang|mul|sc=Sund|{{{sund}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรฏากรี|ตัวเลขฏากรี]]: {{#if:{{{takr|}}}|{{lang|mul|sc=Takr|{{{takr}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|digit||
* [[w:รอยคะแนน|รอยคะแนน]]: {{#if:{{{tally|}}}|{{{tally}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}{{#ifeq:{{{type|all}}}|nondigit||
* [[w:ตัวเลขอินเดีย|ตัวเลขทมิฬ]]: {{#if:{{{taml|}}}|{{{taml}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขอินเดีย|ตัวเลขเตลูกู]]: {{#if:{{{telu|}}}|{{lang|mul|sc=Telu|{{{telu}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขไทย|ตัวเลขไทย]]: {{#if:{{{thai|}}}|{{lang|mul|sc=Thai|{{{thai}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:ตัวเลขอินเดีย|ตัวเลขทิเบต]]: {{#if:{{{tibt|}}}|{{lang|mul|sc=Tibt|{{{tibt}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรติรหุตา|ตัวเลขติรหุตา]]: {{#if:{{{tirh|}}}|{{lang|mul|sc=Tirh|{{{tirh}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
* [[w:อักษรวรังจิติ|ตัวเลขวรังจิติ]]: {{#if:{{{wara|}}}|{{lang|mul|sc=Wara|{{{wara}}}}}|''กรุณาเพิ่มหากคุณทราบ''}}
}}
{{bottom}}<!--
--><noinclude>{{documentation}}</noinclude>
r1abp66qi0mutnzp16zn9bs1mkbqpnn
มอดูล:th-utilities
828
338046
5775726
5775472
2026-10-20T09:56:05Z
Octahedron80
267
5775726
Scribunto
text/plain
local export = {}
local sub = mw.ustring.sub
local gsub = mw.ustring.gsub
local len = mw.ustring.len
local find = mw.ustring.find
local match = mw.ustring.match
local en_utilities = require("Module:en-utilities")
local thai_digits = {"๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙"}
local thai_words = {"ศูนย์", "หนึ่ง", "สอง", "สาม", "สี่", "ห้า", "หก", "เจ็ด", "แปด", "เก้า"}
local thai_words2 = {["."]="จุด",["-"]="ขีด",["+"]="บวก",["−"]="ลบ",["/"]="ทับ"}
-- from [[Module:headword/data]]
local thai_pos = {
-- these are lemmas
["abbreviations"] = "คำย่อ",
["acronyms"] = "อักษรย่อรวมพยางค์",
["adjectives"] = "คำคุณศัพท์",
--["adnominals"] = "adnominals",
--["adpositions"] = "adpositions",
["adverbs"] = "คำกริยาวิเศษณ์",
["affixes"] = "หน่วยคำเติม",
--["ambipositions"] = "ambipositions",
["articles"] = "คำกำกับนาม",
["circumfixes"] = "หน่วยคำเติมคร่อม",
--["circumpositions"] = "circumpositions",
["classifiers"] = "คำลักษณนาม",
["cmavo"] = "ชมาโว",
--["cmavo clusters"] = "cmavo clusters",
["cmene"] = "ชเมเน",
--["combining forms"] = "combining forms",
["conjunctions"] = "คำสันธาน",
--["counters"] = "counters",
["determiners"] = "ตัวกำหนด",
--["diacritical marks"] = "diacritical marks",
["digraphs"] = "ทวิอักษร",
["fu'ivla"] = "ฟูฮิฝลา",
["gismu"] = "กิสมู",
["Han characters"] = "อักษรจีน",
["Han tu"] = "ฮั้นถื่อ",
["hanja"] = "ฮันจา",
["hanzi"] = "ฮั่นจื้อ",
--["ideophones"] = "ideophones",
["idioms"] = "สำนวน",
["infixes"] = "อาคม",
["initialisms"] = "อักษรย่อ",
["iteration marks"] = "เครื่องหมายซ้ำ",
["interfixes"] = "หน่วยคำเติมเชื่อม",
["interjections"] = "คำอุทาน",
["kana"] = "คานะ",
["kanji"] = "คันจิ",
["letters"] = "ตัวอักษร",
["ligatures"] = "ตัวอักษรควบ",
--["logograms"] = "logograms",
["lujvo"] = "ลุฌโว",
["morae"] = "มอรา",
["morphemes"] = "หน่วยคำ",
--["non-constituents"] = "non-constituents",
["nouns"] = "คำนาม",
["numbers"] = "จำนวน",
["numeral symbols"] = "ตัวเลข",
["numerals"] = "เลข", ["num"] = "เลข",
["particles"] = "คำอนุภาค",
["phrases"] = "วลี",
["postpositions"] = "คำปัจฉบท",
["postpositional phrases"] = "วลีปัจฉบท",
--["predicatives"] = "predicatives",
["prefixes"] = "อุปสรรค",
["prepositional phrases"] = "วลีบุพบท",
["prepositions"] = "คำบุพบท",
["preverbs"] = "คำกริยาเติมหน้า",
--["pronominal adverbs"] = "pronominal adverbs",
["pronouns"] = "คำสรรพนาม",
["proper nouns"] = "คำวิสามานยนาม", ["propn"] = "คำวิสามานยนาม",
["proverbs"] = "สุภาษิต",
["punctuation marks"] = "เครื่องหมายวรรคตอน",
--["relatives"] = "relatives",
["roots"] = "ราก",
["stems"] = "ต้นเค้าศัพท์",
["suffixes"] = "ปัจจัย",
["syllables"] = "พยางค์",
["symbols"] = "สัญลักษณ์",
["verbs"] = "คำกริยา",
-- these are non-lemmas
["active participle forms"] = "รูปผันรูปกริยาขยายกรรตุวาจก",
["active participles"] = "รูปกริยาขยายกรรตุวาจก",
["adjectival participles"] = "รูปกริยาขยายเชิงคุณศัพท์",
--["adjective case forms"] = "adjective case forms",
["adjective forms"] = "รูปคุณศัพท์",
--["adjective feminine forms"] = "adjective feminine forms",
["adjective plural forms"] = "รูปคุณศัพท์พหูพจน์",
["adverb forms"] = "รูปกริยาวิเศษณ์",
["adverbial participles"] = "รูปกริยาขยายเชิงกริยาวิเศษณ์",
--["agent participles"] = "agent participles",
["article forms"] = "รูปกำกับนาม",
["circumfix forms"] = "รูปหน่วยคำเติมคร่อม",
--["combined forms"] = "combined forms",
["comparative adjective forms"] = "รูปคุณศัพท์ขั้นกว่า",
["comparative adjectives"] = "คำคุณศัพท์ขั้นกว่า",
["comparative adverb forms"] = "รูปกริยาวิเศษณ์ขั้นกว่า",
["comparative adverbs"] = "คำกริยาวิเศษณ์ขั้นกว่า",
["conjunction forms"] = "รูปสันธาน",
["contractions"] = "รูปหดย่อ",
--["converbs"] = "converbs",
["determiner comparative forms"] = "รูปตัวกำหนดขั้นกว่า",
["determiner forms"] = "รูปตัวกำหนด",
["determiner superlative forms"] = "รูปตัวกำหนดขั้นสุด",
["diminutive nouns"] = "คำนามบอกความเล็ก",
--["elative adjectives"] = "elative adjectives",
["equative adjective forms"] = "รูปคุณศัพท์ขั้นเท่า",
["equative adjectives"] = "คำคุณศัพท์ขั้นเท่า",
["future participles"] = "รูปกริยาขยายอนาคตกาล",
["gerunds"] = "รูปกริยาเป็นนาม",
["infinitive forms"] = "รูปผันรูปกริยากลาง",
["infinitives"] = "รูปกริยากลาง",
["interjection forms"] = "รูปอุทาน",
["jyutping"] = "ยฺหวืดเพ็ง",
["misspellings"] = "รูปสะกดผิด",
--["negative participles"] = "negative participles",
--["nominal participles"] = "nominal participles",
--["noun case forms"] = "noun case forms",
["noun dual forms"] = "รูปนามทวิพจน์",
["noun forms"] = "รูปนาม", ["nf"] = "รูปนาม", ["nounf"] = "รูปนาม",
["noun paucal forms"] = "รูปนามบอกความน้อย",
["noun plural forms"] = "รูปนามพหูพจน์",
--["noun possessive forms"] = "noun possessive forms",
--["noun singulative forms"] = "noun singulative forms",
["numeral forms"] = "รูปเลข",
["participles"] = "รูปกริยาขยาย",
["participle forms"] = "รูปผันรูปกริยาขยาย",
["particle forms"] = "รูปอนุภาค",
["passive participles"] = "รูปกริยาขยายกรรมวาจก",
["past active participles"] = "รูปกริยาขยายกรรตุวาจกอดีตกาล",
["past participles"] = "รูปกริยาขยายอดีตกาล",
["past participle forms"] = "รูปผันรูปกริยาขยายอดีตกาล",
["past passive participles"] = "รูปกริยาขยายกรรมวาจกอดีตกาล",
--["perfect active participles"] = "perfect active participles",
--["perfect participles"] = "perfect participles",
--["perfect passive participles"] = "perfect passive participles",
["pinyin"] = "พินอิน",
["plurals"] = "พหูพจน์",
["postposition forms"] = "รูปปัจฉบท",
["prefix forms"] = "รูปอุปสรรค",
--["preposition contractions"] = "preposition contractions",
["preposition forms"] = "รูปบุพบท",
--["prepositional pronouns"] = "prepositional pronouns",
["present active participles"] = "รูปกริยาขยายกรรตุวาจกปัจจุบันกาล",
["present participles"] = "รูปกริยาขยายปัจจุบันกาล",
["present passive participles"] = "รูปกริยาขยายกรรมวาจกปัจจุบันกาล",
["pronoun forms"] = "รูปสรรพนาม",
--["pronoun possessive forms"] = "pronoun possessive forms",
["proper noun forms"] = "รูปวิสามานยนาม",
["proper noun plural forms"] = "รูปวิสามานยนามพหูพจน์",
["rafsi"] = "รัฟซี",
["romanizations"] = "การถอดเป็นอักษรโรมัน",
--["root forms"] = "root forms",
--["singulatives"] = "singulatives",
["suffix forms"] = "รูปปัจจัย",
["superlative adjective forms"] = "รูปคุณศัพท์ขั้นสุด",
["superlative adjectives"] = "คำคุณศัพท์ขั้นสุด",
["superlative adverb forms"] = "รูปกริยาวิเศษณ์ขั้นสุด",
["superlative adverbs"] = "คำกริยาวิเศษณ์ขั้นสุด",
["verb forms"] = "รูปกริยา",
["verbal nouns"] = "คำกริยานาม",
-- these are something else
["cardinal nouns"] = "คำนามเชิงการนับ",
["abstract nouns"] = "คำอาการนาม",
["auxiliary verbs"] = "คำกริยาช่วย",
["cardinal adjectives"] = "คำคุณศัพท์เชิงการนับ",
}
function export.th_pos(pos)
return thai_pos[pos] or thai_pos[en_utilities.pluralize(pos)] or pos
end
-- Converts Thai "lemma" category name into Thai "non-lemma form" category name
function export.th_pos_to_form(pos)
local result
if pos == "" or pos == "คำหลัก" or pos == "รูปผัน" then
result = "รูปผัน"
elseif find(pos, "^คำ") then
result = gsub(pos, "^คำ", "รูป") -- needs variable for the first return of gsub
elseif find(pos, "^รูป") then
result = "รูปผัน" .. pos
else
result = "รูป" .. pos
end
return result
end
-- Insert a full language name into a category name by Thai logic
function export.th_categorize(cat, langname)
local result
local isEndWithThai = find(cat, "[ก-๛]$")
if find(cat, "^ศัพท์") then
result = "ศัพท์" .. langname .. sub(cat, 6)
elseif find(cat, "^รายการ") then
result = "รายการ" .. langname .. sub(cat, 7)
elseif find(cat, "★") then -- inserts in-between at ★
result = gsub(cat, "★", langname) -- needs variable for the first return of gsub
else
result = cat .. (isEndWithThai and "" or " ") .. langname
end
return result
end
-- Converts Arabic numbers (e.g., "123") to Thai numbers (e.g., "๑๒๓")
function export.arabic_to_thai_digits(num)
local str = tostring(num)
for i = 0, 9 do
str = gsub(str, tostring(i), thai_digits[i + 1])
end
return str
end
-- Converts Thai numbers (e.g., "๑๒๓") to Arabic numbers (e.g., "123")
function export.thai_to_arabic_digits(str)
str = tostring(str)
for i, thai_char in ipairs(thai_digits) do
str = gsub(str, thai_char, tostring(i - 1))
end
return str
end
-- Read Number as Value
function export.number_to_thai_words(num)
local str = tostring(num)
str = gsub(str, ",", "")
str = export.thai_to_arabic_digits(str)
-- Handle signs
local prefix = ""
local first_char = sub(str, 1, 1)
if first_char == "-" then
prefix = thai_words2["−"] -- Mathematical "ลบ"
str = sub(str, 2)
elseif first_char == "+" then
prefix = thai_words2["+"]
str = sub(str, 2)
end
-- Split string into integer and decimal parts
local intPart, decPart = match(str, "^(%d*)%.?(%d*)$")
if (not intPart or intPart == "") and (not decPart or decPart == "") then
return "Invalid input"
end
-- Strip leading zeros from integer part
if intPart == "" then intPart = "0" end
intPart = match(intPart, "^0*(.+)$") or "0"
-- Helper: Process Integer Part
local function get_integer_words(s)
if s == "0" then return thai_words[1] end
local positions = {"", "สิบ", "ร้อย", "พัน", "หมื่น", "แสน"}
local result = ""
local length = len(s)
for i = 1, length do
local d = tonumber(sub(s, i, i))
local pos = length - i + 1
local effPos = ((pos - 1) % 6) + 1
if d ~= 0 then
local word = thai_words[d + 1]
if d == 1 and effPos == 1 and i > 1 then
word = "เอ็ด"
end
if d == 1 and effPos == 2 then
word = ""
end
if d == 2 and effPos == 2 then
word = "ยี่"
end
result = result .. word .. positions[effPos]
end
if pos > 1 and effPos == 1 then
result = result .. "ล้าน"
end
end
return result
end
-- Helper: Process Decimal Part
local function get_decimal_words(s)
if not s or s == "" then return "" end
local result = thai_words2["."]
for i = 1, len(s) do
local d = tonumber(sub(s, i, i))
result = result .. thai_words[d + 1]
end
return result
end
return prefix .. get_integer_words(intPart) .. get_decimal_words(decPart)
end
-- Read Number in Sequence
function export.read_number_in_sequence(num)
local str = tostring(num)
str = gsub(str, ",", "")
str = export.thai_to_arabic_digits(str)
local has_math_minus = false
if find(str, "−") then
has_math_minus = true
str = gsub(str, "−", "")
end
local result = ""
if has_math_minus then
result = result .. thai_words2["−"]
end
for i = 1, len(str) do
local char = sub(str, i, i)
local d = tonumber(char)
if d then
result = result .. thai_words[d + 1]
elseif thai_words2[char] then
result = result .. thai_words2[char]
end
end
return result
end
return export
06uks30lcd1d7oy6xy1d8itgf8cmid6
มอดูล:eu-pron/new
828
372808
5775720
1951931
2026-10-20T08:29:18Z
Octahedron80
267
5775720
Scribunto
text/plain
--Based on Module:es-pronunc by Benwing2.
local export = {}
local m_IPA = require("Module:IPA")
local m_table = require("Module:table")
local decorations_module = "Module:decorations"
local put_module = "Module:parse utilities"
local force_cat = false -- for testing
local lang = require("Module:languages").getByCode("eu")
local u = mw.ustring.char
local rfind = mw.ustring.find
local rsubn = mw.ustring.gsub
local rmatch = mw.ustring.match
local rsplit = mw.text.split
local ulower = mw.ustring.lower
local uupper = mw.ustring.upper
local usub = mw.ustring.sub
local ulen = mw.ustring.len
local unfd = mw.ustring.toNFD
local unfc = mw.ustring.toNFC
local TILDE = u(0x0303) -- tilde = ̃
local AC = u(0x0301) --acute ´
local SYLDIV = u(0xFFF0) -- used to represent a user-specific syllable divider (.) so we won't change it
local BREVE = u(0x032F)
local vowel = "aeiouAEIOU" -- vowel; include y so we get single-word y correct and for syllabifying from spelling
local V = "[" .. vowel .. "]" -- vowel class
local W = "[wʝ]" -- glides, used in a few loanwords
local sylsep = "%-." .. SYLDIV -- hyphen included for syllabifying from spelling
local sylsep_c = "[" .. sylsep .. "]"
local wordsep = "# "
local separator = sylsep .. wordsep
local separator_c = "[" .. separator .. "]"
local C = "[^" .. vowel .. separator .. "]" -- consonant class including h
-- 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
-- apply rsub() repeatedly until no change
local function rsub_repeatedly(term, foo, bar)
while true do
local new_term = rsub(term, foo, bar)
if new_term == term then
return term
end
term = new_term
end
end
local function decompose(text, rh_to_rac)
-- decompose everything but ñ and ŕ
text = unfd(text)
text = rsub(text, ".[" .. TILDE .. AC .. "]", {
["n" .. TILDE] = "ñ",
["N" .. TILDE] = "Ñ",
["r" .. AC] = "ŕ",
["R" .. AC] = "Ŕ"
})
if rh_to_rac then
text = rsub(text, "rh$", "r")
text = rsub(text, "rh([%- ])", "r%1")
text = rsub(text, "ŕ", "r")
text = rsub(text, "Ŕ", "R")
end
return text
end
local function split_on_comma(term)
if term:find(",%s") then
return require(put_module).split_on_comma(term)
else
return rsplit(term, ",")
end
end
-- Remove any HTML from the formatted text and resolve links, since the extra characters don't contribute to the
-- displayed length.
local function convert_to_raw_text(text)
text = rsub(text, "<.->", "")
if text:find("%[%[") then
text = require("Module:links").remove_links(text)
end
return text
end
-- Return the approximate displayed length in characters.
local function textual_len(text)
return ulen(convert_to_raw_text(text))
end
local function construct_default_differences(dialect)
if dialect == "gipuzkoan" then
return {
northern_different = false,
j_different = false,
need_bisc = false,
}
end
return nil
end
-- Main syllable-division algorithm
local function syllabify_from_spelling_or_pronun(text)
text = rsub_repeatedly(text, "(" .. V .. ")(" .. C .. W .. "?" .. V .. ")", "%1.%2")
text = rsub_repeatedly(text, "(" .. V .. C .. ")(" .. C .. V .. ")", "%1.%2")
text = rsub_repeatedly(text, "(" .. V .. C .. ")(" .. C .. C .. V .. ")", "%1.%2")
text = rsub_repeatedly(text, "(" .. V .. C .. C .. ")(" .. C .. C .. V .. ")", "%1.%2")
text = rsub(text, "([pfbktdɡg])%.([lrɾ])", ".%1%2") --the first "ɡ" is the IPA one; the second "g" is the regular one
text = rsub_repeatedly(text, "(" .. C .. ")%.s(" .. C .. ")", "%1s.%2")
-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
text = rsub_repeatedly(text, "([ae]" .. ")ui", "%1u.i")
text = rsub_repeatedly(text, "([aeiou]" .. ")([aeo])", "%1.%2")
text = rsub_repeatedly(text, "ii", "i.i")
text = rsub_repeatedly(text, "([iou]" .. ")u", "%1.u")
return text
end
local function syllabify_from_spelling(text)
text = decompose(text)
-- start at FFF1 because FFF0 is used for SYLDIV
-- Temporary replacements for characters we want treated as default consonants. The C and related consonant regexes
-- treat all unknown characters as consonants.
local TEMP_tz = u(0xFFF1)
local TEMP_ts = u(0xFFF2)
local TEMP_tx = u(0xFFF3)
local TEMP_tx_CAPS = u(0xFFF4)
local TEMP_ll = u(0xFFF5)
local TEMP_ll_CAPS = u(0xFFF6)
local TEMP_dd = u(0xFFF7)
local TEMP_dd_CAPS = u(0xFFF8)
local TEMP_tt = u(0xFFF9)
local TEMP_tt_CAPS = u(0xFFFA)
local TEMP_rr = u(0xFFB)
-- Change user-specified . into SYLDIV so we don't shuffle it around when dividing into syllables.
text = text:gsub("%.", SYLDIV)
-- handle digraphs
text = rsub(text, "tz", TEMP_tz)
text = rsub(text, "ts", TEMP_ts)
text = rsub(text, "tx", TEMP_tx)
text = rsub(text, "Tx", TEMP_tx_CAPS)
text = rsub(text, "ll", TEMP_ll)
text = rsub(text, "Ll", TEMP_ll_CAPS)
text = rsub(text, "tt", TEMP_tt)
text = rsub(text, "Tt", TEMP_tt_CAPS)
text = rsub(text, "dd", TEMP_dd)
text = rsub(text, "Dd", TEMP_dd_CAPS)
text = rsub(text, "rr", TEMP_rr)
text = syllabify_from_spelling_or_pronun(text)
text = text:gsub(SYLDIV, ".")
text = text:gsub(TEMP_tz, "tz")
text = text:gsub(TEMP_ts, "ts")
text = text:gsub(TEMP_tx, "tx")
text = text:gsub(TEMP_tx_CAPS, "Tx")
text = text:gsub(TEMP_ll, "ll")
text = text:gsub(TEMP_ll_CAPS, "Ll")
text = text:gsub(TEMP_tt, "tt")
text = text:gsub(TEMP_tt_CAPS, "Tt")
text = text:gsub(TEMP_dd, "dd")
text = text:gsub(TEMP_dd_CAPS, "Dd")
text = text:gsub(TEMP_rr, "rr")
text = unfc(text)
return text
end
-- Generate the IPA of a given respelling, where a respelling is the representation of the pronunciation of a given
function export.IPA(text, dialect, phonetic)
local northern = dialect == "northern"
local southern = dialect == "gipuzkoan" or dialect == "navarrese" or dialect == "biscayan"
local nav = dialect == "navarrese"
local bisc = dialect == "biscayan"
local northern_different = false
local j_different = false
local need_bisc = false
local J = ""
local N = ""
-- start at FFF1 because FFF0 is used for SYLDIV
local TEMP_Y = u(0xFFF1)
local TEMP_W = u(0xFFF2)
--function that gets the last two syllables (used for generating the correct rhymes)
local function extract_last_syllables(text)
local words = rsplit(text, " ")
if #words > 1 then --no rhymes are generated when there are multiple words
return ""
end
text = rsub(text, "([aeou])i", "%1")
text = rsub(text, "([ae])u", "%1")
local length = string.len(text)
local rhyme = ""
local count = -1
local syl = 0
while count > -length do
if string.find("aeiou", string.sub(text,count,count)) then
rhyme = string.sub(text,count,-1)
syl = syl + 1
if syl == 2 then
return rhyme
end
end
count = count - 1
end
return rhyme
end
if not text then
error("Internal error: `text` must be passed in")
end
text = ulower(text)
-- decompose everything but ñ and ü
text = decompose(text)
-- convert commas and en/en dashes to IPA foot boundaries
text = rsub(text, "%s*[,–—]%s*", " | ")
-- question mark or exclamation point in the middle of a sentence -> IPA foot boundary
text = rsub(text, "([^%s])%s*[!?]%s*([^%s])", "%1 | %2")
-- canonicalize multiple spaces and remove leading and trailing spaces
local function canon_spaces(text)
text = rsub(text, "%s+", " ")
text = rsub(text, "^ ", "")
text = rsub(text, " $", "")
return text
end
text = canon_spaces(text)
-- Convert hyphens to spaces, to handle [[Austria-Hungría]], [[franco-italiano]], etc.
text = rsub(text, "%-", " ")
-- canonicalize multiple spaces again, which may have been introduced by hyphens
text = canon_spaces(text)
-- now eliminate punctuation
text = rsub(text, "[!?']", "")
-- put # at word beginning and end and double ## at text/foot boundary beginning/end
text = rsub(text, " | ", "# | #")
text = "##" .. rsub(text, " ", "# #") .. "##"
--determining whether "h" denotes a phoneme, or the lack of palatalization, palatalization when needed
text = rsub(text, "nh", "N")
text = rsub(text, "lh", "L")
text = rsub(text, "rh#", "ɾ#")
text = rsub(text, "ŕ", "ɾ#")
text = rsub(text, "([aeo])il([# .h]*[aeiou])", (northern and "%1ił%2" or "%1ĺ%2"))
text = rsub(text, "([aeo])in([# .h]*[aeiou])", (northern and "%1iň%2" or "%1ń%2"))
text = rsub(text, "uin([# .h]*[aeiou])", (northern and "uiň%1" or "uiń%1"))
text = rsub(text, "uil([# .h]*[aeiou])", (northern and "uił%1" or "uiĺ%1"))
text = rsub(text, "il([# .h]*[aeiou])", (northern and "ił%1" or "iĺ%1"))
text = rsub(text, "in([# .h]*[aeiou])", (northern and "iň%1" or "iń%1"))
if text:find("[łňńĺh]") then
northern_different = true
end
if extract_last_syllables(text):find("[łňńĺh]") then
N = "N"
end
text = rsub(text, "ĺ", "ʎ")
text = rsub(text, "ń", "ɲ")
text = rsub(text, "N", "n")
text = rsub(text, "L", "l")
text = rsub(text, "ň", "n")
text = rsub(text, "ł", "l")
--c, g, q
text = rsub(text, "ng([^aeiouüwhlr])", "n%1") -- [[Bangkok]], [[angstrom]], etc.
text = rsub(text, "q", "k") -- [[quark]], [[Qatar]], [[burqa]], [[Iraq]], etc.
text = rsub(text, "c", "k") -- [[campus]], etc.
--alphabet-to-phoneme
text = rsub(text, "aje#", "aʒe#") -- final -aje is pronounced /aʒe/ in the North and /axe/ in the South, regardless of how native j is pronounced
text = rsub(text, "ihoa", "iχoa") -- the <h> in conjugated forms of joan is pronounced in the South
text = rsub(text, "zh", "ź")
text = rsub(text, "tx", "C") --not the real sound
text = rsub(text, "tz", "Ś") --not the real sound
text = rsub(text, "ts", "S") --not the real sound
text = rsubb(text, "ll", "ʎ")
text = rsubb(text, "dd", "ɟ")
text = rsubb(text, "tt", "c")
text = rsub(text, "x", "ʃ")
text = rsub(text, "#p([st])", "#%1") -- [[psicologia]], [[pterodaktilo]]
text = rsub(text, "[gñrvz]",
{ ["g"] = "ɡ", ["ñ"] = "ɲ", ["v"] = "b", ["z"] = "ś" })
if text:find("ś") or text:find("S") then
need_bisc = true
end
--/x/~/j/~/ʒ/ sounds
if text:find("[yj]") then
northern_different = true
j_different = true
end
if extract_last_syllables(text):find("[yj]") then
J = "J"
end
if text:find("ʒ") or text:find("χ") then
northern_different = true
end
if extract_last_syllables(text):find("ʒ") then
N = "N"
end
if text:find("kh") then
northern_different = true
end
if extract_last_syllables(text):find("kh") then
N = "N"
end
if text:find("ź") then
northern_different = true
end
if extract_last_syllables(text):find("ź") then
N = "N"
end
text = rsubb(text, "j", (northern and "ɟ" or "x"))
text = rsubb(text, "y", (northern and "ɟ" or "j")) -- <y> is used for words which always have a palatal
text = rsubb(text, "kh", (northern and "k" or "χ"))
text = rsubb(text, "ź", (northern and "ʒ" or "ʃ"))
-- trilled r (in all cases except between vowels)
text = rsub_repeatedly(text, "([aeiou])r([aeiou])", "%1ɾ%2") -- it has to be applied twice in order to handle VrVrV sequences
text = rsub(text, "rr", "r")
text = rsub(text, "n([# .]*[bpm])", "m%1")
-- lack of /h/ in Southern dialects
text = rsub_repeatedly(text, "([aeiou])h%1", northern and "%1h%1" or "%1")
text = rsub(text, "h", (northern and "h" or ""))
text = rsub(text, "n([# .]*[bpm])", "m%1")
-- handle i/u between vowels
text = rsub_repeatedly(text, "ui", "U") --this dipthong requires special treatment
local vowel_to_glide = { ["i"] = "i.", ["u"] = "u." }
text = rsub_repeatedly(text, "(" .. V .. "*)([iu])(" .. V .. ")",
function(v1, iu, v2)
return v1 .. vowel_to_glide[iu] .. v2
end
)
text = rsub_repeatedly(text, "U", "ui")
--syllable division
text = syllabify_from_spelling_or_pronun(text)
--dialectal differences
if nav then
text = rsub(text, "x", "j")
elseif bisc then --fake symbols, to be replaced later
text = rsub(text, "x", "đ")
text = rsub(text, "j", "đ")
text = rsub(text, "ś", "s")
text = rsub(text, "S", "Ś")
end
text = rsubb(text, "ʒ", (southern and "x" or "ʒ"))
text = rsubb(text, "χ", (southern and "x" or "h"))
--phonetic transcription
if phonetic then
-- θ, s, f before voiced consonants
local voiced = "mnɲbdɟɡʎljđ"
local r = "ɾr"
local tovoiced = {
["s"] = "z̺",
["ś"] = "z̻",
}
local function voice(sound, following)
return tovoiced[sound] .. following
end
text = rsub(text, "([sś])(" .. separator_c .. "*[" .. voiced .. r .. "])", voice)
-- fricative vs. stop allophones; first convert stops to fricatives, then back to stops
-- after nasals and sometimes after l
local stop_to_fricative = {["b"] = "β", ["d"] = "ð", ["ɡ"] = "ɣ"}
local fricative_to_stop = {["β"] = "b", ["ð"] = "d", ["ɣ"] = "ɡ"}
text = rsub(text, "[bdɡ]", stop_to_fricative)
text = rsub(text, "([mnɲ]" .. separator_c .. "*)([βɣ])",
function(nasal, fricative) return nasal .. fricative_to_stop[fricative] end
)
text = rsub(text, "([lʎmnɲ]" .. separator_c .. "*)([ð])",
function(nasal_l, fricative) return nasal_l .. fricative_to_stop[fricative] end
)
text = rsub(text, "##β", "##b")
text = rsub(text, "##ð", "##d")
text = rsub(text, "##ɣ", "##ɡ")
text = rsub(text, "[td]", {["t"] = "t̪", ["d"] = "d̪"})
-- nasal assimilation before consonants
local labiodental, dentialveolar, alveolopalatal, palatal, velar = "ɱ", "n̪", "nʲ", "ɲ", "ŋ"
local nasal_assimilation = {
["f"] = labiodental,
["t"] = dentialveolar, ["d"] = dentialveolar,
["C"] = alveolopalatal,
["ʃ"] = alveolopalatal,
["đ"] = alveolopalatal,
["ɟ"] = palatal, ["c"] = palatal, ["ʎ"] = palatal, ["j"] = palatal,
["k"] = velar, ["x"] = velar, ["ɡ"] = velar,
}
text = rsub(text, "n(" .. separator_c .. "*)(.)",
function(stress, following)
return (nasal_assimilation[following] or "n") .. stress .. following
end
)
-- lateral assimilation before consonants
text = rsub(text, "l(" .. separator_c .. "*)(.)",
function(stress, following)
local l = "l"
if following == "t" or following == "d" then
-- dentialveolar
l = "l̪"
elseif following == "C" or following == "ʃ" or following == "đ" then
-- alveolopalatal
l = "lʲ"
elseif following == "ɟ" or following == "c" or following == "j" then
-- alveolopalatal
l = "ʎ"
end
return l .. stress .. following
end)
-- voiced fricatives are actually approximants
text = rsub(text, "([βðɣ])", "%1̞")
--nasalization of vowels
text = rsub(text, "([aeou])i([mnɲ])", "%1" .. TILDE .. "i" .. TILDE .. "%2")
text = rsub(text, "([ae])u([mnɲ])", "%1" .. TILDE .. "u" .. TILDE .. "%2")
text = rsub(text, "([aeiou])([mnɲ])", "%1" .. TILDE .. "%2")
--word final /ɾ/
text = rsub(text, "ɾ#", "R#")
text = rsub(text, "R#([# .]*[aeiou])", "ɾ#%1")
text = rsub(text, "R", "r")
end
--semivowels
text = rsub(text, "([aeou])" .. TILDE .. "([i])", "%1" .. TILDE .. "%2̯")
text = rsub(text, "([ae])" .. TILDE .. "([u])", "%1" .. TILDE .. "%2̯")
text = rsub(text, "([aeou][i])", "%1̯")
text = rsub(text, "([ae][u])", "%1̯")
text = rsub(text, "u̯i̯", "u̯i") --correct the mistake appeareing in words with aui, eui
-- convert fake symbols to real ones
local final_conversions = {
["S"] = "t͡s̺",
["Ś"] = "t͡s̻",
["s"] = "s̺",
["ś"] = "s̻",
["C"] = "t͡ʃ",
["X"] = "x",
["đ"] = "d͡ʒ",
["ʝ"] = "j"
}
text = rsub(text, "[SŚsśCXđʝ]", final_conversions)
-- remove # symbols at word and text boundaries
text = rsub(text, "#", "")
text = mw.ustring.toNFC(text)
--add technical characters to the end of the rhyme in order to parse the rhymes correctly
text = text .. J .. N
local differences = nil
if dialect == "gipuzkoan" then
differences = {
northern_different = northern_different,
need_bisc = need_bisc,
j_different = j_different,
}
end
local ret = {
text = text,
differences = differences,
}
return ret
end
function export.IPA_string(frame)
local iparams = {
[1] = {},
["style"] = {required = true},
["phonetic"] = {type = "boolean"},
}
local iargs = require("Module:parameters").process(frame.args, iparams)
local retval = export.IPA(iargs[1] or mw.loadData("Module:headword/data").pagename, iargs.style, iargs.phonetic)
return retval.text
end
-- Generate all relevant dialect pronunciations and group into styles.
local function express_all_styles(style_spec, dodialect)
local ret = {
pronun = {},
expressed_styles = {},
}
local need_bisc
local function express_style(hidden_tag, tag, representative_dialect, matching_styles)
matching_styles = matching_styles or representative_dialect
-- If style specified, make sure it matches the requested style.
local style_matches
if not style_spec then
style_matches = true
else
local style_parts = rsplit(matching_styles, "%-")
local or_styles = rsplit(style_spec, "%s*,%s*")
for _, or_style in ipairs(or_styles) do
local and_styles = rsplit(or_style, "%s*%+%s*")
local and_matches = true
for _, and_style in ipairs(and_styles) do
local negate
if and_style:find("^%-") then
and_style = and_style:gsub("^%-", "")
negate = true
end
local this_style_matches = false
for _, part in ipairs(style_parts) do
if part == and_style then
this_style_matches = true
break
end
end
if negate then
this_style_matches = not this_style_matches
end
if not this_style_matches then
and_matches = false
end
end
if and_matches then
style_matches = true
break
end
end
end
if not style_matches then
return
end
-- Fetch the representative dialect's pronunciation if not already present.
if not ret.pronun[representative_dialect] then
dodialect(ret, representative_dialect)
end
-- Insert the new style into the style group, creating the group if necessary.
local new_style = {
tag = tag,
pronun = ret.pronun[representative_dialect],
}
for _, hidden_tag_style in ipairs(ret.expressed_styles) do
if hidden_tag_style.tag == hidden_tag then
table.insert(hidden_tag_style.styles, new_style)
return
end
end
table.insert(ret.expressed_styles, {
tag = hidden_tag,
styles = {new_style},
})
end
-- For each type of difference, figure out if the difference exists in any of the given respellings. We do this by
-- generating the pronunciation for the dialect "gipuzkoan", for each respelling. In the process of
-- generating the pronunciation for a given respelling, it computes how the other dialects for that respelling
-- differ. Then we take the union of these differences across the respellings.
dodialect(ret, "gipuzkoan")
local differences = {}
for _, difftype in ipairs { "northern_different", "j_different", "need_bisc"} do
for _, pronun in ipairs(ret.pronun["gipuzkoan"]) do
if pronun.differences[difftype] then
differences[difftype] = true
end
end
end
local northern_different = differences.northern_different
local j_different = differences.j_different
need_bisc = differences.need_bisc
-- Now, based on the observed differences, figure out how to combine the individual dialects into styles and style groups.
if northern_different then
express_style("<<Navarro-Lapurdian>>","<<Navarro-Lapurdian>>","northern")
if j_different then
express_style("<<Southern>>","<<Gipuzkoan>>","gipuzkoan")
express_style("<<Southern>>","<<Biscayan>>","biscayan")
express_style("<<Southern>>","<<Navarrese>>","navarrese")
else
if need_bisc then
express_style("<<Southern>>","<<Gipuzkoan>>, <<Navarrese>>","gipuzkoan")
express_style("<<Southern>>","<<Biscayan>>","biscayan")
else
express_style("<<Southern>>","Southern","gipuzkoan")
end
end
else
if j_different then
express_style("<<Navarro-Lapurdian>>","<<Navarro-Lapurdian>>","northern")
express_style("<<Southern>>","<<Gipuzkoan>>","gipuzkoan")
express_style("<<Southern>>","<<Biscayan>>","biscayan")
express_style("<<Southern>>","<<Navarrese>>","navarrese")
elseif need_bisc then
express_style(false,"most dialects","gipuzkoan")
express_style(false,"<<Biscayan>>","biscayan")
else
express_style(false,false,"gipuzkoan")
end
end
return ret
end
local function format_all_styles(expressed_styles, format_style)
for i, style_group in ipairs(expressed_styles) do
if #style_group.styles == 1 then
style_group.formatted, style_group.formatted_len =
format_style(style_group.styles[1].tag, style_group.styles[1], i == 1)
else
style_group.formatted, style_group.formatted_len =
format_style(style_group.tag, style_group.styles[1], i == 1)
for j, style in ipairs(style_group.styles) do
style.formatted, style.formatted_len =
format_style(style.tag, style, i == 1 and j == 1)
end
end
end
local maxlen = 0
for i, style_group in ipairs(expressed_styles) do
local this_len = style_group.formatted_len
if #style_group.styles > 1 then
for _, style in ipairs(style_group.styles) do
this_len = math.max(this_len, style.formatted_len)
end
end
maxlen = math.max(maxlen, this_len)
end
local lines = {}
local need_major_hack = false
for i, style_group in ipairs(expressed_styles) do
if #style_group.styles == 1 then
table.insert(lines, style_group.formatted)
need_major_hack = false
else
local inline = '\n<div class="vsShow" style="display:none">\n' .. style_group.formatted .. "</div>"
local full_prons = {}
for _, style in ipairs(style_group.styles) do
table.insert(full_prons, style.formatted)
end
local full = '\n<div class="vsHide">\n' .. table.concat(full_prons, "\n") .. "</div>"
local em_length = math.floor(maxlen * 0.68) -- from [[Module:grc-pronunciation]]
table.insert(lines, '<div class="vsSwitcher" data-toggle-category="pronunciations" style="width: ' .. em_length .. 'em; max-width:100%;"><span class="vsToggleElement" style="float: right;"> </span>' .. inline .. full .. "</div>")
need_major_hack = true
end
end
-- major hack to get bullets working on the next line after a div box
return table.concat(lines, "\n") .. (need_major_hack and "\n<span></span>" or "")
end
local function dodialect_pronun(args, ret, dialect)
ret.pronun[dialect] = {}
for i, term in ipairs(args.terms) do
local phonemic, phonetic, differences
if term.raw then
phonemic = term.raw_phonemic
phonetic = term.raw_phonetic
differences = construct_default_differences(dialect)
else
phonemic = export.IPA(term.term, dialect, false)
phonetic = export.IPA(term.term, dialect, true)
differences = phonemic.differences
phonemic = phonemic.text
phonetic = phonetic.text
end
local refs
if not term.ref then
refs = nil
else
refs = {}
for _, refspec in ipairs(term.ref) do
local this_refs = require("Module:references").parse_references(refspec)
for _, this_ref in ipairs(this_refs) do
table.insert(refs, this_ref)
end
end
end
ret.pronun[dialect][i] = {
raw = term.raw,
phonemic = phonemic,
phonetic = phonetic,
refs = refs,
q = term.q,
qq = term.qq,
a = term.a,
aa = term.aa,
differences = differences,
}
end
end
local function generate_pronun(args)
local function remove_technical_chars(text)
return rsub(text, "([JN])", "")
end
local function this_dodialect_pronun(ret, dialect)
dodialect_pronun(args, ret, dialect)
end
local ret = express_all_styles(args.style, this_dodialect_pronun)
local function format_style(tag, expressed_style, is_first)
local pronunciations = {}
local formatted_pronuns = {}
local function ins(formatted_part)
table.insert(formatted_pronuns, formatted_part)
end
-- Loop through each pronunciation. For each one, add the phonemic and phonetic versions to `pronunciations`,
-- for formatting by [[Module:IPA]], and also create an approximation of the formatted version so that we can
-- compute the appropriate width of the HTML switcher div box that holds the different per-dialect variants.
-- NOTE: The code below constructs the formatted approximation out-of-order in some cases but that doesn't
-- currently matter because we assume all characters have the same width. If we change the width computation
-- in a way that requires the correct order, we need changes to the code below.
for j, pronun in ipairs(expressed_style.pronun) do
-- Add tag to right accent qualifiers if last one
local aas = pronun.aa
if j == #expressed_style.pronun and tag then
if aas then
aas = m_table.deepCopy(aas)
table.insert(aas, tag)
else
aas = {tag}
end
end
local first_pronun = #pronunciations + 1
if not pronun.phonemic and not pronun.phonetic then
error("Internal error: Saw neither phonemic nor phonetic pronunciation")
end
if pronun.phonemic then -- missing if 'raw:[...]' given
-- don't display syllable division markers in phonemic
local slash_pron = "/" .. remove_technical_chars(pronun.phonemic:gsub("%.", "")) .. "/"
table.insert(pronunciations, {
pron = slash_pron,
})
ins(slash_pron)
end
if pronun.phonetic then -- missing if 'raw:/.../' given
local bracket_pron = "[" .. remove_technical_chars(pronun.phonetic) .. "]"
table.insert(pronunciations, {
pron = bracket_pron,
})
ins(bracket_pron)
end
local last_pronun = #pronunciations
if pronun.q then
pronunciations[first_pronun].q = pronun.q
end
if pronun.a then
pronunciations[first_pronun].a = pronun.a
end
if j > 1 then
pronunciations[first_pronun].separator = ", "
ins(", ")
end
if pronun.qq then
pronunciations[last_pronun].qq = pronun.qq
end
if aas then
pronunciations[last_pronun].aa = aas
end
if pronun.q or pronun.qq or pronun.a or aas then
-- Note: This inserts the actual formatted qualifier text, including HTML and such, but the later call
-- to textual_len() removes all HTML and reduces links.
ins(require(decorations_module).format_decorations {
lang = lang,
text = "",
-- need to copy as formatting accent qualifiers destructively modifies the lists
q = m_table.shallowCopy(pronun.q),
qq = m_table.shallowCopy(pronun.qq),
a = m_table.shallowCopy(pronun.a),
aa = m_table.shallowCopy(aas),
})
end
if pronun.refs then
pronunciations[last_pronun].refs = pronun.refs
-- Approximate the reference using a footnote notation. This will be slightly inaccurate if there are
-- more than nine references but that is rare.
ins(string.rep("[1]", #pronun.refs))
end
if first_pronun ~= last_pronun then
pronunciations[last_pronun].separator = " "
ins(" ")
end
end
local bullet = string.rep("*", args.bullets) .. " "
-- Here we construct the formatted line in `formatted`, and also try to construct the equivalent without HTML
-- and wiki markup in `formatted_for_len`, so we can compute the approximate textual length for use in sizing
-- the toggle box with the "more" button on the right.
local pre = is_first and args.pre and args.pre .. " " or ""
local post = is_first and args.post and " " .. args.post or ""
local formatted = bullet .. pre .. m_IPA.format_IPA_full { lang = lang, items = pronunciations, separator = "" } .. post
local formatted_for_len = bullet .. pre .. "IPA(key): " .. table.concat(formatted_pronuns) .. post
return formatted, textual_len(formatted_for_len)
end
ret.text = format_all_styles(ret.expressed_styles, format_style)
return ret
end
local function parse_respelling(respelling, pagename, parse_err)
local raw_respelling = respelling:match("^raw:(.*)$")
if raw_respelling then
local raw_phonemic, raw_phonetic = raw_respelling:match("^/(.*)/ %[(.*)%]$")
if not raw_phonemic then
raw_phonemic = raw_respelling:match("^/(.*)/$")
end
if not raw_phonemic then
raw_phonetic = raw_respelling:match("^%[(.*)%]$")
end
if not raw_phonemic and not raw_phonetic then
parse_err(("Unable to parse raw respelling '%s', should be one of /.../, [...] or /.../ [...]")
:format(raw_respelling))
end
return {
raw = true,
raw_phonemic = raw_phonemic,
raw_phonetic = raw_phonetic,
}
end
if respelling == "+" then
respelling = pagename
end
return {term = respelling}
end
-- Return the number of syllables of a phonemic representation, which should have syllable dividers in it but no
-- hyphens.
local function get_num_syl_from_phonemic(phonemic)
-- Maybe we should just count vowels instead of the below code.
phonemic = rsub(phonemic, "|", " ") -- remove IPA foot boundaries
local words = rsplit(phonemic, " +")
for i, word in ipairs(words) do
-- IPA stress marks are syllable divisions if between characters; otherwise just remove.
word = rsub(word, "(.)[ˌˈ](.)", "%1.%2")
word = rsub(word, "[ˌˈ]", "")
words[i] = word
end
-- There should be a syllable boundary between words.
phonemic = table.concat(words, ".")
return ulen(rsub(phonemic, "[^.]", "")) + 1
end
-- Take the last two syllables for the ryhme, unless the word has a single syllable
local function convert_phonemic_to_rhyme(phonemic, short)
local syllables = rsplit(phonemic, "%.")
local rh = ""
if #syllables > 1 then
rh = short and syllables[#syllables] or table.concat(syllables, ".", #syllables - 1, #syllables)
else
rh = phonemic
end
return rsub(rh, "^[^" .. vowel .. "]*", ""):gsub("%.", ""):gsub("͡", "")
end
local function split_syllabified_spelling(spelling)
return rsplit(spelling, "%.")
end
-- "Align" syllabification to original spelling by matching character-by-character, allowing for extra syllable and
-- accent markers in the syllabification. If we encounter an extra syllable marker (.), we allow and keep it. If we
-- encounter an extra accent marker in the syllabification, we drop it. In any other case, we return nil indicating
-- the alignment failed.
local function align_syllabification_to_spelling(syllab, spelling)
local result = {}
local syll_chars = rsplit(decompose(syllab, true), "")
local spelling_chars = rsplit(decompose(spelling, false), "")
local i = 1
local j = 1
while i <= #syll_chars or j <= #spelling_chars do
local ci = syll_chars[i]
local cj = spelling_chars[j]
if ci == cj then
table.insert(result, ci)
i = i + 1
j = j + 1
elseif ci == "." then
table.insert(result, ci)
i = i + 1
elseif ci == AC then
-- skip character
i = i + 1
else
-- non-matching character
return nil
end
end
if i <= #syll_chars or j <= #spelling_chars then
-- left-over characters on one side or the other
return nil
end
return unfc(table.concat(result))
end
local function generate_hyph_obj(term)
return {syllabification = term, hyph = split_syllabified_spelling(term)}
end
-- Word should already be decomposed.
local function word_has_vowels(word)
return rfind(word, V)
end
local function all_words_have_vowels(term)
local words = rsplit(decompose(term, false), "[ %-]")
for i, word in ipairs(words) do
-- Allow empty word; this occurs with prefixes and suffixes.
if word ~= "" and not word_has_vowels(word) then
return false
end
end
return true
end
local function should_generate_rhyme_from_respelling(term)
local words = rsplit(decompose(term, false), " +")
return #words == 1 and -- no if multiple words
not words[1]:find(".%-.") and -- no if word is composed of hyphenated parts (e.g. [[Austria-Hungría]])
not words[1]:find("%-$") and -- no if word is a prefix
word_has_vowels(words[1]) -- no if word has no vowels (e.g. a single letter)
end
local function should_generate_rhyme_from_ipa(ipa)
return not ipa:find("%s") and word_has_vowels(decompose(ipa, false))
end
local function dodialect_specified_rhymes(rhymes, hyphs, parsed_respellings, rhyme_ret, dialect)
rhyme_ret.pronun[dialect] = {}
for _, rhyme in ipairs(rhymes) do
local num_syl = rhyme.num_syl
local no_num_syl = false
-- If user explicitly gave the rhyme but didn't explicitly specify the number of syllables, try to take it from
-- the hyphenation.
if not num_syl then
num_syl = {}
for _, hyph in ipairs(hyphs) do
if should_generate_rhyme_from_respelling(hyph.syllabification) then
local this_num_syl = 1 + ulen(rsub(hyph.syllabification, "[^.]", ""))
m_table.insertIfNot(num_syl, this_num_syl)
else
no_num_syl = true
break
end
end
if no_num_syl or #num_syl == 0 then
num_syl = nil
end
end
-- If that fails and term is single-word, try to take it from the phonemic.
if not no_num_syl and not num_syl then
for _, parsed in ipairs(parsed_respellings) do
for dialect, pronun in pairs(parsed.pronun.pronun[dialect]) do
-- Check that pronun.phonemic exists (it may not if raw phonetic-only pronun is given).
if pronun.phonemic then
if not should_generate_rhyme_from_ipa(pronun.phonemic) then
no_num_syl = true
break
end
-- Count number of syllables by looking at syllable boundaries (including stress marks).
local this_num_syl = get_num_syl_from_phonemic(pronun.phonemic)
m_table.insertIfNot(num_syl, this_num_syl)
end
end
if no_num_syl then
break
end
end
if no_num_syl or #num_syl == 0 then
num_syl = nil
end
end
table.insert(rhyme_ret.pronun[dialect], {
rhyme = rhyme.rhyme,
num_syl = num_syl,
q = rhyme.q,
qq = rhyme.qq,
a = rhyme.a,
aa = rhyme.aa,
differences = construct_default_differences(dialect),
})
end
end
local function parse_pron_modifier(arg, parse_err, generate_obj, param_mods, no_split_on_comma)
local retval = {}
if arg:find("<") then
local put = require(put_module)
local function get_valid_prefixes()
local valid_prefixes = {}
for param_mod, _ in pairs(param_mods) do
table.insert(valid_prefixes, param_mod)
end
table.insert(valid_prefixes, "q")
table.insert(valid_prefixes, "qq")
table.insert(valid_prefixes, "a")
table.insert(valid_prefixes, "aa")
table.sort(valid_prefixes)
return valid_prefixes
end
local segments = put.parse_balanced_segment_run(arg, "<", ">")
local comma_separated_groups =
no_split_on_comma and {segments} or put.split_alternating_runs_on_comma(segments)
for _, group in ipairs(comma_separated_groups) do
local obj = generate_obj(group[1])
for j = 2, #group - 1, 2 do
if group[j + 1] ~= "" then
parse_err("Extraneous text '" .. group[j + 1] .. "' after modifier")
end
local modtext = group[j]:match("^<(.*)>$")
if not modtext then
parse_err("Internal error: Modifier '" .. group[j] .. "' isn't surrounded by angle brackets")
end
local prefix, val = modtext:match("^([a-z]+):(.*)$")
if not prefix then
local valid_prefixes = get_valid_prefixes()
for i, valid_prefix in ipairs(valid_prefixes) do
valid_prefixes[i] = "'" .. valid_prefix .. ":'"
end
parse_err("Modifier " .. group[j] .. " lacks a prefix, should begin with one of " ..
m_table.serialCommaJoin(valid_prefixes))
end
if prefix == "q" or prefix == "qq" or prefix == "a" or prefix == "aa" then
if not obj[prefix] then
obj[prefix] = {}
end
table.insert(obj[prefix], val)
elseif param_mods[prefix] then
local key = param_mods[prefix].item_dest or prefix
if obj[key] then
parse_err("Modifier '" .. prefix .. "' specified more than once")
end
local convert = param_mods[prefix].convert
if convert then
obj[key] = convert(val)
else
obj[key] = val
end
else
local valid_prefixes = get_valid_prefixes()
for i, valid_prefix in ipairs(valid_prefixes) do
valid_prefixes[i] = "'" .. valid_prefix .. "'"
end
parse_err("Unrecognized prefix '" .. prefix .. "' in modifier " .. group[j]
.. ", should be " .. m_table.serialCommaJoin(valid_prefixes))
end
end
table.insert(retval, obj)
end
elseif no_split_on_comma then
table.insert(retval, generate_obj(arg))
else
for _, term in ipairs(split_on_comma(arg)) do
table.insert(retval, generate_obj(term))
end
end
return retval
end
local function parse_rhyme(arg, parse_err)
local function generate_obj(term)
return {rhyme = term}
end
local param_mods = {
s = {
item_dest = "num_syl",
convert = function(arg)
local nsyls = rsplit(arg, ",")
for i, nsyl in ipairs(nsyls) do
if not nsyl:find("^[0-9]+$") then
parse_err("Number of syllables '" .. nsyl .. "' should be numeric")
end
nsyls[i] = tonumber(nsyl)
end
return nsyls
end,
},
}
return parse_pron_modifier(arg, parse_err, generate_obj, param_mods)
end
local function parse_hyph(arg, parse_err)
-- None other than decorations
local param_mods = {}
return parse_pron_modifier(arg, parse_err, generate_hyph_obj, param_mods)
end
local function parse_homophone(arg, parse_err)
local function generate_obj(term)
return {term = term}
end
local param_mods = {
t = {
-- We need to store the <t:...> inline modifier into the "gloss" key of the parsed term,
-- because that is what [[Module:links]] (called from [[Module:homophones]]) expects.
item_dest = "gloss",
},
gloss = {},
pos = {},
alt = {},
lit = {},
id = {},
g = {
-- We need to store the <g:...> inline modifier into the "genders" key of the parsed term,
-- because that is what [[Module:links]] (called from [[Module:homophones]]) expects.
item_dest = "genders",
convert = function(arg)
return rsplit(arg, ",")
end,
},
}
return parse_pron_modifier(arg, parse_err, generate_obj, param_mods)
end
local function generate_audio_obj(arg)
local file, gloss
if arg:find("#") then
file, gloss = arg:match("^(.-)%s*#%s*(.*)$")
else
file, gloss = arg:match("^(.-)%s*;%s*(.*)$")
end
file = file or arg
return {file = file, gloss = gloss}
end
local function parse_audio(arg, parse_err)
-- None other than decorations
local param_mods = {}
-- Don't split on comma because some filenames have embedded commas not followed by a space
-- (typically followed by an underscore).
return parse_pron_modifier(arg, parse_err, generate_audio_obj, param_mods, "no split on comma")
end
-- External entry point for {{es-pr}}.
function export.show_pr(frame)
local params = {
[1] = {list = true},
["rhyme"] = true,
["hyph"] = true,
["hmp"] = true,
["audio"] = {list = true},
["pagename"] = true,
}
local parargs = frame:getParent().args
local args = require("Module:parameters").process(parargs, params)
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
-- Parse the arguments.
local function remove_technical_chars(text)
return rsub(text, "([JN])", "")
end
local respellings = #args[1] > 0 and args[1] or {"+"}
local parsed_respellings = {}
local function overall_parse_err(msg, arg, val)
error(msg .. ": " .. arg .. "= " .. val)
end
local overall_rhyme = args.rhyme and
parse_rhyme(args.rhyme, nil, function(msg) overall_parse_err(msg, "rhyme", args.rhyme) end) or nil
local overall_hyph = args.hyph and
parse_hyph(args.hyph, nil, function(msg) overall_parse_err(msg, "hyph", args.hyph) end) or nil
local overall_hmp = args.hmp and
parse_homophone(args.hmp, nil, function(msg) overall_parse_err(msg, "hmp", args.hmp) end) or nil
local overall_audio
if args.audio then
overall_audio = {}
for _, audio in ipairs(args.audio) do
local parsed_audio = parse_audio(audio, nil, function(msg) overall_parse_err(msg, "audio", audio) end)
if #parsed_audio > 1 then
error("Internal error: Saw more than one object returned from parse_audio")
end
table.insert(overall_audio, parsed_audio[1])
end
end
local put
for i, respelling in ipairs(respellings) do
local function parse_err(msg)
error(msg .. ": " .. i .. "= " .. respelling)
end
if respelling:find("<") then
if not put then
put = require(put_module)
end
local param_mods = {
pre = {},
post = {},
style = {},
bullets = {
convert = function(arg)
if not arg:find("^[0-9]+$") then
parse_err("Modifier 'bullets' should have a number as argument, but saw '" .. arg .. "'")
end
return tonumber(arg)
end,
},
rhyme = {
insert = true,
flatten = true,
convert = function(arg) return parse_rhyme(arg, parse_err) end,
},
hyph = {
insert = true,
flatten = true,
convert = function(arg) return parse_hyph(arg, parse_err) end,
},
hmp = {
insert = true,
flatten = true,
convert = function(arg) return parse_homophone(arg, parse_err) end,
},
audio = {
insert = true,
flatten = true,
convert = function(arg) return parse_audio(arg, parse_err) end,
},
}
local function get_valid_prefixes()
local valid_prefixes = {}
for param_mod, _ in pairs(param_mods) do
table.insert(valid_prefixes, param_mod)
end
table.insert(valid_prefixes, "ref")
table.insert(valid_prefixes, "q")
table.insert(valid_prefixes, "qq")
table.insert(valid_prefixes, "a")
table.insert(valid_prefixes, "aa")
table.sort(valid_prefixes)
return valid_prefixes
end
local segments = put.parse_balanced_segment_run(respelling, "<", ">")
local comma_separated_groups = put.split_alternating_runs_on_comma(segments, ",")
local parsed = {terms = {}, audio = {}, rhyme = {}, hyph = {}, hmp = {}}
for j, group in ipairs(comma_separated_groups) do
local termobj = parse_respelling(group[1], pagename, parse_err)
for k = 2, #group - 1, 2 do
if group[k + 1] ~= "" then
parse_err("Extraneous text '" .. group[k + 1] .. "' after modifier")
end
local modtext = group[k]:match("^<(.*)>$")
if not modtext then
parse_err("Internal error: Modifier '" .. group[k] .. "' isn't surrounded by angle brackets")
end
local prefix, arg = modtext:match("^([a-z]+):(.*)$")
if not prefix then
local valid_prefixes = get_valid_prefixes()
for i, valid_prefix in ipairs(valid_prefixes) do
valid_prefixes[i] = "'" .. valid_prefix .. ":'"
end
parse_err("Modifier " .. group[k] .. " lacks a prefix, should begin with one of " ..
m_table.serialCommaJoin(valid_prefixes))
end
if prefix == "ref" or prefix == "q" or prefix == "qq" or prefix == "a" or prefix == "aa" then
if not termobj[prefix] then
termobj[prefix] = {}
end
table.insert(termobj[prefix], arg)
elseif param_mods[prefix] then
if j < #comma_separated_groups then
parse_err("Modifier '" .. prefix .. "' should occur after the last comma-separated term")
end
if not param_mods[prefix].insert and parsed[prefix] then
parse_err("Modifier '" .. prefix .. "' occurs twice, second occurrence " .. group[k])
end
local converted
if param_mods[prefix].convert then
converted = param_mods[prefix].convert(arg)
else
converted = arg
end
if param_mods[prefix].insert then
if param_mods[prefix].flatten then
for _, obj in ipairs(converted) do
table.insert(parsed[prefix], obj)
end
else
table.insert(parsed[prefix], converted)
end
else
parsed[prefix] = converted
end
else
local valid_prefixes = get_valid_prefixes()
for i, valid_prefix in ipairs(valid_prefixes) do
valid_prefixes[i] = "'" .. valid_prefix .. "'"
end
parse_err("Unrecognized prefix '" .. prefix .. "' in modifier " .. group[k]
.. ", should be " .. m_table.serialCommaJoin(valid_prefixes))
end
end
table.insert(parsed.terms, termobj)
end
if not parsed.bullets then
parsed.bullets = 1
end
table.insert(parsed_respellings, parsed)
else
local termobjs = {}
for _, term in ipairs(split_on_comma(respelling)) do
table.insert(termobjs, parse_respelling(term, pagename, parse_err))
end
table.insert(parsed_respellings, {
terms = termobjs,
audio = {},
rhyme = {},
hyph = {},
hmp = {},
bullets = 1,
})
end
end
if overall_hyph then
local hyphs = {}
for _, hyph in ipairs(overall_hyph) do
if hyph.syllabification == "+" then
hyph.syllabification = syllabify_from_spelling(pagename)
hyph.hyph = split_syllabified_spelling(hyph.syllabification)
elseif hyph.syllabification == "-" then
overall_hyph = {}
break
end
end
end
-- Loop over individual respellings, processing each.
for _, parsed in ipairs(parsed_respellings) do
parsed.pronun = generate_pronun(parsed)
local no_auto_rhyme = false
for _, term in ipairs(parsed.terms) do
if term.raw then
if not should_generate_rhyme_from_ipa(term.raw_phonemic or term.raw_phonetic) then
no_auto_rhyme = true
break
end
elseif not should_generate_rhyme_from_respelling(term.term) then
no_auto_rhyme = true
break
end
end
if #parsed.hyph == 0 then
if not overall_hyph and all_words_have_vowels(pagename) then
for _, term in ipairs(parsed.terms) do
if not term.raw then
local syllabification = syllabify_from_spelling(term.term)
local aligned_syll = align_syllabification_to_spelling(syllabification, pagename)
if aligned_syll then
m_table.insertIfNot(parsed.hyph, generate_hyph_obj(aligned_syll))
end
end
end
end
else
for _, hyph in ipairs(parsed.hyph) do
if hyph.syllabification == "+" then
hyph.syllabification = syllabify_from_spelling(pagename)
hyph.hyph = split_syllabified_spelling(hyph.syllabification)
elseif hyph.syllabification == "-" then
parsed.hyph = {}
break
end
end
end
-- Generate the rhymes.
local function dodialect_rhymes_from_pronun(rhyme_ret, dialect)
rhyme_ret.pronun[dialect] = {}
-- It's possible the pronunciation for a passed-in dialect was never generated. This happens e.g. with
-- {{es-pr|cebolla<style:seseo>}}. The initial call to generate_pronun() fails to generate a pronunciation
-- for the dialect 'distinction-yeismo' because the pronunciation of 'cebolla' differs between distincion
-- and seseo and so the seseo style restriction rules out generation of pronunciation for distincion
-- dialects (other than 'gipuzkoan', which always gets generated so as to determine on which axes
-- the dialects differ). However, when generating the rhyme, it is based only on -olla, whose pronunciation
-- does not differ between distincion and seseo, but does differ between lleismo and yeismo, so it needs to
-- generate a yeismo-specific rhyme, and 'distincion-yeismo' is the representative dialect for yeismo in the
-- situation where distincion and seseo do not have distinct results (based on the following line in
-- express_all_styles()):
-- express_style(false, "most of Spain and Latin America", "distincion-yeismo", "distincion-seseo-yeismo")
-- In this case we need to generate the missing overall pronunciation ourselves since we need it to generate
-- the dialect-specific rhyme pronunciation.
if not parsed.pronun.pronun[dialect] then
dodialect_pronun(parsed, parsed.pronun, dialect)
end
for _, pronun in ipairs(parsed.pronun.pronun[dialect]) do
-- We should have already excluded multiword terms and terms without vowels from rhyme generation (see
-- `no_auto_rhyme` below). But make sure to check that pronun.phonemic exists (it may not if raw
-- phonetic-only pronun is given).
if pronun.phonemic then
-- Count number of syllables by looking at syllable boundaries (including stress marks).
local num_syl = get_num_syl_from_phonemic(pronun.phonemic)
-- Get the rhyme by truncating everything up through the last stress mark + any following
-- consonants, and remove syllable boundary markers.
local rhyme = convert_phonemic_to_rhyme(pronun.phonemic, false)
local short_rhyme = convert_phonemic_to_rhyme(pronun.phonemic, true)
local saw_already = false
for _, existing in ipairs(rhyme_ret.pronun[dialect]) do
if existing.rhyme == rhyme then
saw_already = true
-- We already saw this rhyme but possibly with a different number of syllables,
-- e.g. if the user specified two pronunciations 'biología' (4 syllables) and
-- 'bi.ología' (5 syllables), both of which have the same rhyme /ia/.
m_table.insertIfNot(existing.num_syl, num_syl)
break
end
end
if not saw_already then
local rh2 = rsub(rhyme, "ts̻", "")
local rhyme_diffs = nil
if dialect == "gipuzkoan" then
rhyme_diffs = {}
if rfind(rh2,"s̻") then
rhyme_diffs.need_bisc = true
end
if rfind(rhyme,"ts̺") then
rhyme_diffs.need_bisc = true
end
if rfind(rhyme,"J") then
rhyme_diffs.j_different = true
end
if rfind(rhyme,"N") then
rhyme_diffs.northern_different = true
end
end
table.insert(rhyme_ret.pronun[dialect], {
rhyme = remove_technical_chars(rhyme),
num_syl = {num_syl},
differences = rhyme_diffs,
})
if rhyme ~= short_rhyme then
table.insert(rhyme_ret.pronun[dialect], {
rhyme = remove_technical_chars(short_rhyme),
num_syl = {num_syl},
differences = rhyme_diffs, --we'll keep the rhyme in all dialects even if it's repeated (for clarity, see [[zinen]])
})
end
end
end
end
end
if #parsed.rhyme == 0 then
if overall_rhyme or no_auto_rhyme then
parsed.rhyme = nil
else
parsed.rhyme = express_all_styles(parsed.style, dodialect_rhymes_from_pronun)
end
else
local no_rhyme = false
for _, rhyme in ipairs(parsed.rhyme) do
if rhyme.rhyme == "-" then
no_rhyme = true
break
end
end
if no_rhyme then
parsed.rhyme = nil
else
local function this_dodialect(rhyme_ret, dialect)
return dodialect_specified_rhymes(parsed.rhyme, parsed.hyph, {parsed}, rhyme_ret, dialect)
end
parsed.rhyme = express_all_styles(parsed.style, this_dodialect)
end
end
end
if overall_rhyme then
local no_overall_rhyme = false
for _, orhyme in ipairs(overall_rhyme) do
if orhyme.rhyme == "-" then
no_overall_rhyme = true
break
end
end
if no_overall_rhyme then
overall_rhyme = nil
else
local all_hyphs
if overall_hyph then
all_hyphs = overall_hyph
else
all_hyphs = {}
for _, parsed in ipairs(parsed_respellings) do
for _, hyph in ipairs(parsed.hyph) do
m_table.insertIfNot(all_hyphs, hyph)
end
end
end
local function dodialect_overall_rhyme(rhyme_ret, dialect)
return dodialect_specified_rhymes(overall_rhyme, all_hyphs, parsed_respellings, rhyme_ret, dialect)
end
overall_rhyme = express_all_styles(parsed.style, dodialect_overall_rhyme)
end
end
-- If all sets of pronunciations have the same rhymes, display them only once at the bottom.
-- Otherwise, display rhymes beneath each set, indented.
local first_rhyme_ret
local all_rhyme_sets_eq = true
for j, parsed in ipairs(parsed_respellings) do
if j == 1 then
first_rhyme_ret = parsed.rhyme
elseif not m_table.deepEquals(first_rhyme_ret, parsed.rhyme) then
all_rhyme_sets_eq = false
break
end
end
local function format_rhyme(rhyme_ret, num_bullets)
local function format_rhyme_style(tag, expressed_style, is_first)
local pronunciations = {}
local rhymes = {}
for _, pronun in ipairs(expressed_style.pronun) do
table.insert(rhymes, pronun)
end
local data = {
lang = lang,
rhymes = rhymes,
aa = tag and {tag} or nil,
force_cat = force_cat,
}
local bullet = string.rep("*", num_bullets) .. " "
local formatted = bullet .. require("Module:rhymes").format_rhymes(data)
local formatted_for_len_parts = {}
table.insert(formatted_for_len_parts, bullet .. "Rhymes: " .. (tag and "(" .. tag .. ") " or ""))
for j, pronun in ipairs(expressed_style.pronun) do
if j > 1 then
table.insert(formatted_for_len_parts, ", ")
end
if pronun.q or pronun.qq or pronun.a or pronun.aa then
-- Note: This inserts the actual formatted decoration text, including HTML and such, but the later call
-- to textual_len() removes all HTML and reduces links.
table.insert(formatted_for_len_parts, require(decorations_module).format_decorations {
lang = lang,
text = "",
q = pronun.q,
qq = pronun.qq,
a = pronun.a,
aa = pronun.aa,
})
end
table.insert(formatted_for_len_parts, "-" .. pronun.rhyme)
end
return formatted, textual_len(table.concat(formatted_for_len_parts))
end
return format_all_styles(rhyme_ret.expressed_styles, format_rhyme_style)
end
-- If all sets of pronunciations have the same hyphenations, display them only once at the bottom.
-- Otherwise, display hyphenations beneath each set, indented.
local first_hyphs
local all_hyph_sets_eq = true
for j, parsed in ipairs(parsed_respellings) do
if j == 1 then
first_hyphs = parsed.hyph
elseif not m_table.deepEquals(first_hyphs, parsed.hyph) then
all_hyph_sets_eq = false
break
end
end
local function format_hyphenations(hyphs, num_bullets)
local hyphtext = require("Module:hyphenation").format_hyphenations { lang = lang, hyphs = hyphs}
return string.rep("*", num_bullets) .. " " .. hyphtext
end
-- If all sets of pronunciations have the same homophones, display them only once at the bottom.
-- Otherwise, display homophones beneath each set, indented.
local first_hmps
local all_hmp_sets_eq = true
for j, parsed in ipairs(parsed_respellings) do
if j == 1 then
first_hmps = parsed.hmp
elseif not m_table.deepEquals(first_hmps, parsed.hmp) then
all_hmp_sets_eq = false
break
end
end
local function format_homophones(hmps, num_bullets)
local hmptext = require("Module:homophones").format_homophones { lang = lang, homophones = hmps }
return string.rep("*", num_bullets) .. " " .. hmptext
end
local function format_audio(audios, num_bullets)
local ret = {}
for i, audio in ipairs(audios) do
local text = require("Module:audio").format_audio {
lang = lang,
file = audio.file,
caption = audio.gloss,
q = audio.q,
qq = audio.qq,
a = audio.a,
aa = audio.aa,
}
table.insert(ret, string.rep("*", num_bullets) .. " " .. text)
end
return table.concat(ret, "\n")
end
local textparts = {}
local min_num_bullets = math.huge
for j, parsed in ipairs(parsed_respellings) do
if parsed.bullets < min_num_bullets then
min_num_bullets = parsed.bullets
end
if j > 1 then
table.insert(textparts, "\n")
end
table.insert(textparts, parsed.pronun.text)
if #parsed.audio > 0 then
table.insert(textparts, "\n")
-- If only one pronunciation set, add the audio with the same number of bullets, otherwise
-- indent audio by one more bullet.
table.insert(textparts, format_audio(parsed.audio,
#parsed_respellings == 1 and parsed.bullets or parsed.bullets + 1))
end
if not all_rhyme_sets_eq and parsed.rhyme then
table.insert(textparts, "\n")
table.insert(textparts, format_rhyme(parsed.rhyme, parsed.bullets + 1))
end
if not all_hyph_sets_eq and #parsed.hyph > 0 then
table.insert(textparts, "\n")
table.insert(textparts, format_hyphenations(parsed.hyph, parsed.bullets + 1))
end
if not all_hmp_sets_eq and #parsed.hmp > 0 then
table.insert(textparts, "\n")
table.insert(textparts, format_homophones(parsed.hmp, parsed.bullets + 1))
end
end
if overall_audio and #overall_audio > 0 then
table.insert(textparts, "\n")
table.insert(textparts, format_audio(overall_audio, min_num_bullets))
end
if all_rhyme_sets_eq and first_rhyme_ret then
table.insert(textparts, "\n")
table.insert(textparts, format_rhyme(first_rhyme_ret, min_num_bullets))
end
if overall_rhyme then
table.insert(textparts, "\n")
table.insert(textparts, format_rhyme(overall_rhyme, min_num_bullets))
end
if all_hyph_sets_eq and #first_hyphs > 0 then
table.insert(textparts, "\n")
table.insert(textparts, format_hyphenations(first_hyphs, min_num_bullets))
end
if overall_hyph and #overall_hyph > 0 then
table.insert(textparts, "\n")
table.insert(textparts, format_hyphenations(overall_hyph, min_num_bullets))
end
if all_hmp_sets_eq and #first_hmps > 0 then
table.insert(textparts, "\n")
table.insert(textparts, format_homophones(first_hmps, min_num_bullets))
end
if overall_hmp and #overall_hmp > 0 then
table.insert(textparts, "\n")
table.insert(textparts, format_homophones(overall_hmp, min_num_bullets))
end
return table.concat(textparts)
end
return export
ml84qhuqslv1hn5hj0dwx5fzhvuidwf
Antarktis
0
2358901
5775711
5770313
2026-10-20T02:38:42Z
InternetArchiveBot
12208
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.6
5775711
wikitext
text/x-wiki
== ภาษาเดนมาร์ก ==
{{wp|da:}}
=== รากศัพท์ ===
จาก{{der|da|la-new|Antarctica}}, จาก{{der|da|grc|ἀνταρκτικός}}
=== คำวิสามานยนาม ===
{{da-proper noun}}
# {{tcl|da|แอนตาร์กติกา|id=Q51}}
==== คำเกี่ยวข้อง ====
* {{l|da|antarktisk|pos=คำคุณศัพท์|t=แอนตาร์กติก}}
== ภาษานอร์เวย์แบบนือนอสก์ ==
{{wp|nn:}}
=== คำวิสามานยนาม ===
{{head|nn|คำวิสามานยนาม}}
# {{tcl|nn|แอนตาร์กติก|id=Q1555938}}
==== คำเกี่ยวข้อง ====
* {{l|nn|Antarktika}}
* {{l|nn|antarktisk}}
== ภาษานอร์เวย์แบบบุ๊กมอล ==
{{wikipedia|no:Antarktis,no:Antarktika}}
[[ไฟล์:Antarctica (orthographic projection).svg|thumb|Antarctica on a globe.]]
=== รากศัพท์ ===
{{der+|nb|la|Antarctica}}, ชื่อทางภูมิศาสตร์ภาษาละตินใหม่จาก {{der|nb|grc|ἀνταρκτικός|tr=antarktikós|t=ตรงข้ามกับอาร์กติก; ทางใต้}}, จาก{{prefix|grc|ἀντ-|ἀρκτικός|t1=ตรงข้าม, ต่อต้าน|t2=อาร์กติก, ทางเหนือ|nocat=1}}, คำหลัง แรกสุดมาจาก {{m|grc|ἄρκτος|tr=árktos|t=หมี; กลุ่มดาวหมีใหญ่}} ซึ่งหมายถึงกลุ่มดาวทางทิศเหนือ ชื่อนี้จึงหมายถึงภูมิภาคที่อยู่ตรงข้ามกับอาร์กติกซึ่งแปลตามตัวอักษร; {{doublet|nb|Antarktika|t1=แอนตาร์กติกา, โดยเฉพาะตัวทวีป}}
เทียบ{{cog|da|Antarktis}}, {{cog|sv|Antarktis}}, {{cog|de|Antarktis}}, {{cog|nl|Antarctica}} และ {{cog|en|Antarctica}}
=== การออกเสียง ===
* {{IPA|nb|/anˈtark.tɪs/}}
* {{rhymes|nb|arktɪs|s=3}}
* {{hyphenation|nb|Ant|ark|tis}}
=== คำวิสามานยนาม ===
{{head|nb|คำวิสามานยนาม}}
# {{tcl|nb|แอนตาร์กติกา|id=Q51}}
#* {{quote-book|nb|year=1994|author={{w|Vera Henriksen}}|title=Luftforsvarets historie|volume=1|publisher=Aschehoug|page=198|passage=da ble Antarktis omseilt og Prinsesse Ragnhilds Land oppdaget og flyfotografert|t=จากนั้นจึงมีการแล่นเรือรอบแอนตาร์กติกา และดินแดนพรินเซสแรกน์ฮิลด์ก็ถูกค้นพบและถ่ายภาพจากทางอากาศ}}
#* {{quote-book|nb|year=2022|author=Øyvind Paasche and Erik Kolstad|title=Hva er klima|page=90|passage=iskappene, representert ved Antarktis og Grønland, spiller en sentral rolle i vår forståelse av klimaet på jorda|t=พืดน้ำแข็ง ซึ่งมีตัวแทนคือแอนตาร์กติกาและกรีนแลนด์ มีบทบาทสำคัญต่อความเข้าใจของเราเกี่ยวกับสภาพภูมิอากาศของโลก}}
# {{tcl|nb|แอนตาร์กติก|id=Q1555938}}
==== หมายเหตุการใช้ ====
* {{m|nb|Antarktis}} เป็นชื่อภาษานอร์เวย์ที่ใช้กันตามปกติสำหรับทั้งตัวทวีปเอง และในความหมายที่กว้างกว่าสำหรับภูมิภาคขั้วโลกใต้ ส่วนชื่อที่มีการใช้น้อยกว่าอย่าง {{m|nb|Antarktika}} จะหมายถึงมวลแผ่นดินทวีปโดยเฉพาะ ซึ่งอาจเรียกว่า '''det antarktiske kontinentet''' หรือ '''sørpolskontinentet''' ได้ด้วยเช่นกัน
==== ลูกคำ ====
{{col2|nb|antarktisk<t:แอนตาร์กติก>|Øst-Antarktis<t:แอนตาร์กติกาตะวันออก>|Vest-Antarktis<t:แอนตาร์กติกาตะวันตก>|sort=0}}
==== คำเกี่ยวข้อง ====
* {{l|nb|Antarktika||แอนตาร์กติกา, โดยเฉพาะตัวทวีป}}
==== ดูเพิ่ม ====
{{list:continents/nb}}
=== อ้างอิง ===
* [https://snl.no/Antarktis “Antarktis”] in ''{{w|Store norske leksikon}}''.
* [https://snl.no/Antarktika “Antarktika”] in ''{{w|Store norske leksikon}}''.
* {{R:nb:OB|antarktisk}}
* {{R:nb:NAOB|antarktisk}}
== ภาษาฟินแลนด์ ==
{{wp|fi:}}
=== รากศัพท์ ===
จาก{{der|fi|sv|Antarktis}}
=== การออกเสียง ===
{{fi-p}}
=== คำวิสามานยนาม ===
{{fi-proper noun}}
# {{tcl|fi|แอนตาร์กติกา|id=Q51}}
==== การผันรูป ====
{{fi-decl-vastaus|n=sg|Antarkti|a}}
==== คำพ้องความ ====
* {{l|fi|Etelämanner}}
* {{l|fi|Etelänapamanner}}
==== ลูกคำ ====
{{col|fi
|antarktislainen
}}
=== คำสลับอักษร ===
* {{anagrams|fi|a=aaiknrstt|tarkistan}}
== ภาษาเยอรมัน ==
{{wp|de:}}
=== การออกเสียง ===
* {{audio|de|De-Antarktis.ogg|a=<<Germany>> (<<Berlin>>)}}
=== คำวิสามานยนาม ===
{{de-proper noun|f.article}}
# {{tcl|de|แอนตาร์กติก|id=Q1555938}}
# {{lb|de|colloquial|layman speech}} {{tcl|de|แอนตาร์กติกา|id=Q51}}
#: {{syn|de|Antarktika}}
==== การผันรูป ====
{{de-ndecl|f.sg.article}}
==== คำเกี่ยวข้อง ====
* {{l|de|antarktisch}}
* {{l|de|Arktis}}
== ภาษาสวีเดน ==
{{wp|sv:}}
=== รากศัพท์ ===
จาก{{der|sv|la-new|Antarctica}}, จาก{{der|sv|grc|ἀνταρκτικός}}, จาก{{m|grc|ἀντ-|t=[[ตรงข้าม]], [[ต่อต้าน]]}} + {{m|grc|ἀρκτικός|t=[[อาร์กติก]]}}, จาก{{der|sv|grc|ἄρκτος|t=[[หมี]]}}
=== การออกเสียง ===
* {{IPA|sv|/anˈtarktɪs/}}
* {{audio|sv|Sv-Antarktis.ogg}}
=== คำวิสามานยนาม ===
{{sv-proper noun|n}}
# {{tcl|sv|แอนตาร์กติกา|id=Q51}}
==== คำเกี่ยวข้อง ====
* {{l|sv|antarktisk|pos=คำคุณศัพท์|t=แอนตาร์กติก}}
==== ดูเพิ่ม ====
{{list:continents/sv}}
=== อ้างอิง ===
* [https://web.archive.org/web/20241007092653/https://mesh.kib.ki.se/term/D000864/antarctic-regions Svensk MeSH]
== ภาษาเอสโตเนีย ==
{{wp|et:}}
=== การออกเสียง ===
* {{et-IPA|anˈtarktis}}
{{rfap|et}}
=== คำวิสามานยนาม ===
{{et-proper noun}}
# {{tcl|et|แอนตาร์กติกา|id=Q51}}
==== การผันรูป ====
{{et-decl-harjutus|Antarkti}}
7ngm3bf5qi6elzzamqnfgbnmmzz3b2y
ภาคผนวก:หน่วยนามภาษาอาหรับ
100
2359219
5775721
5775351
2026-10-20T09:35:39Z
Octahedron80
267
5775721
wikitext
text/x-wiki
==พหูพจน์หลายรูป==
คำนามภาษาอาหรับมักมีรูปพหูพจน์ได้หลายรูป ตัวอย่างเช่น {{m|ar|بَحْر||[[ทะเล]]}} สามารถมีรูปพหูพจน์เป็น {{m|ar|بِحَار}}, {{m|ar|بُحُور}}, {{m|ar|أَبْحَار}} หรือ {{m|ar|أَبْحُر}} รูปเหล่านี้เป็นทางเลือกต่าง ๆ ในการทำคำนามเดียวกันให้เป็นรูปพหูพจน์ ในบางครั้งรูปพหูพจน์รูปแบบใดรูปแบบหนึ่งจะสัมพันธ์กับนัยความหมายเฉพาะของคำนามนั้น ตัวอย่างเช่นในคำว่า {{m|ar|عين#คำนาม|عَيْن|t=[[ตา]]}} นัยความหมายที่ 5 คือ "ตัวสิ่งนั้นเอง" มีรูปพหูพจน์เฉพาะคือ {{m|ar|أَعْيُن}} ส่วนในกรณีอื่น ๆ อาจเป็นเรื่องของความนิยมในการเลือกใช้หรือภาษาถิ่น ในการระบุหัวข้อรายการศัพท์ที่มีพหูพจน์หลายรูป ควรพยายามเรียงรูปพหูพจน์ที่พบบ่อยที่สุดไว้เป็นลำดับแรก
==คำนามและคำคุณศัพท์ที่รับมา==
ในภาษาอาหรับ คำนามและคำคุณศัพท์หลากหลายประเภทสามารถรับมาจากรากกริยาได้ โดยทั่วไป การรับมาและแม่แบบอื่น ๆ สำหรับกริยาสามพยัญชนะจะแสดงโดยใช้ราก {{ar-root|ف ع ل|nocat=1}} สำหรับกริยาสี่พยัญชนะ รากดั้งเดิมคือ {{ar-root|ف ع ل ل|nocat=1}} แต่สิ่งนี้สร้างความสับสนเนื่องจากพยัญชนะตัวที่สามและสี่เหมือนกัน ซึ่งอาจทำให้เข้าใจผิดว่าเป็นกริยาพยัญชนะซ้ำ เราจึงใช้ {{ar-root|ف ع ز ل|nocat=1}} แทน
===คำกริยานาม===
คำกริยานาม ({{m|ar|مَصْدَر}}) ของ[[ภาคผนวก:คำกริยาภาษาอาหรับ#รูป I|รูป I]] ไม่ได้ดำเนินตามรูปแบบใดรูปแบบหนึ่งเป็นพิเศษ ที่พบบ่อยที่สุดคือ {{m|ar||فَعْل}} แต่ยังมีรูปแบบอื่น ๆ อีกมาก เช่น {{m|ar||فِعْل}}, {{m|ar||فُعْل}}, {{m|ar||فَعَل}}, {{m|ar||فَعَال}}, {{m|ar||فِعَال}}, {{m|ar||فُعُول}}, {{m|ar||فُعَال}}, {{m|ar||فَعُول}}, {{m|ar||مَفْعَل}}, {{m|ar||مَفْعِل}}, {{m|ar||تَفْعَال}}, {{m|ar||فِعْلَان}}, {{m|ar||فُعْلَان}}, {{m|ar||فَعَلَان}} ฯลฯ รวมไปถึงรูปเพศหญิงที่คู่กัน เช่น {{m|ar||فَعْلَة}}, {{m|ar||فِعْلَة}}, {{m|ar||فُعْلَة}}, {{m|ar||فَعَلَة}}, {{m|ar||فَعَالَة}}, {{m|ar||فِعَالَة}}, {{m|ar||فُعُولَة}}, {{m|ar||فَعْلُولَة}}, {{m|ar||مَفْعَلَة}}, {{m|ar||مَفْعِلَة}} ฯลฯ
ส่วนคำกริยานามของรูปอื่น ๆ จะดำเนินตามรูปแบบเฉพาะดังนี้:
:{| class="wikitable" style="text-align:center"
|-
! รูป !! คำกริยานามสมบูรณ์ !! คำกริยานามท้ายอ่อน
|-
| I || ไม่มีรูปแบบเฉพาะ || ไม่มีรูปแบบเฉพาะ
|-
| II || {{m|ar||تَفْعِيل}}, {{m|ar||تَفْعَال}}, {{m|ar||فِعَّال}}, {{m|ar||تَفْعِلَة}} || {{m|ar||تَفْعِيَة}}
|-
| III || {{m|ar||مُفَاعَلَة}}, {{m|ar||فِعَال}} || {{m|ar||مُفَاعَاة}}, {{m|ar||فِعَاء}}
|-
| IV || {{m|ar||إِفْعَال}} || {{m|ar||إفْعَاء}}
|-
| V || {{m|ar||تَفَعُّل}}, {{m|ar||تِفِعَّال}} || {{m|ar||تَفَعٍّ}}
|-
| VI || {{m|ar||تَفَاعُل}} || {{m|ar||تَفَاعٍ}}
|-
| VII || {{m|ar||اِنْفِعَال}} || {{m|ar||اِنْفِعَاء}}
|-
| VIII || {{m|ar||اِفْتِعَال}} || {{m|ar||اِفْتِعَاء}}
|-
| IX || {{m|ar||اِفْعِلَال}} ||
|-
| X || {{m|ar||اِسْتِفْعَال}} || {{m|ar||اِسْتِفْعَاء}}
|-
| XI || {{m|ar||اِفْعِيلَال}} ||
|-
| XII || {{m|ar||اِفْعِيعَال}} || {{m|ar||اِفْعِيعَاء}}
|-
| XIII || {{m|ar||اِفْعِوَّال}} || {{m|ar||اِفْعِوَّاء}}
|-
| XIV || {{m|ar||اِفْعِنْلَال}} || {{m|ar||اِفْعِنْيَاء}}??
|-
| XV || {{m|ar||اِفْعِنْلَاء}} || {{m|ar||اِفْعِنْيَاء}}??
|-
| Iq || {{m|ar||فَعْزَلَة}}, {{m|ar||فَعْزَال}}, {{m|ar||فِعْزَال}}, {{m|ar||فُعْزَال}} || {{m|ar||فَعْزَال}}??
|-
| IIq || {{m|ar||تَفَعْزُل}} || {{m|ar||تَفَعْزٍ}}
|-
| IIIq || {{m|ar||اِفْعِنْزَال}} || {{m|ar||اِفْعِنْزَاء}}
|-
| IVq || {{m|ar||اِفْعِزْلَال}} || {{m|ar||اِفْعِزْيَاء}}??
|-
|}
===รูปกริยาขยายกรรตุวาจก===
รูปกริยาขยายกรรตุวาจก ({{m|ar|اسم فاعل|اِسْم الْفَاعِل}}) ดำเนินตามรูปแบบปรกติ:
:{| class="wikitable" style="text-align:center"
|-
! รูป !! รูปกริยาขยายกรรตุวาจกสมบูรณ์ !! รูปกริยาขยายกรรตุวาจกท้ายอ่อน
|-
| I || {{m|ar||فَاعِل}} || {{m|ar||فَاعٍ}}
|-
| II || {{m|ar||مُفَعِّل}} || {{m|ar||مُفَعٍّ}}
|-
| III || {{m|ar||مُفَاعِل}} || {{m|ar||مُفَاعٍ}}
|-
| IV || {{m|ar||مُفْعِل}} || {{m|ar||مُفْعٍ}}
|-
| V || {{m|ar||مُتَفَعِّل}} || {{m|ar||مُتَفَعٍّ}}
|-
| VI || {{m|ar||مُتَفَاعِل}} || {{m|ar||مُتَفَاعٍ}}
|-
| VII || {{m|ar||مُنْفَعِل}} || {{m|ar||مُنْفَعٍ}}
|-
| VIII || {{m|ar||مُفْتَعِل}} || {{m|ar||مُفْتَعٍ}}
|-
| IX || {{m|ar||مُفْعَلّ}} || {{m|ar||مُفْعَيّ}}??
|-
| X || {{m|ar||مُسْتَفْعِل}} || {{m|ar||مُسْتَفْعٍ}}
|-
| XI || {{m|ar||مُفْعَالّ}} || {{m|ar||مُفْعَايّ}}??
|-
| XII || {{m|ar||مُفْعَوْعِل}} || {{m|ar||مُفْعَوْعٍ}}
|-
| XIII || {{m|ar||مُفْعَوِّل}} || {{m|ar||مُفْعَوٍّ}}
|-
| XIV || {{m|ar||مُفْعَنْلِل}} || {{m|ar||مُفْعَنْيٍ}}??
|-
| XV || {{m|ar||مُفْعَنْلٍ}} || {{m|ar||مُفْعَنْيٍ}}??
|-
| Iq || {{m|ar||مُفَعْزِل}} || {{m|ar||مُفَعْزٍ}}
|-
| IIq || {{m|ar||مُتَفَعْزِل}} || {{m|ar||مُตَفَعْزٍ}}
|-
| IIIq || {{m|ar||مُفْعَنْزِل}} || {{m|ar||مُفْعَنْزٍ}}
|-
| IVq || {{m|ar||مُفْعَزِلّ}} || {{m|ar||مُفْعَزِيّ}}??
|-
|}
===รูปกริยาขยายกรรมวาจก===
รูปกริยาขยายกรรมวาจก ({{m|ar|اِسم مَفعول|اِسْم الْمَفْعُول}}) ดำเนินตามรูปแบบปรกติ:
:{| class="wikitable" style="text-align:center"
|-
! รูป !! รูปกริยาขยายกรรมวาจกสมบูรณ์ !! รูปกริยาขยายกรรมวาจกท้ายอ่อน
|-
| I || {{m|ar||مَفْعُول}} || {{m|ar||مَفْعُوّ}}, {{m|ar||مَفْعِيّ}}
|-
| II || {{m|ar||مُفَعَّل}} || {{m|ar||مُفَعًّى}}
|-
| III || {{m|ar||مُفَاعَل}} || {{m|ar||مُفَاعًى}}
|-
| IV || {{m|ar||مُفْعَل}} || {{m|ar||مُفْعًى}}
|-
| V || {{m|ar||مُتَفَعَّل}} || {{m|ar||مُتَفَعًّى}}
|-
| VI || {{m|ar||مُتَفَاعَل}} || {{m|ar||مُتَفَاعًى}}
|-
| VII || {{m|ar||مُنْفَعَل}} || {{m|ar||مُنْفَعًى}}
|-
| VIII || {{m|ar||مُفْتَعَل}} || {{m|ar||مُفْتَعًى}}
|-
| IX || ({{m|ar||مُفْعَلّ}}) || ({{m|ar||مُفْعَيّ}}??)
|-
| X || {{m|ar||مُسْتَفْعَل}} || {{m|ar||مُسْتَفْعًى}}
|-
| XI || ({{m|ar||مُفْعَالّ}}) || ({{m|ar||مُفْعَايّ}}??)
|-
| XII || {{m|ar||مُفْعَوْعَل}} || {{m|ar||مُفْعَوْعًى}}
|-
| XIII || {{m|ar||مُفْعَوَّل}} || {{m|ar||مُفْعَوًّى}}
|-
| XIV || {{m|ar||مُفْعَنْلَل}} || {{m|ar||مُفْعَنْلًى}}
|-
| XV || {{m|ar||مُفْعَنْلًى}} || {{m|ar||مُفْعَنْيًى}}??
|-
| Iq || {{m|ar||مُفَعْزَل}} || {{m|ar||مُفَعْزًى}}
|-
| IIq || {{m|ar||مُتَفَعْزَل}} || {{m|ar||مُتَفَعْزًى}}
|-
| IIIq || {{m|ar||مُفْعَنْزَل}} || {{m|ar||مُفْعَنْزًى}}
|-
| IVq || {{m|ar||مُفْعَزَلّ}} || {{m|ar||مُفْعَزَيّ}}??
|-
|}
===คำคุณศัพท์สัมพันธ์ (นิสบะฮ์)===
คำคุณศัพท์สัมพันธ์ หรือที่รู้จักกันในคำภาษาอาหรับว่า [[nisba|นิสบะฮ์]] เป็นคำคุณศัพท์ที่สร้างขึ้นจากคำอื่นโดยการเติม {{m|ar|ـِيّ}} (มักออกเสียงเสมือนเขียนว่า {{m|ar||ـِي}} ทั้งนี้การออกเสียงด้วย ''yy'' จะกลับมาในรูปเพศหญิง {{m|ar||ـِيَّة}}, รูปพหูพจน์เพศชาย {{m|ar||ـِيُّون}} และรูปพหูพจน์เพศหญิง {{m|ar||ـِيَّات}}) โครงสร้างนี้ค่อนข้างยืดหยุ่น และสามารถเติมปัจจัยนิสบะฮ์เข้ากับคำนามชนิดใดก็ได้ รวมถึงรูปพหูพจน์ เช่นเดียวกับในบางกรณีที่เติมเข้ากับชนิดของคำอื่น ๆ (เช่น {{m|ar|خَارِجِيّ||[[ภายนอก]]}} จากคำคุณศัพท์ {{m|ar|خَارِج||[[ภายนอก]], [[ข้างนอก]]}}, {{m|ar|ثَانَوِيّ||[[ทุติยภูมิ]], [[มัธยม]]}} จากคำคุณศัพท์ {{m|ar|ثَانٍ||[[ที่สอง]]}}, {{m|ar|أَنَانِيّ||[[เห็นแก่ตัว]]}} จากคำสรรพนาม {{m|ar|أَنَا||[[ฉัน]]}}, {{m|ar|فَوْقَانِيّ||[[ส่วนบน]]}} จากคำกริยาวิเศษณ์ {{m|ar|فَوْقُ||[[ข้างบน]]}}) คำคุณศัพท์นิสบะฮ์ยังสามารถสร้างขึ้นโดยตรงจากคำยืมภาษาต่างประเทศได้ด้วย เช่น {{m|ar|دِيمُقْرَاطِيّ||[[เกี่ยวกับประชาธิปไตย]]}} ซึ่งไม่มีคำว่า *{{m|ar||دِيمُقْرَاط}} ปรากฏอยู่จริง
เมื่อนำคำคุณศัพท์นิสบะฮ์ไปเติมเข้ากับคำนามเพศหญิงที่ลงท้ายด้วย {{m|ar|ـَة}} หรือ {{m|ar|ـَاة}} โดยปรกติจะตัดปัจจัยนี้ออก ดังเช่นในคำคุณศัพท์ {{m|ar|مَادِّيّ||[[ทางกายภาพ]], [[เชิงวัตถุ]]}} ซึ่งสร้างขึ้นจากคำนาม {{m|ar|مَادَّة||[[สสาร]], [[วัตถุ]]}} ปัจจัยที่พบบ่อยอย่าง {{m|ar|ـِيَا}} ซึ่งปรากฏในชื่อประเทศ (บางครั้งเขียนเป็น {{m|ar|ـِيَة}} โดยทั้งสองรูปยืมมาจาก {{m|la|-ia}}) ก็จะถูกตัดออกเช่นกัน ตัวอย่างเช่น จาก {{m|ar|بِرِيطَانِيَا||[[บริเตน]]}} สร้างเป็น {{m|ar|بِرِيطَانِيّ||[[เกี่ยวกับบริเตน]]}} ปัจจัยอื่น ๆ อาจถูกตัดออกได้เช่นกัน เช่น จาก {{m|ar|كِيمِيَاء||[[เคมี]]}} สร้างเป็น {{m|ar|كِيمِيّ||[[ทางเคมี]]}} (รวมถึง {{m|ar|كِيمِيَائِيّ}} หรือ {{m|ar|كِيمَاوِيّ}})
ในบางกรณี โดยเฉพาะคำสั้นมากที่มีเพียงพยัญชนะและสระสั้นคั่น จะมีการเพิ่มพยัญชนะเชื่อมเข้ามา ดังเช่นใน {{m|ar|سَنَوِيّ||[[ประจำปี]]}} จาก {{m|ar|سَنَة||[[ปี]]}}, {{m|ar|نَوَوِيّ||[[นิวเคลียร์]]}} จาก {{m|ar|نَوَاة||[[นิวเคลียส]], [[เมล็ด]]}}, {{m|ar|يَدَوِيّ||[[ทำด้วยมือ]], [[คู่มือ]]}} จาก {{m|ar|يَد||[[มือ]]}}, {{m|ar|دَمَوِيّ||[[เกี่ยวกับเลือด]]}} จาก {{m|ar|دَم||[[เลือด]]}} (รวมถึง {{m|ar|دَمِيّ}} โดยไม่มีพยัญชนะเชื่อม) โดยปรกติพยัญชนะเชื่อมเฉพาะนี้คือ {{m|ar|و}} แต่อาจเป็นพยัญชนะตัวอื่นหากพยัญชนะนั้นปรากฏในรูปที่รับมารูปอื่นของคำพื้นฐานนั้น เทียบกับ {{m|ar|شَفَهِيّ||[[เกี่ยวกับริมฝีปาก]]}} และ {{m|ar|شَفَوِيّ}} จาก {{m|ar|شَفَة||[[ริมฝีปาก]]}} (เทียบกับรูปพหูพจน์ {{m|ar|شِفَاه||[[ริมฝีปากทั้งหลาย]]}} และ {{m|ar|شَفَوَات}}) โปรดสังเกตว่าพยัญชนะเชื่อมจะ''ไม่''ถูกนำมาใช้ในกรณีเช่น {{m|ar|عَادِيّ||[[ปรกติ]]}} ซึ่งมีสระยาว (จาก {{m|ar|عَادَة||[[ธรรมเนียม]], [[นิสัย]]}}) หรือ {{m|ar|صِحِّيّ||[[เกี่ยวกับสุขภาพ]]}} ซึ่งมีพยัญชนะซ้ำ (จาก {{m|ar|صِحَّة||[[สุขภาพ]]}}) พยัญชนะเชื่อมอาจปรากฏร่วมกับลำต้นที่มาจากรากท้ายอ่อน เช่น {{m|ar|ثَانَوِيّ||[[ทุติยภูมิ]], [[มัธยม]]}} จาก {{m|ar|ثَانٍ||[[ที่สอง]]}}, {{m|ar|عَلَوِيّ||[[ส่วนบน]], [[แห่งสวรรค์]], [[อะละวี]]}} จาก {{m|ar|عَلِيّ||[[สูง]], [[สูงส่ง]], [[อะลี]]}} ตัวอย่างที่มีตัวเชื่อม {{m|ar||ـَانـ}} ได้แก่ {{m|ar|أَنَانِيّ||[[เห็นแก่ตัว]]}} จาก {{m|ar|أَنَا||[[ฉัน]]}} และ {{m|ar|عَلْمَانِيّ||[[ทางโลก]], [[โลกียะ]]}} จาก {{m|ar|عَالَم||[[โลก]]}} ในบางครั้งลำต้นอาจเกิดการแปรเปลี่ยนรูปไป (มักจะสั้นลง) ในรูปนิสบะฮ์ ดังเช่นใน {{m|ar|عَلْمَانِيّ}} ที่เพิ่งกล่าวไป (ออกเสียงเป็น {{m|ar|عِلْمَانِيّ}} ได้เช่นกัน) และ {{m|ar|عُلْوِيّ||[[ส่วนบน]]}} จาก {{m|ar|عُلُوّ||[[ความสูง]]}}
===คำนามสัมพันธ์ (นิสบะฮ์)===
คำคุณศัพท์สัมพันธ์ ([[nisba|นิสบะฮ์]]) สามารถนำมาทำเป็นคำนามได้อย่างอิสระ ตัวอย่างเช่น จากคำคุณศัพท์ {{m|ar|بِرِيطَانِيّ||[[เกี่ยวกับบริเตน]]}} รับมาเป็นคำนาม {{m|ar|بِرِيطَانِيّ||[[ชายชาวบริเตน]], [[ชาวบริเตน]]}} และจากคำคุณศัพท์ {{m|ar|دِيمُقْرَاطِيّ||[[เกี่ยวกับประชาธิปไตย]]}} สร้างเป็นคำนาม {{m|ar|دِيمُقْرَاطِيّ||[[นักประชาธิปไตย]]}} คำนามเหล่านี้สร้างรูปเพศหญิงและรูปพหูพจน์ในแบบเดียวกับคำคุณศัพท์ที่คู่กัน
นอกจากนี้ คำนามนิสบะฮ์เพศหญิงมักมีความหมายเป็นอาการนาม ตัวอย่างเช่น {{m|ar|دِيمُقْرَاطِيَّة||[[ประชาธิปไตย]]}} จาก {{m|ar|دِيمُقْرَاطِيّ||[[เกี่ยวกับประชาธิปไตย]]}} หรือ {{m|ar|ذِهْنِيَّة||[[กรอบความคิด]], [[จิตตานุภาพ]]}} จาก {{m|ar|ذِهْنِيّ||[[ทางจิตใจ]]}} (ซึ่งสร้างมาจาก {{m|ar|ذِهْن||[[จิตใจ]]}} อีกทอดหนึ่ง) ในบางกรณี วิธีที่ดีที่สุดคือมองว่าคำนามเหล่านี้สร้างขึ้นโดยตรงโดยใช้ปัจจัย {{m|ar|ـِيَّة}} โดยเฉพาะอย่างยิ่งเนื่องจากอาจไม่มีคำที่ลงท้ายด้วย {{m|ar|ـِيّ}} ที่คู่กันปรากฏอยู่ ตัวอย่างเช่น {{m|ar|كَمِّيَّة||[[ปริมาณ]]}} สร้างขึ้นจาก {{m|ar|كَمّ||[[ปริมาณ]]}}, {{m|ar|أَهَمِّيَّة||[[ความสำคัญ]]}} สร้างขึ้นจาก {{m|ar|أَهَمّ||[[สำคัญกว่า]], [[สำคัญมาก]]}} และ {{m|ar|هُوِيَّة||[[อัตลักษณ์]]}} สร้างขึ้นจาก {{m|ar|هُوَ||[[เขา]]}} (โปรดสังเกตว่าสองตัวอย่างหลังสร้างขึ้นจากชนิดของคำอื่นที่ไม่ใช่คำนาม)
===คำคุณศัพท์พื้นฐาน===
คำคุณศัพท์จำนวนมากสร้างขึ้นจากรากสามพยัญชนะโดยใช้รูปแบบ {{m|ar||فَعِيل}} ตัวอย่างเช่น:
* {{m|ar|كَبِير|t=ใหญ่}} จาก {{ar-root|ك ب ر|nocat=1}}
* {{m|ar|كَثِير|t=มาก, หลาย}} จาก {{ar-root|ك ث ر|nocat=1}}
* {{m|ar|سَعِيد|t=มีความสุข}} จาก {{ar-root|س ع د|nocat=1}}
* {{m|ar|جَدِيد|t=ใหม่}} จาก {{ar-root|ج د د|nocat=1}}
* {{m|ar|قَرِيب|t=ใกล้}} จาก {{ar-root|ق ر ب|nocat=1}}
* {{m|ar|جَمِيل|t=สวย, งาม}} จาก {{ar-root|ج م ل|nocat=1}}
คำนามบางคำใช้รูปนี้เช่นกัน ตัวอย่างเช่น {{m|ar|الْخَمِيس|t=วันพฤหัสบดี}}
รูปพหูพจน์เพศชายอาจเป็นแบบสมบูรณ์ หรือแบบแตก รูปแบบที่พบบ่อยที่สุดคือ {{m|ar||فُعَلَاء}} และ {{m|ar||فِعَال}} ส่วนรูปแบบอื่น ๆ ได้แก่ {{m|ar||أَفْعِلَاء}}, {{m|ar||فُعُل}} และ {{m|ar||أَفْعَال}}
* เอกพจน์ {{m|ar|سَعِيد|t=มีความสุข}}, พหูพจน์ {{m|ar|سُعَدَاء}}
* เอกพจน์ {{m|ar|كَبِير|t=ใหญ่}}, พหูพจน์ {{m|ar|كُبَرَاء}} หรือ {{m|ar|كِبَار}}
* เอกพจน์ {{m|ar|صَدِيق|t=เพื่อน}}, พหูพจน์ {{m|ar|أَصْدِقَاء}}
===คำคุณศัพท์ขั้นยกระดับ===
[[elative|คำคุณศัพท์ขั้นยกระดับ]] ({{m|ar|اِسْم تَفْضِيل|اِسْم التَّفْضِيل}} หรือ {{m|ar|أَفْعَل التَّفْضِيل}}) สร้างขึ้นจากคำคุณศัพท์พื้นฐานสามพยัญชนะ โดยทั่วไปมาจากรูป {{m|ar||فَعِيل}} หรือ {{m|ar||فَاعِل}} แต่ก็พบรูปอย่าง {{m|ar||فَعْل}}, {{m|ar||فِعْل}} หรือ {{m|ar||فُعْل}} ได้เช่นกัน คำคุณศัพท์ขั้นยกระดับสร้างขึ้นโดยตรงจากรากของคำคุณศัพท์ และมีรูป[[diptote|ดิปโทต]] {{m|ar||أَفْعَل}} ในเพศชายเอกพจน์ คำคุณศัพท์ขั้นยกระดับมีความหมายเป็น[[comparative|ขั้นกว่า]] (เช่น ''smarter'' หรือ ''more intelligent'' ในภาษาอังกฤษ), [[superlative|ขั้นสุด]] (เช่น ''smartest'' หรือ ''most intelligent'' ในภาษาอังกฤษ) และ[[absolute superlative|ขั้นบริบูรณ์]] (เช่น ''very smart'', ''utterly intelligent'' ในภาษาอังกฤษ) ความแตกต่างมักแสดงออกผ่านโครงสร้างทางวากยสัมพันธ์ที่ต่างกัน คำคุณศัพท์บางคำมีรูปเป็นคำคุณศัพท์ขั้นยกระดับโดยไม่มีความหมายเชิงยกระดับ ตัวอย่างเช่น {{m|ar|آخَر||อื่น}} ในทางตรงกันข้าม คำคุณศัพท์บางคำถูกนำมาใช้เป็นคำคุณศัพท์ขั้นยกระดับโดยไม่ได้อยู่ในรูปยกระดับ ตัวอย่างเช่น {{m|ar|خَيْر||ดีกว่า, ดีที่สุด}}
รูปแบบการผันคำสำหรับคำคุณศัพท์ขั้นยกระดับมีดังนี้: เพศหญิงเอกพจน์มีรูป {{m|ar||فُعْلَى}} ซึ่งไม่ผันแปรตามการกและสถานะ ส่วนพหูพจน์เพศชายเป็นดิปโทต {{m|ar||أَفَاعِل}} หรือแบบสมบูรณ์ {{m|ar||أَفْعَلُون}} พหูพจน์เพศหญิงอาจเป็น {{m|ar||فُعَل}} หรือแบบสมบูรณ์ {{m|ar||فُعْلَيَات}} ตัวอย่างที่มีการแจกวิภัตติครบถ้วนคือ {{m|ar|أَكْبَر||[[ใหญ่กว่า]], [[ใหญ่ที่สุด]]}} ซึ่งเป็นคำคุณศัพท์ขั้นยกระดับของ {{m|ar|كَبِير||[[ใหญ่]]}} คำคุณศัพท์นี้มีเพศหญิงเอกพจน์เป็น {{m|ar|كُبْرَى}}, พหูพจน์เพศชายเป็น {{m|ar|أَكْبَرُون}} และ {{m|ar|أَكَابِر}} และพหูพจน์เพศหญิงเป็น {{m|ar|كُبْرَيَات}}
คำคุณศัพท์ขั้นยกระดับบางคำ เช่น {{m|ar||آخَر}} และ {{m|ar|أَوَّل||แรก, อันดับแรก}} ดำเนินตามการผันเหล่านี้อย่างสม่ำเสมอ อย่างไรก็ตาม คำคุณศัพท์ขั้นยกระดับส่วนใหญ่สามารถอยู่ในรูปเพศชายเอกพจน์ได้ แม้ว่าจะอ้างถึงคำนามเพศหญิงหรือพหูพจน์ก็ตาม อันที่จริง มีรูปคำคุณศัพท์ขั้นยกระดับที่ผันแล้วเพียงจำนวนจำกัดเท่านั้นที่ใช้กันในภาษาอาหรับร่วมสมัย และรูปเหล่านี้มักจำกัดอยู่เฉพาะในนัยความหมายขั้นบริบูรณ์ เช่น ใน {{m|ar|بِرِيطانْيَا اَلْعُظْمَى||บริเตนใหญ่}} ส่วนในภาษาอาหรับคลาสสิก รูปคำคุณศัพท์ขั้นยกระดับที่ผันแล้วถูกนำมาใช้อย่างอิสระมากกว่า
===คำคุณศัพท์บอกสีหรือข้อบกพร่อง===
{{anchor|Color/defect adjectives}}
คำคุณศัพท์บอกสีหรือข้อบกพร่อง คือคำคุณศัพท์ในรูป {{m|ar||أَفْعَل}} โดยมีเพศหญิงเอกพจน์เป็น {{m|ar||فَعْلَاء}} โดยทั่วไปหมายถึงสีและข้อบกพร่องทางกายภาพ ทั้งเพศชายและเพศหญิงเป็นคำแบบ[[diptote|ดิปโทต]] โปรดสังเกตว่าเพศชายเอกพจน์มีรูปเดียวกับคำคุณศัพท์ขั้นยกระดับ แต่เพศหญิงเอกพจน์จะแตกต่างกัน รูปพหูพจน์ทั้งเพศชายและเพศหญิงมักอยู่ในรูป {{m|ar||فُعْل}} แต่ก็มีข้อยกเว้น เช่น {{m|ar|أَحْمَق||[[บ้า]]}} ซึ่งมีพหูพจน์ปรกติเป็น {{m|ar|حُمْق}} แต่ก็มีรูปพหูพจน์เป็น {{m|ar|حُمُق}}, {{m|ar|حَمْقَى}} และ {{m|ar|حَمَاقَى}} เช่นกัน ตัวอย่างต้นแบบของคำคุณศัพท์บอกสีในรูปนี้ ได้แก่:
* {{m|ar|أَبْيَض||[[ขาว]]}},
* {{m|ar|أَسْوَد||[[ดำ]]}},
* {{m|ar|أَحْمَر||[[แดง]]}},
* {{m|ar|أَزْرَق||[[น้ำเงิน]], [[ฟ้า]]}},
* {{m|ar|أَخْضَر||[[เขียว]]}} และ
* {{m|ar|أَصْفَر||[[เหลือง]]}}
ยังมีคำอื่น ๆ อีก เช่น
* {{m|ar|أَغْبَر||[[สีฝุ่น]], [[สีกระดำกระด่าง]]}},
* {{m|ar|أَسْمَر||[[ผิวคล้ำ]], [[สีน้ำตาลแกมเหลือง]]}} และ
* {{m|ar|أَشْقَر||[[ผมบลอนด์]], [[สีทองแดง]]}}
แต่สีส่วนใหญ่ที่เหลือมักอยู่ในรูปคำคุณศัพท์[[nisba|นิสบะฮ์]] เช่น
* {{m|ar|بُنِّيّ||[[น้ำตาล]]}} (ตามตัวอักษรคือ "กาแฟ" มาจาก {{m|ar|بُنّ||[[กาแฟ]]}}),
* {{m|ar|بَنَفْسَجِيّ||[[ม่วง]]}} (มาจาก {{m|ar|بَنَفْسَج||[[ไวโอเลต]] {{gloss|[[ดอกไม้]]}}}}),
* {{m|ar|بُرْتُقَالِيّ||[[ส้ม]]}} (มาจาก {{m|ar|بُرْتُقَال||[[ส้ม]] {{gloss|[[ผลไม้]]}}}}), ฯลฯ
คำคุณศัพท์บอก "ข้อบกพร่อง" ที่เป็นต้นแบบจะหมายถึงข้อบกพร่องทางกายภาพจริง ๆ เช่น
* {{m|ar|أَطْرَش||[[หูหนวก]]}},
* {{m|ar|أَعْمَى||[[ตาบอด]]}},
* {{m|ar|أَعْوَر||[[ตาบอดข้างเดียว]]}},
* {{m|ar|أَحْوَل||[[ตาเข]]}},
* {{m|ar|أَجْرَب||[[เป็นขี้เรื้อน]]}},
* {{m|ar|أَجْرَد||[[หัวล้าน]]}}
แต่คำอื่น ๆ อาจหมายถึงข้อบกพร่องทางจิตใจ เช่น
* {{m|ar|أَبْلَه||[[โง่เขลา]], [[เซ่อ]]}} และ
* {{m|ar|أَحْمَق||[[บ้า]]}}
ในขณะที่บางคำหมายถึงคุณลักษณะที่อาจมีความหมายโดยนัยเชิงลบ แต่ไม่ได้เป็น "ข้อบกพร่อง" อย่างชัดเจน เช่น
* {{m|ar|أَخْشَن||[[หยาบ]], [[หยาบคาย]]}},
* {{m|ar|أَعْقَد||[[เป็นปม]]}},
* {{m|ar|أَزَبّ||[[มีขนดก]]}},
* {{m|ar|أَمْيَل||[[เอียง]], [[ลาด]]}},
* {{m|ar|أَجْوَف||[[เว้า]], [[กลวง]]}},
* {{m|ar|أَغْلَف||[[ยังไม่ทำสุหนัต]], [[ไร้อารยธรรม]]}},
* {{m|ar|أَعْزَب||[[โสด]]}} และ
* {{m|ar|أَبْتَر||[[ไร้บุตร]], [[ไร้ทายาท]]}}
และยังมีคำอื่น ๆ ที่มีความหมายซึ่งไม่สามารถจัดว่าเป็นข้อบกพร่องได้เลยในทางใดทางหนึ่ง เช่น
* {{m|ar|أَلْيَس||[[กล้าหาญ]]}},
* {{m|ar|أَشْوَส||[[ทรนง]], [[บ้าบิ่น]]}} และ
* {{m|ar|أَجْمَع||[[ทั้งหมด]], [[ทั้งสิ้น]]}}
รากต้นอ่อนและรากกลางอ่อนจะสร้างขึ้นในลักษณะเดียวกับรากแข็งแรง เช่น {{m|ar|أَوْجَر||[[ขี้ขลาด]], [[หวาดกลัว]]}} และ {{m|ar|أَبْيَض||[[ขาว]]}}; รากท้ายอ่อนสร้างขึ้นตามรูปแบบ {{m|ar||أَفْعَى}} เช่น {{m|ar|أَعْمَى||[[ตาบอด]]}}; ส่วนรากพยัญชนะซ้ำสร้างขึ้นตามรูปแบบ {{m|ar||أَفَعّ}} เช่น {{m|ar|أَزَبّ||[[มีขนดก]]}}
===คำสมุหนาม===
คำสมุหนามมีรูปเป็นเอกพจน์แต่มีความหมายเป็นพหูพจน์ คำสมุหนามส่วนใหญ่หมายถึงสิ่งที่ไม่ใช่มนุษย์ (มักเป็นสัตว์หรือพืช) แต่ก็มีคำสมุหนามสำหรับมนุษย์หรือสิ่งมีชีวิตทรงภูมิปัญญาอื่น ๆ ด้วยเช่นกัน กลุ่มหลังนี้บางครั้งเรียกว่า ''คำสมุหนามบอกชาติพันธุ์'' (ethnic collectives) ซึ่งมักใช้การสอดคล้องแบบพหูพจน์ ในขณะที่คำสมุหนามสิ่งที่ไม่ใช่มนุษย์โดยทั่วไปจะใช้การสอดคล้องแบบเอกพจน์
คำนามที่มีความหมายเป็นเอกพจน์ที่คู่กันคือ ''คำเอกนาม'' (ดูด้านล่าง) ซึ่งคำเอกนามนี้มักสามารถนำไปสร้างเป็นรูปพหูพจน์แท้จริงต่อได้
===คำเอกนาม===
คำเอกนาม ({{l|ar|اِسْم وَحْدَة}}) มีความหมายเป็นเอกพจน์และสร้างขึ้นจากคำสมุหนามโดยการเติม {{m|ar|َة}} เว้นแต่ว่าคำสมุหนามนั้นหมายถึงมนุษย์หรือสิ่งมีชีวิตทรงภูมิปัญญา ซึ่งในกรณีนี้จะลงท้ายด้วยส่วนลงท้าย[[nisba|นิสบะฮ์]] {{m|ar|ـِيّ}} เช่น {{m|ar|عَرَب||[[ชาวอาหรับ]]ทั้งหลาย}}, {{m|ar|عَرَبِيّ||[[ชาวอาหรับ]]คนหนึ่ง}} หรือ {{m|ar|يَهُود||[[ชาวยิว]]ทั้งหลาย}}, {{m|ar|يَهُودِيّ||[[ชาวยิว]]คนหนึ่ง}} หรือ {{m|ar|جِنّ||[[ญิน]], ปีศาจทั้งหลาย}}, {{m|ar|جِنِّي||ญินตนหนึ่ง, ปีศาจตนหนึ่ง}}
คำเอกนามสร้างรูปพหูพจน์ตามวิธีปรกติ เช่น จาก {{m|ar|شَجَرَة||ต้นไม้}} เป็นรูปพหูพจน์ {{m|ar|أَشْجَار}} ทั้งรูปนี้และคำสมุหนาม {{m|ar|شَجَر}} ต่างแปลเป็นภาษาอังกฤษได้ว่า “trees” (ต้นไม้หลายต้น) ความแตกต่างคือ {{m|ar||أَشْجَار}} มองต้นไม้เหล่านั้นเป็นรายต้นหรือแยกเป็นเอกเทศ ส่วน {{m|ar|شَجَر}} มองในภาพรวม (กรณีคล้ายกันในภาษาอังกฤษอาจเทียบได้กับความแตกต่างระหว่าง {{m|en|persons}} และ {{m|en|people}}) รูปพหูพจน์ของคำเอกนามในบางครั้งเรียกว่า ''พหูพจน์แสดงความหลากหลาย'' (plurals of variety) คำเรียกนี้อาจทำให้เข้าใจคลาดเคลื่อนได้อยู่บ้าง แต่มีที่มาจากข้อเท็จจริงที่ว่า {{m|ar||أَشْجَار}} ยังถูกนำมาใช้ในความหมายว่า “ต้นไม้หลากชนิด” ได้ด้วยเช่นกัน
===คำนามบอกครั้ง===
คำนามบอกครั้ง ({{l|ar|اِسْم مَرَّة}}) มีความหมายว่า "การกระทำสิ่งใดสิ่งหนึ่งหนึ่งครั้ง" และสร้างขึ้นจากคำกริยานามโดยการเติม {{m|ar|َة}} เช่น จากคำกริยานาม {{m|ar|ضَرْب||[[การตี]], [[การชก]]}} สร้างเป็น {{m|ar|ضَرْبَة||[[การตีหนึ่งครั้ง]], [[การฟาดหนึ่งที]]}} และจากคำกริยานาม {{m|ar|اِنْتِفَاض||[[การสลัดออก]]}} สร้างเป็น {{m|ar|اِنْتِفَاضَة||[[การสลัดออกหนึ่งครั้ง]], [[การลุกฮือ]], [[อินติฟาดะฮ์]]}}
===คำนามบอกสถานที่===
[[noun of place|คำนามบอกสถานที่]] ({{l|ar|اِسْم مَكَان}}) โดยทั่วไปรับมาจากรากกริยา และมีความหมายโดยประมาณว่า “สถานที่สำหรับกระทำ <var>x</var>” โดยที่ <var>x</var> คือความหมายของกริยานั้น คำนามบอกสถานที่ของ[[base stem|ลำต้นฐาน]] ({{ar-form|I|nocap=1}}) โดยทั่วไปจะมีอุปสรรค {{m|ar||مَـ}} โดยมีรูปเป็น {{m|ar||مَفْعِل}}, {{m|ar||مَفْعَل}}, {{m|ar||مَفْعَلَة}}, {{m|ar||مَفْعِلَة}} และพบรูป {{m|ar||مَفْعُلَة}} ได้ยาก
ตัวอย่างเช่น:
* {{m|ar|مَكْتَب|t=[[โต๊ะทำงาน]], [[สำนักงาน]]}} และ {{m|ar|مَكْتَبَة|t=[[ห้องสมุด]]}} จาก {{m|ar|كَتَبَ||[[เขียน]]}}
* {{m|ar|مَطْبَخ|t=[[ครัว]]}} จาก {{m|ar|طَبَخَ|t=[[ปรุงอาหาร]]}}
* {{m|ar|مَصْنَع|t=[[โรงงาน]]}} จาก {{m|ar|صَنَعَ|t=[[ทำ]], [[ผลิต]]}}
* {{m|ar|مَجْلِس|t=[[ที่นั่ง]]}} จาก {{m|ar|جَلَسَ|t=[[นั่ง]]}}
* {{m|ar|مَقْبَرَة}} และ {{m|ar|مَقْبُرَة|t=[[สุสาน]]}} จาก {{m|ar|قَبَرَ|t=[[ฝัง]]}}
คำนามบอกสถานที่บางคำสร้างขึ้นจากรากที่ไม่ใช่กริยา เช่น {{m|ar|مَقْهًى||[[คาเฟ่]], [[ร้านกาแฟ]]}} สร้างขึ้นจากรากของ {{m|ar|قَهْوَة||[[กาแฟ]]}} และมีความหมายตามตัวอักษรว่า “สถานที่แห่งกาแฟ”
คำนามบอกสถานที่ของกริยาที่นอกเหนือจากรูป I จะใช้รูปเดียวกันกับ[[passive participle|รูปกริยาขยายกรรมวาจก]] ซึ่งหมายความว่าจะขึ้นต้นด้วย {{m|ar||مُـ}} เช่น {{m|ar|مُسْتَشْفًى|t=[[โรงพยาบาล]]}} สร้างขึ้นจากกริยารูป X {{m|ar|اِسْتَشْفَى|t=[[แสวงหา]][[การรักษา]]}} จึงหมายถึง “สถานที่สำหรับแสวงหาการรักษา”, {{m|ar|مُنْتَزَه}} ของ{{ar-form|VII|nocap=1}} และ {{m|ar|مُتَنَزَّه}} ของ{{ar-form|V|nocap=1}} แปลว่า “สวนสาธารณะ, ที่ซึ่งผู้คนไปเดินเล่น”, {{m|ar|مُسْتَنْبَت|t=สถานที่เพาะปลูกพืช}} จากกริยารูป X {{m|ar|اِسْتَنْبَتَ|t=ปลูก, เพาะปลูก}}
===คำนามบอกเครื่องมือ===
คำนามบอกเครื่องมือ ({{m|ar|اسم آلة|اِسْم الْآلَة}}) โดยทั่วไปรับมาจากคำกริยา และมีความหมายโดยประมาณว่า ''เครื่องมือสำหรับกระทำ X'' โดยที่ ''X'' คือความหมายของคำกริยาพื้นฐาน คำนามบอกเครื่องมือมักมีอุปสรรค {{m|ar||مِـ}} และมักอยู่ในรูป {{m|ar|مِفْعَل}}, {{m|ar|مِفْعَلَة}} หรือ {{m|ar|مِفْعَال}} ตัวอย่างเช่น:
*{{m|ar|مِحْفَر||[[พลั่ว]]}}, จาก {{m|ar|حَفَرَ||[[ขุด]]}}
*{{m|ar|مِكْشَط||[[มีดขูดลบ]]}}, จาก {{m|ar|كَشَطَ||[[ขูดลบ]], [[ขูดออก]]}}
*{{m|ar|مِكْنَسَة||[[ไม้กวาด]]}}, จาก {{m|ar|كَنَسَ||[[กวาด]]}}
*{{m|ar|مِكْوَاة||[[เตารีด]]}}, จาก {{m|ar|كَوَى||[[รีดผ้า]], [[เผาไหม้]]}}
*{{m|ar|مِيزَان||[[ตาชั่ง]]}}, จาก {{m|ar|وَزَنَ||[[ชั่ง]]}}
*{{m|ar|مِحَشّ||[[เคียว]]}}, รวมถึง {{m|ar|مِحَشَّة}}, จาก {{m|ar|حَشَّ||[[เกี่ยวหญ้า]], [[ตัดหญ้า]]}}
*{{m|ar|مِلْعَقَة||[[ช้อน]]}}, จาก {{m|ar|لَعِقَ||[[เลีย]]}}
*{{m|ar|مِكْتَاب||[[เครื่องพิมพ์ดีด]]}}, จาก {{m|ar|كَتَبَ||[[เขียน]]}}
คำนามบางคำในกลุ่มนี้รับมาจากคำนามอื่น โดยมีความหมายโดยประมาณว่า "เครื่องมือที่เกี่ยวข้องกับ X":
* {{m|ar|مِكْوَر||[[ผ้าโพกศีรษะ]]}}, รวมถึง {{m|ar|مِكْوَرَة}}, จาก {{m|ar|كُورَة||[[ลูกบอล]], [[ทรงกลม]]}}
* {{m|ar|مِرْوَحَة||[[พัดลม]], [[พัด]]}}, จากราก {{m|ar|ر و ح|pos=root}} ของ {{m|ar|رِيح||[[ลม]]}}
แนวโน้มเมื่อไม่นานมานี้จะหันไปรับคำนามบอกเครื่องมือมาจากรูปเพศหญิงของคำนาม/คำคุณศัพท์บอกอาชีพหรือลักษณะเฉพาะ หรือจากรูปกริยาขยายกรรตุวาจก ซึ่งอาจเป็นการยืมตรงตัว (calque) จากภาษาอังกฤษ:
* {{m|ar|دَبَّابَة||[[รถถัง]]}}, จาก {{m|ar|دَبَّاب||[[ที่คืบคลาน]]}}, {{m|ar|دَبَّ||[[คืบคลาน]]}}
* {{m|ar|نَظَّارَة||[[กล้องโทรทรรศน์]], [[แว่นตา]]}}, จาก {{m|ar|نَظَّار||[[สายตาไว]], [[ช่างสังเกต]]}}, จาก {{m|ar|نَظَرَ||[[มอง]], [[ดู]]}}
* {{m|ar|طَابِعَة||[[เครื่องพิมพ์]] {{gloss|อุปกรณ์คอมพิวเตอร์}}}}, จาก {{m|ar|طَابِع||[[ช่างพิมพ์]] {{gloss|บุคคล}}}}, จาก {{m|ar|طَبَعَ||[[พิมพ์]], [[ประทับตรา]]}}; เทียบกับ {{m|ar|مِطْبَعَة||[[แท่นพิมพ์]], [[โรงพิมพ์]]}}
* {{m|ar|كَاسِحَة||[[เครื่องกวาด]]}} (เทียบกับ {{m|ar|كَاسِحَة الجَلِيد||[[เรือตัดน้ำแข็ง]]}}, {{m|ar|كَاسِحَة الأَلْغَام||[[เรือกวาดทุ่นระเบิด]]}}, {{m|ar|كَاسِحَة الثُلُوج||[[รถกวาดหิมะ]]}}, จาก {{m|ar|كَاسِح||[[ที่กวาดล้างทุกสิ่ง]]}}, จาก {{m|ar|كَسَحَ||[[กวาด]], [[เก็บกวาด]]}}
คำนามบอกเครื่องมือบางคำรับมาจากรูปกริยาขยายกรรตุวาจกโดยตรง:
* {{m|ar|مُحَرِّك||[[เครื่องยนต์]]}} (เดิมหมายถึง "สิ่งที่ขับเคลื่อน"), จาก {{m|ar|حَرَّكَ||[[ขับเคลื่อน]], [[ขยับ]]}}
===คำนามบอกอาชีพ===
''คำนามบอกอาชีพ'' สามารถรับมาจากลำต้นกริยาได้เป็นจำนวนมาก โดยทั่วไปใช้รูป {{m|ar||فَعَّال}} เช่น {{m|ar|كَتَّاب||[[เสมียน]], [[อาลักษณ์]]}} จาก {{m|ar|كَتَبَ||[[เขียน]]}}
[[active participle|รูปกริยาขยายกรรตุวาจก]]ก็สามารถนำมาใช้สร้างคำนามบอกอาชีพได้เช่นกัน เช่น {{m|ar|طَالِب||[[นักเรียน]], [[นักศึกษา]]}} จาก {{m|ar|طَلَبَ||[[ขอ]], [[แสวงหา]]}}, {{m|ar|كَاتِب||[[นักเขียน]], [[เสมียน]]}} จาก {{m|ar|كَتَبَ||[[เขียน]]}}, {{m|ar|بَائِع||[[ผู้ขาย]]}} จาก {{m|ar|بَاعَ||[[ขาย]]}}, {{m|ar|مُهَنْدِس||[[วิศวกร]]}} จาก {{m|ar|هَنْدَسَ||[[ออกแบบทางวิศวกรรม]]}} คำที่ใช้รูป {{m|ar||فَاعِل}} มักมีรูปพหูพจน์เป็น {{m|ar||فُعَّال}} หรือบางครั้งเป็น {{m|ar||فَعَلَة}}; ในบางครั้งปรากฏทั้งสองรูปพหูพจน์โดยมีความหมายต่างกัน เช่น {{m|ar|كُتَّاب||[[นักเขียนทั้งหลาย]]}} แต่ {{m|ar|كَتَبَة||[[เสมียนทั้งหลาย]]}}
นอกจากนี้ คำนามบอกอาชีพบางคำยังอยู่ในรูป[[nisba|นิสบะฮ์]] (มีปัจจัย {{m|ar|ـِيّ}}) เช่น {{m|ar|صُحُفِيّ||[[นักข่าว]]}} หรือ {{m|ar|صِحَافِيّ||[[นักหนังสือพิมพ์]]}} ซึ่งรับมาจาก {{m|ar|صُحُف||[[หนังสือพิมพ์ทั้งหลาย]]}} และ {{m|ar|صِحَافَة||[[วารสารศาสตร์]], [[การสื่อสารมวลชน]]}} ตามลำดับ
===คำนามและคำคุณศัพท์บอกคุณลักษณะ===
''คำนามบอกคุณลักษณะ'' สามารถรับมาจากลำต้นกริยาโดยใช้รูป {{m|ar||فَعَّال}} ซึ่งสร้างคำนามที่มีความหมายว่า "ผู้ที่กระทำ X เป็นนิสัยหรือเป็นอาจิณ" เช่น {{m|ar|كَذَّاب||[[คนโกหก]]}} โปรดสังเกตว่าเป็นรูปเดียวกันกับที่ใช้ใน[[#คำนามบอกอาชีพ|คำนามบอกอาชีพ]]จำนวนมาก ส่วน''คำคุณศัพท์บอกคุณลักษณะ''ก็มีรูปเดียวกันกับคำนามบอกคุณลักษณะ เช่น {{m|ar|دَبَّاب||[[ที่คืบคลาน]]}}, {{m|ar|نَظَّار||[[สายตาไว]], [[ช่างสังเกต]]}}
===ตัวบอกความเล็ก===
''ตัวบอกความเล็ก'' สามารถรับมาจากคำนามสามพยัญชนะ และคำนามสี่พยัญชนะหรือคำที่ยาวกว่าบางคำ โดยใช้รูป {{m|ar||فُعَيْل}} หรือ {{m|ar||فُعَيِّل}}; และรูป {{m|ar||فُعَيْزِل}} สำหรับคำนามสี่พยัญชนะและคำที่ยาวกว่า ตัวบอกความเล็กไม่มีพลังในการสร้างคำมากนักในภาษาอาหรับมาตรฐานสมัยใหม่ หรือในภาษาถิ่นสมัยใหม่หลายภาษา (เช่น ภาษาถิ่นอียิปต์) แต่เคยมีพลังในการสร้างคำมากกว่ามากในภาษาถิ่นอาหรับคลาสสิกบางถิ่น ดังที่เห็นได้จากความแพร่หลายและพลังสร้างคำที่ยังคงมีอยู่อย่างต่อเนื่องในบางภาษาถิ่น เช่น ภาษาอาหรับมอร็อกโก ซึ่งคำนามเกือบทุกคำจะมีตัวบอกความเล็กคู่กัน คำนามบอกความเล็กมีความหมายว่า "X ขนาดเล็ก" หรือ "X ตัวน้อยน่ารัก" ตัวอย่างเช่น {{m|ar|كُلَيْب||[[หมา]][[ตัวน้อย]]}} จาก {{m|ar|كَلْب}}, {{m|ar|كُتَيِّب||[[หนังสือเล่มเล็ก]], [[จุลสาร]]}} จาก {{m|ar|كِتَاب||[[หนังสือ]]}} และ {{m|ar|بُنَيّ||[[ลูกชาย]][[ตัวน้อย]]}} จาก {{m|ar|اِبْن||[[ลูกชาย]]}} ตัวอย่างจากคำนามยาว ได้แก่ {{m|ar|أُبَيْطِر||[[จักรพรรดิ]][[องค์น้อย]]}} จาก {{m|ar|إِمْبِرَاطُور||[[จักรพรรดิ]]}} ตัวบอกความเล็กเพศหญิงก็สามารถสร้างได้เช่นกัน เช่น {{m|ar|قُصَيْبَة||[[ข้าวโอ๊ต]]}} จาก {{m|ar|قَصَبَة||[[อ้อย]], [[ต้นกก]]}} และ {{m|ar|بُنَيَّة||[[ลูกสาว]][[ตัวน้อย]]}} (เทียบกับ {{m|ar|بُنَيّ||[[ลูกชาย]][[ตัวน้อย]]}})
==อ้างอิง==
* {{cite-journal|de|authorlink=August Fischer|last=Fischer|first=August|title=Das Geschlecht der Infinitive im Arabischen|url=https://nbn-resolving.org/urn:nbn:de:gbv:3:5-8179-52331-18/fragment/page=00000923|pages=839–859|year=1906|volume=60|journal=Zeitschrift der Deutschen Morgenländischen Gesellschaft}}
<references/>
==ดูเพิ่ม==
*[[:ภาคผนวก:คำกริยาภาษาอาหรับ]]
[[หมวดหมู่:ภาคผนวกคำนาม|อาหรับ]]
[[หมวดหมู่:ภาคผนวกคำคุณศัพท์|อาหรับ]]
[[หมวดหมู่:ภาคผนวกภาษาอาหรับ|หน่วยนาม]]
3urqqbtxf8lnm56ek956ot9yjryyl3w
มอดูล:sju-sortkey
828
2359311
5775708
2026-10-19T14:09:50Z
Octahedron80
267
สร้างหน้าด้วย "local export = {} local u = mw.ustring.char local a, b, c = u(0xF000), u(0xF001), u(0xF002) local oneChar = { ["á"] = "a" .. a, ["đ"] = "d" .. a, ["ï"] = "i" .. a, ["ŋ"] = "n" .. a, ["ŧ"] = "t" .. a, ["ü"] = "u" .. a, ["å"] = "z" .. a, ["ä"] = "z" .. b, ["ö"] = "z" .. c } function export.makeSortKey(text, lang, sc) return mw.ustring.upper(mw.ustring.gsub(mw.ustring.lower(text), ".", oneChar)) end return export"
5775708
Scribunto
text/plain
local export = {}
local u = mw.ustring.char
local a, b, c = u(0xF000), u(0xF001), u(0xF002)
local oneChar = {
["á"] = "a" .. a, ["đ"] = "d" .. a, ["ï"] = "i" .. a, ["ŋ"] = "n" .. a, ["ŧ"] = "t" .. a, ["ü"] = "u" .. a, ["å"] = "z" .. a, ["ä"] = "z" .. b, ["ö"] = "z" .. c
}
function export.makeSortKey(text, lang, sc)
return mw.ustring.upper(mw.ustring.gsub(mw.ustring.lower(text), ".", oneChar))
end
return export
celfjwyf4dir5zho8cie7z7xaz05uud
มอดูล:sms-sortkey
828
2359312
5775709
2026-10-19T14:10:36Z
Octahedron80
267
สร้างหน้าด้วย "local export = {} local u = mw.ustring.char local a, b, c = u(0xF000), u(0xF001), u(0xF002) local oneChar = { ["â"] = "a" .. a, ["č"] = "c" .. a, ["ʒ"] = "c" .. b, ["ǯ"] = "c" .. c, ["đ"] = "d" .. a, ["ǧ"] = "g" .. a, ["ǥ"] = "g" .. b, ["ǩ"] = "k" .. a, ["ŋ"] = "n" .. a, ["õ"] = "o" .. a, ["š"] = "s" .. a, ["ž"] = "z" .. a, ["å"] = "z" .. b, ["ä"] = "z" .. c } function export.makeSortKey(text, lang, sc) return mw.ustring.upper(mw.u..."
5775709
Scribunto
text/plain
local export = {}
local u = mw.ustring.char
local a, b, c = u(0xF000), u(0xF001), u(0xF002)
local oneChar = {
["â"] = "a" .. a, ["č"] = "c" .. a, ["ʒ"] = "c" .. b, ["ǯ"] = "c" .. c, ["đ"] = "d" .. a, ["ǧ"] = "g" .. a, ["ǥ"] = "g" .. b, ["ǩ"] = "k" .. a, ["ŋ"] = "n" .. a, ["õ"] = "o" .. a, ["š"] = "s" .. a, ["ž"] = "z" .. a, ["å"] = "z" .. b, ["ä"] = "z" .. c
}
function export.makeSortKey(text, lang, sc)
return mw.ustring.upper(mw.ustring.gsub(mw.ustring.lower(text), ".", oneChar))
end
return export
5w71pmba6vvwltum336ecus7ndxgdy3
มอดูล:tzl-sortkey
828
2359313
5775710
2026-10-19T14:11:10Z
Octahedron80
267
สร้างหน้าด้วย "local export = {} local u = mw.ustring.char local a = u(0xF000) local remove_diacritics = u(0x0300) .. "-" .. u(0x0303) .. u(0x0308) .. u(0x030A) .. u(0x0327) -- grave, acute, circumflex, tilde, diaeresis, ring above, cedilla local oneChar = { ["ð"] = "d" .. a, ["ß"] = "ss", ["þ"] = "z" .. a } function export.makeSortKey(text, lang, sc) return mw.ustring.upper(mw.ustring.toNFC(mw.ustring.gsub(mw.ustring.toNFD(mw.ustring.gsub(mw.ustring.lower..."
5775710
Scribunto
text/plain
local export = {}
local u = mw.ustring.char
local a = u(0xF000)
local remove_diacritics = u(0x0300) .. "-" .. u(0x0303) .. u(0x0308) .. u(0x030A) .. u(0x0327) -- grave, acute, circumflex, tilde, diaeresis, ring above, cedilla
local oneChar = {
["ð"] = "d" .. a, ["ß"] = "ss", ["þ"] = "z" .. a
}
function export.makeSortKey(text, lang, sc)
return mw.ustring.upper(mw.ustring.toNFC(mw.ustring.gsub(mw.ustring.toNFD(mw.ustring.gsub(mw.ustring.lower(text), ".", oneChar)), "[" .. remove_diacritics .. "]", "")))
end
return export
4a4nkggv02inwhmhhei0p86r2rm2w8j
aletargar
0
2359314
5775714
2026-10-20T08:26:07Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
5775714
wikitext
text/x-wiki
== ภาษาสเปน ==
=== รากศัพท์ ===
{{ety|es|:af|a-<id:verb prefix>|letargo|-ar<id:verb suffix>|text=+|tree=1}}
=== การออกเสียง ===
{{es-pr}}
=== คำกริยา ===
{{es-verb}}
* {{lb|es|สกรรม}} ทำให้อยู่ในภาวะ[[เซื่องซึม]], ทำให้เกิดอาการ[[เฉื่อยชา]]
* {{lb|es|สะท้อน}} [[จำศีล]]
==== การผันรูป ====
{{es-conj}}
==== ลูกคำ ====
{{col|es|aletargado|aletargamiento}}
=== อ่านเพิ่ม ===
* {{R:es:DRAE}}
0pv0a5v74h2jzb7m1l4ook07yisz60w
aletargando
0
2359315
5775715
2026-10-20T08:26:27Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
5775715
wikitext
text/x-wiki
== ภาษาสเปน ==
=== คำกริยา ===
{{head|es|รูปกริยาเป็นนาม}}
# {{es-verb form of|aletargar}}
06b3bnt6vwbzuxti21uajx0to0civru
aletargado
0
2359316
5775716
2026-10-20T08:26:48Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
5775716
wikitext
text/x-wiki
== ภาษาสเปน ==
=== รากศัพท์ ===
จาก{{m|es|aletargar}}
=== การออกเสียง ===
{{es-pr}}
=== คำคุณศัพท์ ===
{{es-adj}}
* [[เซื่องซึม]], [[เฉื่อยชา]]
=== รูปกริยาขยาย ===
{{es-past participle}}
# {{past participle of|es|aletargar}}
=== อ่านเพิ่ม ===
* {{R:es:DRAE}}
2uyw8rcskmtpski1ck4y6s9u99xgw20
aletargados
0
2359317
5775717
2026-10-20T08:26:52Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
5775717
wikitext
text/x-wiki
== ภาษาสเปน ==
=== การออกเสียง ===
{{es-pr}}
=== คำคุณศัพท์ ===
{{head|es|รูปคุณศัพท์}}
# {{adj form of|es|aletargado||m|p}}
=== รูปกริยาขยาย ===
{{head|es|รูปผันรูปกริยาขยายอดีตกาล|g=m-p}}
# {{masculine plural of|es|aletargado}}
nx0ymwa6ogppvxtzj0aejng5nhgwsoo
aletargada
0
2359318
5775718
2026-10-20T08:26:56Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
5775718
wikitext
text/x-wiki
== ภาษาสเปน ==
=== การออกเสียง ===
{{es-pr}}
=== คำคุณศัพท์ ===
{{head|es|รูปคุณศัพท์}}
# {{adj form of|es|aletargado||f|s}}
=== รูปกริยาขยาย ===
{{head|es|รูปผันรูปกริยาขยายอดีตกาล|g=f-s}}
# {{feminine singular of|es|aletargado}}
h02w27sostesi4aaidnysnpaajqu2u9
aletargadas
0
2359319
5775719
2026-10-20T08:27:00Z
Octahedron80
267
นำเข้าจาก enwikt เก็บกวาด
5775719
wikitext
text/x-wiki
== ภาษาสเปน ==
=== การออกเสียง ===
{{es-pr}}
=== คำคุณศัพท์ ===
{{head|es|รูปคุณศัพท์}}
# {{adj form of|es|aletargado||f|p}}
=== รูปกริยาขยาย ===
{{head|es|รูปผันรูปกริยาขยายอดีตกาล|g=f-p}}
# {{feminine plural of|es|aletargado}}
397a044m43xo8nqck5xzawouhxusyol
มอดูล:category tree/utilities
828
2359320
5775724
2026-10-20T09:46:33Z
Octahedron80
267
สร้างหน้าด้วย "local export = {} local en_utilities_module = "Module:en-utilities" local m_string_utilities = require("Module:string utilities") local m_table = require("Module:table") local umatch = m_string_utilities.match local uupper = m_string_utilities.upper local ulower = m_string_utilities.lower local pattern_escape = m_string_utilities.pattern_escape local list_to_set = m_table.listToSet local dump = mw.dumpObject local insert = table.insert local unpa..."
5775724
Scribunto
text/plain
local export = {}
local en_utilities_module = "Module:en-utilities"
local m_string_utilities = require("Module:string utilities")
local m_table = require("Module:table")
local umatch = m_string_utilities.match
local uupper = m_string_utilities.upper
local ulower = m_string_utilities.lower
local pattern_escape = m_string_utilities.pattern_escape
local list_to_set = m_table.listToSet
local dump = mw.dumpObject
local insert = table.insert
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- If true, output debugging information indicating which specs are being processed and which labels and label objects
-- generated.
local debug_add_labels_from_specs = false
--[==[
Generate labels for inflection classes. `data` is a table with the following fields:
* `labels`: The table into which the labels are written.
* `pos`: The singular part of speech, e.g. "noun".
* `stem_classes`: Table of possible stem classes and associated properties. See below.
* `principal_parts`: List of the principal part fields and descriptions. Each list element is a two-element list
consisting of {"FIELD", "DESCRIPTION"} where FIELD is the field in the element in `stem_classes` (e.g. "nom_sg",
"gen_sg", "pl", "sup") containing the detailed description of what this principal part looks like, and DESCRIPTION
is the corresponding English description of the principal part (e.g. "nominative singular").
* `mark_up_spec`: Optional function to add markup to a spec. Takes two arguments, the spec and a flag `nolink`; if the
flag is true, links should not be present in the resulting markup. The default just converts literal text enclosed
in <...> into italics.
* `make_spec_bare`: Optional function to make a spec (stem class or sortkey) free of markup. The default just converts
literal text enclosed in <...> into bare text.
* `addl`: Optional additional text to be displayed in the footer of each category page.
`stem_classes` is a table describing the various stem classes and how to format the category description of each. It is
a table with keys specifying the stem classes and values consisting of an object containing properties of the stem
class. If the stem class contains the word 'GENDER' in it, it expands into labels both for a parent category that
subsumes several genders (obtained by removing the word 'GENDER' and following whitespace) as well as gender-specific
children categories (obtained by replacing the word 'GENDER' with the genders specified in the `possible_genders`
field). The stem class can contain literal text (e.g. suffixes), which will be marked up appropriately (e.g. italicized)
in breadcrumbs and titles. The fields of the property object for a given stem class are as follows:
* `gender`: The description of the gender(s) of the stem class. If preceded by ~, the description is preceded by
"most commonly". This appears in the `additional` field of the label properties. It is not used in gender-specific
children categories; instead the gender of that category is used.
* `possible_genders`: The possible genders this class occurs in. If this is specified, the word 'GENDER' must occur in
the stem class, and gender-specific variants of the stem class (with GENDER replaced by the possible genders) are
handled along with a parent category subsuming all genders.
* `PRINCIPAL_PART`: The ending for the specified principal part. Use <...> to enclose literal Latin-script text (e.g.
suffixes), which will be italicized. There will be one field for each principal part listed in the `principal_parts`
table described above.
* `GENDER_PRINCIPAL_PART`: The ending for the GENDER variant of the specified principal part. If not specified, the
value of `PRINCIPAL_PART` is used.
* `breadcrumb`: The breadcrumb for the category, appearing in the trail of breadcrumbs at the top of the page. If this
stem has gender-specific variants, the breadcrumb specified here is used only for the parent category, while the
gender-specific child categories use the gender as the breadcrumb. If not specified, it defaults to `sortkey`. If that
is also not specified, or if the breadcrumb has the value "+", the stem class (without the word 'GENDER') is used.
(Use "+" when a sortkey is specified but the stem class should be used as the breadcrumb.)
* `parent`: The parent category or categories. If specified, the actual category label is formed by appending the part
of speech (e.g. "nouns"). Defaults to "POS by inflection type" where POS is the part of speech. Note that
gender-specific child categories do not use this, but always have the gender-subsuming parent stem class category as
their parent.
* `sortkey`: The sort key used for sorting this category among its parent's children. Defaults to the stem class
(without the word 'GENDER'). Note that gender-specific child categories do nto use this, but always use the gender
as the sort key.
* `addl`: Optional additional text to be displayed in the footer of the category page.
* `GENDER_addl`: Optional additional text to be displayed in the footer of a gender-specific category page, defaulting
to `addl`. Use the value `false` to cancel out a non-gender-specific value.
]==]
function export.add_inflection_labels(data)
for _, reqfield_spec in ipairs {
{"labels", "table of labels"},
{"pos", "singular part of speech"},
{"stem_classes", "table of possible stem classes and associated properties"},
{"principal_parts", "list of principal part fields and names"},
} do
local reqfield, gloss = unpack(reqfield_spec)
if not data[reqfield] then
error(("Internal error: Missing field '%s', which should containing the %s"):format(reqfield, gloss))
end
end
local function default_mark_up_spec(spec, _nolink)
return (spec:gsub("<(.-)>", "''%1''"))
end
local function default_make_spec_bare(spec)
return (spec:gsub("<(.-)>", "%1"))
end
local function mark_up_spec(spec, nolink)
return (data.mark_up_spec or default_mark_up_spec)(spec, nolink)
end
local function make_spec_bare(spec)
return (data.make_spec_bare or default_make_spec_bare)(spec)
end
local plpos = require(en_utilities_module).pluralize(data.pos)
for full_infl, spec in pairs(data.stem_classes) do
local subgenders = spec.possible_genders
-- Get the stem type.
local infl
if subgenders then
if not full_infl:find("GENDER") then
error(("Internal error: Declension spec '%s' needs to have the word 'GENDER' in it, in all caps"):format(full_infl))
end
infl = full_infl:gsub("GENDER ", "")
else
infl = full_infl
end
-- Get the breadcrumb.
local breadcrumb = spec.breadcrumb or spec.sortkey or "+"
if breadcrumb == "+" then
breadcrumb = infl
end
-- Generate the parents.
local parents = {}
local spec_parents = spec.parent
if type(spec_parents) == "string" then
spec_parents = {spec_parents}
end
local parent_sort = make_spec_bare(spec.sortkey or infl)
if spec_parents then
for _, parent in ipairs(spec_parents) do
table.insert(parents, {name = make_spec_bare(parent) .. " " .. plpos, sort = parent_sort})
end
else
table.insert(parents, {name = plpos .. " by inflection type", sort = parent_sort})
end
-- Generate the additional text, including principal part descriptions and footer.
local function create_addl(gender_spec, subgender_prefix)
local addl_parts = {}
local function ins(txt)
table.insert(addl_parts, txt)
end
local function insert_header(gender_spec)
if gender_spec then
local most_commonly, gender = gender_spec:match("^(~)(.*)$")
most_commonly = most_commonly and "most commonly " or ""
gender = gender or gender_spec
ins(("These %s are %s%s, typically with the following endings:\n"):format(plpos, most_commonly,
mark_up_spec(gender)))
else
ins(("These %s typically have the following endings:\n"):format(plpos))
end
end
local function process_ending(field, desc, is_last)
local ending_spec = spec[subgender_prefix .. field] or spec[field]
if not ending_spec then
error(("Internal error: for inflection '%s', field '%s' for principal part '%s' is missing"):format(
full_infl, field, desc))
end
return ("* in the %s: %s%s"):format(desc, mark_up_spec(ending_spec), is_last and "." or ";\n")
end
local function insert_principal_part_info()
for i, ppart_spec in ipairs(data.principal_parts) do
local ppart_field, ppart_desc = unpack(ppart_spec)
ins(process_ending(ppart_field, ppart_desc, i == #data.principal_parts))
end
end
insert_header(gender_spec)
insert_principal_part_info()
local spec_addl = spec[subgender_prefix .. "addl"]
if spec_addl == nil then
spec_addl = spec.addl
end
if data.addl or spec_addl then
local footer_parts = {}
if data.addl then
table.insert(footer_parts, mark_up_spec(data.addl))
end
if spec_addl then
table.insert(footer_parts, mark_up_spec(spec_addl))
end
ins("\n" .. table.concat(footer_parts, " "))
end
return table.concat(addl_parts)
end
data.labels[make_spec_bare(infl) .. " " .. plpos] = {
description = "{{{langname}}} " .. mark_up_spec(infl) .. " " .. plpos .. ".",
displaytitle = "{{{langname}}} " .. mark_up_spec(infl, "nolink") .. " " .. plpos,
additional = create_addl(spec.gender, ""),
breadcrumb = mark_up_spec(breadcrumb, "nolink"),
parents = parents,
}
if subgenders then
for _, subgender in ipairs(subgenders) do
local gender_infl = full_infl:gsub("GENDER", subgender)
data.labels[make_spec_bare(gender_infl) .. " " .. plpos] = {
description = "{{{langname}}} " .. mark_up_spec(gender_infl) .. " " .. plpos .. ".",
displaytitle = "{{{langname}}} " .. mark_up_spec(gender_infl, "nolink") .. " " .. plpos,
additional = create_addl(subgender, subgender .. "_"),
breadcrumb = subgender,
parents = {{
name = make_spec_bare(infl) .. " " .. plpos,
sort = subgender,
}},
}
end
end
end
end
local recognized_label_fields = list_to_set {
"additional",
"breadcrumb",
"breadcrumb_base",
"breadcrumb_key",
"breadcrumb_and_first_sort_base",
"breadcrumb_and_first_sort_key",
"umbrella",
"umbrella_parents",
}
--[==[
Add category labels to `labels` from the specs in `specs`. The intent is to allow easy specification of iteration over
part-of-speech and similar variables to construct multiple similar labels. `specs` is a list of labels specs, each of
which is a table with three positional fields and additional named fields. The positional fields are as follows:
* `[1]` = the label itself;
* `[2]` = the description, without any preceding `{{{langname}}}` or following period;
* `[3]` = the value of `parents`.
If the language name (i.e. `{{{langname}}}`) appears other than at the beginning of the description, include it in the
description and it will not be prepended. Note that in such a case, `{{{langname}}}` should be in an appositive
construction, e.g. `{{{langname}}} words`, because when constructing the umbrella description, a non-initial occurrence
of `{{{langname}}}` will be replaced with `specific-language`.
In addition, the table can contain named fields. There are three types of named fields:
# Fields referring to other properties of the label. These are such as `additional`, `breadcrumb`, `breadcrumb_base`,
`breadcrumb_key`, `umbrella`, etc. These will be stored directly the label, but will be processed for variable
references (see below).
# ''Iteration variables''. Any string anywhere in a positional or named field can contain ''variable references'', e.g.
`{pos}`, which refer to variables that will be iterated over. The values to be iterated over are specified by
''variable-list'' fields, e.g. `pos = {"nouns", "verbs", "adjectives"}`. If there are multiple iteration variables,
each will be iterated over, meaning that e.g. if there are three variables with respectively K, M and N values, there
will be K*M*N labels. Each value of an iteration variable list is either a string (the actual value) or a table where
the `[1]` (the first positional field) is the value and named fields specify values of ''ancillary'' variables, which
are not iterated over but which are appropriately substituted when the variable being iterated over takes the
specified value. For example, the field
`sufpos = {{"prefixes", begin_end = "beginnings"}, {"suffixes", begin_end = "endings"}}` specifies that the iteration
variable `sufpos` will be iterated over with the values `prefixes` and `suffixes`, and when this happens, the
ancillary variable `begin_end` will have the value `beginnings` when `sufpos` has the value `prefixes`, and will have
the value `endings` when `sufpos` has the value `suffixes`. Ancillary variables can be referred to in the same fashion
as iteration variables, e.g. `{begin_end}` and `{sufpos}`.
# Ancillary default values. Fields beginning with `default_` supply the default value for ancillary variables whose
value is not explicitly given for a specific value of an iteration variable. For example, if the iteration variable
`pos` is specified using `pos = {"nouns", "proper nouns", {"suffixes", posdesc = "suffixes that form nouns"}}`, the
ancillary variable `posdesc` will have the value `suffixes that form nouns` when `pos` has the value `suffixes`, but
is otherwise unspecified. The value for the other iteration values is specified through a default, such as
`default_posdesc = "{pos}"`, which says that the value should be `"{pos}"` (i.e. the same as the iteration value) for
other iteration values. Defaults can also be specified at top level using the `defaults` field. If an ancillary
variable is left unspecified, and there is no default value either in the label spec or at top level, an error will
be thrown if/when a reference to the specified ancillary variable occurs.
]==]
function export.add_labels_from_specs(labels, specs)
for _, spec in ipairs(specs.specs) do
if debug_add_labels_from_specs then
mw.log(("Processing spec: %s"):format(dump(spec)))
end
local label_spec = spec[1]
local description_spec = spec[2]
if not description_spec:find("{{{langname}}}") then
description_spec = "{{{langname}}} " .. description_spec
end
description_spec = description_spec .. "."
local parents_spec = spec[3]
local additional_label_properties = {}
local ancillary_defaults = {}
local iteration_vars = {}
for k, v in pairs(spec) do
if type(k) == "number" then
if k >= 1 and k <= 3 then
-- OK
else
error(("Internal error: Unrecognized positional field %s=%s in spec %s"):format(k, dump(v), dump(spec)))
end
elseif recognized_label_fields[k] then
additional_label_properties[k] = v
elseif k:find("^default_") then
local ancvar = k:gsub("^default_", "")
ancillary_defaults[ancvar] = v
else
if not v[1] then
error(("Internal error: Iteration variable %s=%s is not in list form in spec %s"):format(k, dump(v), dump(spec)))
end
insert(iteration_vars, {k, v})
end
end
local function expand_variables_in_string(str, iteration_values)
if not str:find("{") then
return str
end
str = str:gsub("{{{", "\1"):gsub("}}}", "\2"):gsub("{{", "\3"):gsub("}}", "\4")
if str:find("{") then
str = str:gsub("{([^{}]*)}", function(var)
if iteration_values[var] then
return expand_variables_in_string(iteration_values[var], iteration_values)
else
error(("Internal error: Unable to expand variable {%s} in %s in spec %s"
):format(var, dump(str), dump(spec)))
end
end)
end
str = str:gsub("\1", "{{{"):gsub("\2", "}}}"):gsub("\3", "{{"):gsub("\4", "}}")
return str
end
local function expand_variables(val, iteration_values)
if type(val) == "string" then
return expand_variables_in_string(val, iteration_values)
elseif type(val) ~= "table" then
return val
else
local newval = {}
for k, v in pairs(val) do
newval[k] = expand_variables(v, iteration_values)
end
return newval
end
end
local function construct_iteration_values(explicit_values)
local iteration_values = {}
local ancillary_values = {}
for k, v in pairs(explicit_values) do
if type(v) == "string" then
iteration_values[k] = v
else
iteration_values[k] = v[1]
for kk, vv in pairs(v) do
if type(kk) == "number" then
if kk == 1 then
-- OK
else
error(("Internal error: Unrecognized positional field %s=%s in iteration value %s=%s in spec %s"
):format(kk, dump(vv), k, dump(v), dump(spec)))
end
elseif ancillary_values[kk] then
error(("Trying to set ancillary variable %s=%s in iteration value %s=%s and encountered already-set variable; presumably set in different iteration variables; spec %s"
):format(kk, dump(vv), k, dump(v), dump(spec)))
elseif type(vv) ~= "string" then
error(("Internal error: Ancillary value %s=%s not a string in iteration value %s=%s; spec %s"
):format(kk, dump(vv), k, dump(v), dump(spec)))
else
ancillary_values[kk] = vv
end
end
end
end
local merged_ancillary_values = {}
-- First merge the overall defaults.
if specs.defaults then
for k, v in pairs(specs.defaults) do
if type(v) ~= "string" then
error(("Internal error: Top-level ancillary default %s=%s not a string"):format(k, dump(v)))
end
merged_ancillary_values[k] = v
end
end
-- Now merge the per-spec defaults.
for k, v in pairs(ancillary_defaults) do
if type(v) ~= "string" then
error(("Internal error: Ancillary default %s=%s not a string; spec %s"):format(k, dump(v), dump(spec)))
end
merged_ancillary_values[k] = v
end
-- Now merge the per-iteration-value values; we already checked above that they are strings.
for k, v in pairs(ancillary_values) do
merged_ancillary_values[k] = v
end
-- Now merge the ancillary values into the iteration values.
for k, v in pairs(merged_ancillary_values) do
if iteration_values[k] then
error(("Trying to set ancillary variable %s=%s in iteration values structure and encountered already-set variable with value %s; naming clash between iteration and ancillary variables; spec %s"
):format(k, dump(v), dump(iteration_values[k]), dump(spec)))
end
iteration_values[k] = v
end
return iteration_values
end
local function add_label(explicit_values)
local iteration_values = construct_iteration_values(explicit_values)
local label_obj = {
description = expand_variables(description_spec, iteration_values),
parents = expand_variables(parents_spec, iteration_values),
}
for k, v in pairs(additional_label_properties) do
label_obj[k] = expand_variables(v, iteration_values)
end
local label = expand_variables(label_spec, iteration_values)
if debug_add_labels_from_specs then
mw.log(("Adding label %s = %s"):format(dump(label), dump(label_obj)))
end
labels[label] = label_obj
end
local iteration_indices = {}
local iteration_lengths = {}
local num_vars = #iteration_vars
if num_vars == 0 then
add_label({})
else
for i = 1, num_vars do
insert(iteration_indices, 1)
insert(iteration_lengths, #iteration_vars[i][2])
end
-- Loop over the Cartesian product of all iteration variables. In each iteration through the loop, we
-- process one set of indices.
while true do
local explicit_values = {}
for i, iteration_var in ipairs(iteration_vars) do
local var, values = unpack(iteration_var)
explicit_values[var] = values[iteration_indices[i]]
end
add_label(explicit_values)
-- Now increment the iteration indices using the odometer algorithm.
local next_var_index = 1
while true do
iteration_indices[next_var_index] = iteration_indices[next_var_index] + 1
if iteration_indices[next_var_index] > iteration_lengths[next_var_index] then
iteration_indices[next_var_index] = 1
next_var_index = next_var_index + 1
if next_var_index > num_vars then
break
end
else
break
end
end
if next_var_index > num_vars then
break
end
end
end
end
end
--[==[
Set `breadcrumb_base` on the labels in `label` by chopping off the parent (or the parent's parent, etc.) from the
beginning or end of the label, if possible. This will not override existing breadcrumbs (using any of the breadcrumb or
breadcrumb-related settings). `addl_terms_to_remove_for_breadcrumb_base` is a list of additional terms that will be
chopped off of either end of the label to form the `breadcrumb_base`. (For example,
[[Module:category tree/affixes and compounds]] specifies { {"compounds"}} because the parent is {"compound terms"} but
many children end in {"compounds"}, and [[Module:category tree/entry maintenance]] specifies { {"entries", "terms"}},
which occurs at the beginning of many entry-maintenance categories.) `addl_terms_to_remove_for_sort` is a list of
additional terms to remove from the beginning of the computed `breadcrumb_base` to form the value of `sort` in the
first parent. If such a term is removed, `sort` will be set in the first parent if not already set, which will override
the sort base coming from `breadcrumb_base`. (For example, [[Module:category tree/entry maintenance]] specifies
{ {"with"}}. The effect of this combined with the above setting is that a label like
{"entries with incorrect language header"} with first parent {"entry maintenance"} will have a breadcrumb
{"with incorrect language header"} and a sort key {"incorrect language header"}.
]==]
function export.add_partial_breadcrumbs(labels_cats, addl_terms_to_remove_for_breadcrumb_base, addl_terms_to_remove_for_sort)
for label, data in pairs(labels_cats) do
if data.breadcrumb == nil and data.breadcrumb_key == nil and data.breadcrumb_base == nil and
data.breadcrumb_and_first_sort_key == nil and data.breadcrumb_and_first_sort_base == nil then
local pardata = data
local function make_anycase_term_to_remove(term)
local first, rest = umatch(term, "^(.)(.*)$")
return ("[%s%s%s]%s"):format(first, uupper(first), ulower(first), pattern_escape(rest))
end
-- Check a term against the beginning and end of the label and if found, set the breadcrumb base
-- accordingly. Return true if the breadcrumb_base was set, otherwise false. If additional terms to check
-- for sortkey removal are given, we check those terms at the beginning of the chopped breadcrumb_base or
-- the label (regardless of whether we were able to remove any terms from the breadcrumb), and if we were
-- able to remove any terms, attempt to set the sortkey.
local function check_breadcrumb_base_term(term_to_remove)
local breadcrumb_base
local term_to_remove_pattern = make_anycase_term_to_remove(term_to_remove)
-- Check the end of the label for the term to remove.
breadcrumb_base = umatch(label, ("^(.-) %s$"):format(term_to_remove_pattern))
if not breadcrumb_base then
-- If not found, check the beginning of the label for the term to remove.
breadcrumb_base = umatch(label, ("^%s (.-)$"):format(term_to_remove_pattern))
end
local breadcrumb_base_set = not not breadcrumb_base
breadcrumb_base = breadcrumb_base or label
-- If additional terms to remove to form the sortkey, do it now.
if addl_terms_to_remove_for_sort then
for _, addl_term in ipairs(addl_terms_to_remove_for_sort) do
local sort = umatch(breadcrumb_base, ("^(.-) %s$"):format(make_anycase_term_to_remove(addl_term)))
if sort then
-- Attempt to set the `sort` on the first parent, but don't override an existing value.
local parents = data.parents
if type(parents) == "string" or type(parents) == "table" and not parents[1] then
parents = {parents}
end
if parents and parents[1] then
local parent = parents[1]
if type(parent) == "string" then
parent = {name = parent}
end
if type(parent) == "table" and not parent.sort then
parent.sort = sort
parents[1] = parent
data.parents = parents
end
end
break
end
end
end
if breadcrumb_base_set then
data.breadcrumb_base = breadcrumb_base
return true
end
return false
end
while true do
-- Loop over first parents and first parents of first parents until there are no more.
local parents = pardata.parents
if type(parents) == "string" or type(parents) == "table" and not parents[1] then
parents = {parents}
end
if not parents or not parents[1] then
break
end
local parent = parents[1]
if type(parent) == "table" then
parent = parent.name
end
if type(parent) == "string" then
if check_breadcrumb_base_term(parent) then
break
end
pardata = labels_cats[parent]
if not pardata then
break
end
else
break
end
end
-- Also check additional specified terms to remove from the label to form the breadcrumb.
if addl_terms_to_remove_for_breadcrumb_base then
for _, addl_term in ipairs(addl_terms_to_remove_for_breadcrumb_base) do
if check_breadcrumb_base_term(addl_term) then
break
end
end
end
end
end
end
-- FIXME: Older entry point.
export.add_partial_breadcrumbs_to_labels = export.add_partial_breadcrumbs
--[==[
Finalize the labels in `labels` according to the specs in `data`. This does two things:
# Set `breadcrumb_base` on the labels in `label` by chopping off the parent (or the parent's parent, etc.) from the
beginning or end of the label, if possible. This will not override existing breadcrumbs (using any of the breadcrumb
or breadcrumb-related settings). `data.addl_terms_to_remove_for_breadcrumb_base` is a list of additional terms that
will be chopped off of either end of the label to form the `breadcrumb_base`. (For example,
[[Module:category tree/affixes and compounds]] specifies { {"compounds"}} because the parent is {"compound terms"} but
many children end in {"compounds"}, and [[Module:category tree/entry maintenance]] specifies { {"entries", "terms"}},
which occurs at the beginning of many entry-maintenance categories.) `data.addl_terms_to_remove_for_sort` is a list of
additional terms to remove from the beginning of the computed `breadcrumb_base` to form the value of `sort` in the
first parent. If such a term is removed, `sort` will be set in the first parent if not already set, which will
override the sort base coming from `breadcrumb_base`. (For example, [[Module:category tree/entry maintenance]]
specifies { {"with"}}. The effect of this combined with the above setting is that a label like
{"entries with incorrect language header"} with first parent {"entry maintenance"} will have a breadcrumb
{"with incorrect language header"} and a sort key {"incorrect language header"}.
# Add an `umbrella_parents` key if not already present and `data.default_umbrella_parents` is specified.
]==]
function export.finalize_labels(labels, data)
data = data or {}
export.add_partial_breadcrumbs(labels,
data.addl_terms_to_remove_for_breadcrumb_base, data.addl_terms_to_remove_for_sort)
if data.default_umbrella_parents then
-- Add 'umbrella_parents' key if not already present.
for label, labdat in pairs(labels) do
if not labdat.umbrella_parents then
labdat.umbrella_parents = data.default_umbrella_parents
end
end
end
end
function export.finalize_raw_categories(raw_categories, data)
data = data or {}
export.add_partial_breadcrumbs(raw_categories,
data.addl_terms_to_remove_for_breadcrumb_base, data.addl_terms_to_remove_for_sort)
end
return export
d234ry6bei5t65m2qwyp6geh1342cfd
5775725
5775724
2026-10-20T09:49:36Z
Octahedron80
267
5775725
Scribunto
text/plain
local export = {}
local en_utilities_module = "Module:en-utilities"
local m_string_utilities = require("Module:string utilities")
local m_table = require("Module:table")
local umatch = m_string_utilities.match
local uupper = m_string_utilities.upper
local ulower = m_string_utilities.lower
local pattern_escape = m_string_utilities.pattern_escape
local list_to_set = m_table.listToSet
local dump = mw.dumpObject
local insert = table.insert
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- If true, output debugging information indicating which specs are being processed and which labels and label objects
-- generated.
local debug_add_labels_from_specs = false
--[==[
Generate labels for inflection classes. `data` is a table with the following fields:
* `labels`: The table into which the labels are written.
* `pos`: The singular part of speech, e.g. "noun".
* `stem_classes`: Table of possible stem classes and associated properties. See below.
* `principal_parts`: List of the principal part fields and descriptions. Each list element is a two-element list
consisting of {"FIELD", "DESCRIPTION"} where FIELD is the field in the element in `stem_classes` (e.g. "nom_sg",
"gen_sg", "pl", "sup") containing the detailed description of what this principal part looks like, and DESCRIPTION
is the corresponding English description of the principal part (e.g. "nominative singular").
* `mark_up_spec`: Optional function to add markup to a spec. Takes two arguments, the spec and a flag `nolink`; if the
flag is true, links should not be present in the resulting markup. The default just converts literal text enclosed
in <...> into italics.
* `make_spec_bare`: Optional function to make a spec (stem class or sortkey) free of markup. The default just converts
literal text enclosed in <...> into bare text.
* `addl`: Optional additional text to be displayed in the footer of each category page.
`stem_classes` is a table describing the various stem classes and how to format the category description of each. It is
a table with keys specifying the stem classes and values consisting of an object containing properties of the stem
class. If the stem class contains the word 'GENDER' in it, it expands into labels both for a parent category that
subsumes several genders (obtained by removing the word 'GENDER' and following whitespace) as well as gender-specific
children categories (obtained by replacing the word 'GENDER' with the genders specified in the `possible_genders`
field). The stem class can contain literal text (e.g. suffixes), which will be marked up appropriately (e.g. italicized)
in breadcrumbs and titles. The fields of the property object for a given stem class are as follows:
* `gender`: The description of the gender(s) of the stem class. If preceded by ~, the description is preceded by
"most commonly". This appears in the `additional` field of the label properties. It is not used in gender-specific
children categories; instead the gender of that category is used.
* `possible_genders`: The possible genders this class occurs in. If this is specified, the word 'GENDER' must occur in
the stem class, and gender-specific variants of the stem class (with GENDER replaced by the possible genders) are
handled along with a parent category subsuming all genders.
* `PRINCIPAL_PART`: The ending for the specified principal part. Use <...> to enclose literal Latin-script text (e.g.
suffixes), which will be italicized. There will be one field for each principal part listed in the `principal_parts`
table described above.
* `GENDER_PRINCIPAL_PART`: The ending for the GENDER variant of the specified principal part. If not specified, the
value of `PRINCIPAL_PART` is used.
* `breadcrumb`: The breadcrumb for the category, appearing in the trail of breadcrumbs at the top of the page. If this
stem has gender-specific variants, the breadcrumb specified here is used only for the parent category, while the
gender-specific child categories use the gender as the breadcrumb. If not specified, it defaults to `sortkey`. If that
is also not specified, or if the breadcrumb has the value "+", the stem class (without the word 'GENDER') is used.
(Use "+" when a sortkey is specified but the stem class should be used as the breadcrumb.)
* `parent`: The parent category or categories. If specified, the actual category label is formed by appending the part
of speech (e.g. "nouns"). Defaults to "POS by inflection type" where POS is the part of speech. Note that
gender-specific child categories do not use this, but always have the gender-subsuming parent stem class category as
their parent.
* `sortkey`: The sort key used for sorting this category among its parent's children. Defaults to the stem class
(without the word 'GENDER'). Note that gender-specific child categories do nto use this, but always use the gender
as the sort key.
* `addl`: Optional additional text to be displayed in the footer of the category page.
* `GENDER_addl`: Optional additional text to be displayed in the footer of a gender-specific category page, defaulting
to `addl`. Use the value `false` to cancel out a non-gender-specific value.
]==]
function export.add_inflection_labels(data)
for _, reqfield_spec in ipairs {
{"labels", "table of labels"},
{"pos", "singular part of speech"},
{"stem_classes", "table of possible stem classes and associated properties"},
{"principal_parts", "list of principal part fields and names"},
} do
local reqfield, gloss = unpack(reqfield_spec)
if not data[reqfield] then
error(("Internal error: Missing field '%s', which should containing the %s"):format(reqfield, gloss))
end
end
local function default_mark_up_spec(spec, _nolink)
return (spec:gsub("<(.-)>", "''%1''"))
end
local function default_make_spec_bare(spec)
return (spec:gsub("<(.-)>", "%1"))
end
local function mark_up_spec(spec, nolink)
return (data.mark_up_spec or default_mark_up_spec)(spec, nolink)
end
local function make_spec_bare(spec)
return (data.make_spec_bare or default_make_spec_bare)(spec)
end
local plpos = require(en_utilities_module).pluralize(data.pos)
for full_infl, spec in pairs(data.stem_classes) do
local subgenders = spec.possible_genders
-- Get the stem type.
local infl
if subgenders then
if not full_infl:find("GENDER") then
error(("Internal error: Declension spec '%s' needs to have the word 'GENDER' in it, in all caps"):format(full_infl))
end
infl = full_infl:gsub("GENDER ", "")
else
infl = full_infl
end
-- Get the breadcrumb.
local breadcrumb = spec.breadcrumb or spec.sortkey or "+"
if breadcrumb == "+" then
breadcrumb = infl
end
-- Generate the parents.
local parents = {}
local spec_parents = spec.parent
if type(spec_parents) == "string" then
spec_parents = {spec_parents}
end
local parent_sort = make_spec_bare(spec.sortkey or infl)
if spec_parents then
for _, parent in ipairs(spec_parents) do
table.insert(parents, {name = make_spec_bare(parent) .. " " .. plpos, sort = parent_sort})
end
else
table.insert(parents, {name = plpos .. "แบ่งตามชนิดการผันรูป", sort = parent_sort})
end
-- Generate the additional text, including principal part descriptions and footer.
local function create_addl(gender_spec, subgender_prefix)
local addl_parts = {}
local function ins(txt)
table.insert(addl_parts, txt)
end
local function insert_header(gender_spec)
if gender_spec then
local most_commonly, gender = gender_spec:match("^(~)(.*)$")
most_commonly = most_commonly and "most commonly " or ""
gender = gender or gender_spec
ins(("These %s are %s%s, typically with the following endings:\n"):format(plpos, most_commonly,
mark_up_spec(gender)))
else
ins(("These %s typically have the following endings:\n"):format(plpos))
end
end
local function process_ending(field, desc, is_last)
local ending_spec = spec[subgender_prefix .. field] or spec[field]
if not ending_spec then
error(("Internal error: for inflection '%s', field '%s' for principal part '%s' is missing"):format(
full_infl, field, desc))
end
return ("* in the %s: %s%s"):format(desc, mark_up_spec(ending_spec), is_last and "." or ";\n")
end
local function insert_principal_part_info()
for i, ppart_spec in ipairs(data.principal_parts) do
local ppart_field, ppart_desc = unpack(ppart_spec)
ins(process_ending(ppart_field, ppart_desc, i == #data.principal_parts))
end
end
insert_header(gender_spec)
insert_principal_part_info()
local spec_addl = spec[subgender_prefix .. "addl"]
if spec_addl == nil then
spec_addl = spec.addl
end
if data.addl or spec_addl then
local footer_parts = {}
if data.addl then
table.insert(footer_parts, mark_up_spec(data.addl))
end
if spec_addl then
table.insert(footer_parts, mark_up_spec(spec_addl))
end
ins("\n" .. table.concat(footer_parts, " "))
end
return table.concat(addl_parts)
end
data.labels[make_spec_bare(infl) .. " " .. plpos] = {
description = "{{{langname}}} " .. mark_up_spec(infl) .. " " .. plpos .. ".",
displaytitle = "{{{langname}}} " .. mark_up_spec(infl, "nolink") .. " " .. plpos,
additional = create_addl(spec.gender, ""),
breadcrumb = mark_up_spec(breadcrumb, "nolink"),
parents = parents,
}
if subgenders then
for _, subgender in ipairs(subgenders) do
local gender_infl = full_infl:gsub("GENDER", subgender)
data.labels[make_spec_bare(gender_infl) .. " " .. plpos] = {
description = "{{{langname}}} " .. mark_up_spec(gender_infl) .. " " .. plpos .. ".",
displaytitle = "{{{langname}}} " .. mark_up_spec(gender_infl, "nolink") .. " " .. plpos,
additional = create_addl(subgender, subgender .. "_"),
breadcrumb = subgender,
parents = {{
name = make_spec_bare(infl) .. " " .. plpos,
sort = subgender,
}},
}
end
end
end
end
local recognized_label_fields = list_to_set {
"additional",
"breadcrumb",
"breadcrumb_base",
"breadcrumb_key",
"breadcrumb_and_first_sort_base",
"breadcrumb_and_first_sort_key",
"umbrella",
"umbrella_parents",
}
--[==[
Add category labels to `labels` from the specs in `specs`. The intent is to allow easy specification of iteration over
part-of-speech and similar variables to construct multiple similar labels. `specs` is a list of labels specs, each of
which is a table with three positional fields and additional named fields. The positional fields are as follows:
* `[1]` = the label itself;
* `[2]` = the description, without any preceding `{{{langname}}}` or following period;
* `[3]` = the value of `parents`.
If the language name (i.e. `{{{langname}}}`) appears other than at the beginning of the description, include it in the
description and it will not be prepended. Note that in such a case, `{{{langname}}}` should be in an appositive
construction, e.g. `{{{langname}}} words`, because when constructing the umbrella description, a non-initial occurrence
of `{{{langname}}}` will be replaced with `specific-language`.
In addition, the table can contain named fields. There are three types of named fields:
# Fields referring to other properties of the label. These are such as `additional`, `breadcrumb`, `breadcrumb_base`,
`breadcrumb_key`, `umbrella`, etc. These will be stored directly the label, but will be processed for variable
references (see below).
# ''Iteration variables''. Any string anywhere in a positional or named field can contain ''variable references'', e.g.
`{pos}`, which refer to variables that will be iterated over. The values to be iterated over are specified by
''variable-list'' fields, e.g. `pos = {"nouns", "verbs", "adjectives"}`. If there are multiple iteration variables,
each will be iterated over, meaning that e.g. if there are three variables with respectively K, M and N values, there
will be K*M*N labels. Each value of an iteration variable list is either a string (the actual value) or a table where
the `[1]` (the first positional field) is the value and named fields specify values of ''ancillary'' variables, which
are not iterated over but which are appropriately substituted when the variable being iterated over takes the
specified value. For example, the field
`sufpos = {{"prefixes", begin_end = "beginnings"}, {"suffixes", begin_end = "endings"}}` specifies that the iteration
variable `sufpos` will be iterated over with the values `prefixes` and `suffixes`, and when this happens, the
ancillary variable `begin_end` will have the value `beginnings` when `sufpos` has the value `prefixes`, and will have
the value `endings` when `sufpos` has the value `suffixes`. Ancillary variables can be referred to in the same fashion
as iteration variables, e.g. `{begin_end}` and `{sufpos}`.
# Ancillary default values. Fields beginning with `default_` supply the default value for ancillary variables whose
value is not explicitly given for a specific value of an iteration variable. For example, if the iteration variable
`pos` is specified using `pos = {"nouns", "proper nouns", {"suffixes", posdesc = "suffixes that form nouns"}}`, the
ancillary variable `posdesc` will have the value `suffixes that form nouns` when `pos` has the value `suffixes`, but
is otherwise unspecified. The value for the other iteration values is specified through a default, such as
`default_posdesc = "{pos}"`, which says that the value should be `"{pos}"` (i.e. the same as the iteration value) for
other iteration values. Defaults can also be specified at top level using the `defaults` field. If an ancillary
variable is left unspecified, and there is no default value either in the label spec or at top level, an error will
be thrown if/when a reference to the specified ancillary variable occurs.
]==]
function export.add_labels_from_specs(labels, specs)
for _, spec in ipairs(specs.specs) do
if debug_add_labels_from_specs then
mw.log(("Processing spec: %s"):format(dump(spec)))
end
local label_spec = spec[1]
local description_spec = spec[2]
if not description_spec:find("{{{langname}}}") then
description_spec = "{{{langname}}} " .. description_spec
end
description_spec = description_spec .. "."
local parents_spec = spec[3]
local additional_label_properties = {}
local ancillary_defaults = {}
local iteration_vars = {}
for k, v in pairs(spec) do
if type(k) == "number" then
if k >= 1 and k <= 3 then
-- OK
else
error(("Internal error: Unrecognized positional field %s=%s in spec %s"):format(k, dump(v), dump(spec)))
end
elseif recognized_label_fields[k] then
additional_label_properties[k] = v
elseif k:find("^default_") then
local ancvar = k:gsub("^default_", "")
ancillary_defaults[ancvar] = v
else
if not v[1] then
error(("Internal error: Iteration variable %s=%s is not in list form in spec %s"):format(k, dump(v), dump(spec)))
end
insert(iteration_vars, {k, v})
end
end
local function expand_variables_in_string(str, iteration_values)
if not str:find("{") then
return str
end
str = str:gsub("{{{", "\1"):gsub("}}}", "\2"):gsub("{{", "\3"):gsub("}}", "\4")
if str:find("{") then
str = str:gsub("{([^{}]*)}", function(var)
if iteration_values[var] then
return expand_variables_in_string(iteration_values[var], iteration_values)
else
error(("Internal error: Unable to expand variable {%s} in %s in spec %s"
):format(var, dump(str), dump(spec)))
end
end)
end
str = str:gsub("\1", "{{{"):gsub("\2", "}}}"):gsub("\3", "{{"):gsub("\4", "}}")
return str
end
local function expand_variables(val, iteration_values)
if type(val) == "string" then
return expand_variables_in_string(val, iteration_values)
elseif type(val) ~= "table" then
return val
else
local newval = {}
for k, v in pairs(val) do
newval[k] = expand_variables(v, iteration_values)
end
return newval
end
end
local function construct_iteration_values(explicit_values)
local iteration_values = {}
local ancillary_values = {}
for k, v in pairs(explicit_values) do
if type(v) == "string" then
iteration_values[k] = v
else
iteration_values[k] = v[1]
for kk, vv in pairs(v) do
if type(kk) == "number" then
if kk == 1 then
-- OK
else
error(("Internal error: Unrecognized positional field %s=%s in iteration value %s=%s in spec %s"
):format(kk, dump(vv), k, dump(v), dump(spec)))
end
elseif ancillary_values[kk] then
error(("Trying to set ancillary variable %s=%s in iteration value %s=%s and encountered already-set variable; presumably set in different iteration variables; spec %s"
):format(kk, dump(vv), k, dump(v), dump(spec)))
elseif type(vv) ~= "string" then
error(("Internal error: Ancillary value %s=%s not a string in iteration value %s=%s; spec %s"
):format(kk, dump(vv), k, dump(v), dump(spec)))
else
ancillary_values[kk] = vv
end
end
end
end
local merged_ancillary_values = {}
-- First merge the overall defaults.
if specs.defaults then
for k, v in pairs(specs.defaults) do
if type(v) ~= "string" then
error(("Internal error: Top-level ancillary default %s=%s not a string"):format(k, dump(v)))
end
merged_ancillary_values[k] = v
end
end
-- Now merge the per-spec defaults.
for k, v in pairs(ancillary_defaults) do
if type(v) ~= "string" then
error(("Internal error: Ancillary default %s=%s not a string; spec %s"):format(k, dump(v), dump(spec)))
end
merged_ancillary_values[k] = v
end
-- Now merge the per-iteration-value values; we already checked above that they are strings.
for k, v in pairs(ancillary_values) do
merged_ancillary_values[k] = v
end
-- Now merge the ancillary values into the iteration values.
for k, v in pairs(merged_ancillary_values) do
if iteration_values[k] then
error(("Trying to set ancillary variable %s=%s in iteration values structure and encountered already-set variable with value %s; naming clash between iteration and ancillary variables; spec %s"
):format(k, dump(v), dump(iteration_values[k]), dump(spec)))
end
iteration_values[k] = v
end
return iteration_values
end
local function add_label(explicit_values)
local iteration_values = construct_iteration_values(explicit_values)
local label_obj = {
description = expand_variables(description_spec, iteration_values),
parents = expand_variables(parents_spec, iteration_values),
}
for k, v in pairs(additional_label_properties) do
label_obj[k] = expand_variables(v, iteration_values)
end
local label = expand_variables(label_spec, iteration_values)
if debug_add_labels_from_specs then
mw.log(("Adding label %s = %s"):format(dump(label), dump(label_obj)))
end
labels[label] = label_obj
end
local iteration_indices = {}
local iteration_lengths = {}
local num_vars = #iteration_vars
if num_vars == 0 then
add_label({})
else
for i = 1, num_vars do
insert(iteration_indices, 1)
insert(iteration_lengths, #iteration_vars[i][2])
end
-- Loop over the Cartesian product of all iteration variables. In each iteration through the loop, we
-- process one set of indices.
while true do
local explicit_values = {}
for i, iteration_var in ipairs(iteration_vars) do
local var, values = unpack(iteration_var)
explicit_values[var] = values[iteration_indices[i]]
end
add_label(explicit_values)
-- Now increment the iteration indices using the odometer algorithm.
local next_var_index = 1
while true do
iteration_indices[next_var_index] = iteration_indices[next_var_index] + 1
if iteration_indices[next_var_index] > iteration_lengths[next_var_index] then
iteration_indices[next_var_index] = 1
next_var_index = next_var_index + 1
if next_var_index > num_vars then
break
end
else
break
end
end
if next_var_index > num_vars then
break
end
end
end
end
end
--[==[
Set `breadcrumb_base` on the labels in `label` by chopping off the parent (or the parent's parent, etc.) from the
beginning or end of the label, if possible. This will not override existing breadcrumbs (using any of the breadcrumb or
breadcrumb-related settings). `addl_terms_to_remove_for_breadcrumb_base` is a list of additional terms that will be
chopped off of either end of the label to form the `breadcrumb_base`. (For example,
[[Module:category tree/affixes and compounds]] specifies { {"compounds"}} because the parent is {"compound terms"} but
many children end in {"compounds"}, and [[Module:category tree/entry maintenance]] specifies { {"entries", "terms"}},
which occurs at the beginning of many entry-maintenance categories.) `addl_terms_to_remove_for_sort` is a list of
additional terms to remove from the beginning of the computed `breadcrumb_base` to form the value of `sort` in the
first parent. If such a term is removed, `sort` will be set in the first parent if not already set, which will override
the sort base coming from `breadcrumb_base`. (For example, [[Module:category tree/entry maintenance]] specifies
{ {"with"}}. The effect of this combined with the above setting is that a label like
{"entries with incorrect language header"} with first parent {"entry maintenance"} will have a breadcrumb
{"with incorrect language header"} and a sort key {"incorrect language header"}.
]==]
function export.add_partial_breadcrumbs(labels_cats, addl_terms_to_remove_for_breadcrumb_base, addl_terms_to_remove_for_sort)
for label, data in pairs(labels_cats) do
if data.breadcrumb == nil and data.breadcrumb_key == nil and data.breadcrumb_base == nil and
data.breadcrumb_and_first_sort_key == nil and data.breadcrumb_and_first_sort_base == nil then
local pardata = data
local function make_anycase_term_to_remove(term)
local first, rest = umatch(term, "^(.)(.*)$")
return ("[%s%s%s]%s"):format(first, uupper(first), ulower(first), pattern_escape(rest))
end
-- Check a term against the beginning and end of the label and if found, set the breadcrumb base
-- accordingly. Return true if the breadcrumb_base was set, otherwise false. If additional terms to check
-- for sortkey removal are given, we check those terms at the beginning of the chopped breadcrumb_base or
-- the label (regardless of whether we were able to remove any terms from the breadcrumb), and if we were
-- able to remove any terms, attempt to set the sortkey.
local function check_breadcrumb_base_term(term_to_remove)
local breadcrumb_base
local term_to_remove_pattern = make_anycase_term_to_remove(term_to_remove)
-- Check the end of the label for the term to remove.
breadcrumb_base = umatch(label, ("^(.-) %s$"):format(term_to_remove_pattern))
if not breadcrumb_base then
-- If not found, check the beginning of the label for the term to remove.
breadcrumb_base = umatch(label, ("^%s (.-)$"):format(term_to_remove_pattern))
end
local breadcrumb_base_set = not not breadcrumb_base
breadcrumb_base = breadcrumb_base or label
-- If additional terms to remove to form the sortkey, do it now.
if addl_terms_to_remove_for_sort then
for _, addl_term in ipairs(addl_terms_to_remove_for_sort) do
local sort = umatch(breadcrumb_base, ("^(.-) %s$"):format(make_anycase_term_to_remove(addl_term)))
if sort then
-- Attempt to set the `sort` on the first parent, but don't override an existing value.
local parents = data.parents
if type(parents) == "string" or type(parents) == "table" and not parents[1] then
parents = {parents}
end
if parents and parents[1] then
local parent = parents[1]
if type(parent) == "string" then
parent = {name = parent}
end
if type(parent) == "table" and not parent.sort then
parent.sort = sort
parents[1] = parent
data.parents = parents
end
end
break
end
end
end
if breadcrumb_base_set then
data.breadcrumb_base = breadcrumb_base
return true
end
return false
end
while true do
-- Loop over first parents and first parents of first parents until there are no more.
local parents = pardata.parents
if type(parents) == "string" or type(parents) == "table" and not parents[1] then
parents = {parents}
end
if not parents or not parents[1] then
break
end
local parent = parents[1]
if type(parent) == "table" then
parent = parent.name
end
if type(parent) == "string" then
if check_breadcrumb_base_term(parent) then
break
end
pardata = labels_cats[parent]
if not pardata then
break
end
else
break
end
end
-- Also check additional specified terms to remove from the label to form the breadcrumb.
if addl_terms_to_remove_for_breadcrumb_base then
for _, addl_term in ipairs(addl_terms_to_remove_for_breadcrumb_base) do
if check_breadcrumb_base_term(addl_term) then
break
end
end
end
end
end
end
-- FIXME: Older entry point.
export.add_partial_breadcrumbs_to_labels = export.add_partial_breadcrumbs
--[==[
Finalize the labels in `labels` according to the specs in `data`. This does two things:
# Set `breadcrumb_base` on the labels in `label` by chopping off the parent (or the parent's parent, etc.) from the
beginning or end of the label, if possible. This will not override existing breadcrumbs (using any of the breadcrumb
or breadcrumb-related settings). `data.addl_terms_to_remove_for_breadcrumb_base` is a list of additional terms that
will be chopped off of either end of the label to form the `breadcrumb_base`. (For example,
[[Module:category tree/affixes and compounds]] specifies { {"compounds"}} because the parent is {"compound terms"} but
many children end in {"compounds"}, and [[Module:category tree/entry maintenance]] specifies { {"entries", "terms"}},
which occurs at the beginning of many entry-maintenance categories.) `data.addl_terms_to_remove_for_sort` is a list of
additional terms to remove from the beginning of the computed `breadcrumb_base` to form the value of `sort` in the
first parent. If such a term is removed, `sort` will be set in the first parent if not already set, which will
override the sort base coming from `breadcrumb_base`. (For example, [[Module:category tree/entry maintenance]]
specifies { {"with"}}. The effect of this combined with the above setting is that a label like
{"entries with incorrect language header"} with first parent {"entry maintenance"} will have a breadcrumb
{"with incorrect language header"} and a sort key {"incorrect language header"}.
# Add an `umbrella_parents` key if not already present and `data.default_umbrella_parents` is specified.
]==]
function export.finalize_labels(labels, data)
data = data or {}
export.add_partial_breadcrumbs(labels,
data.addl_terms_to_remove_for_breadcrumb_base, data.addl_terms_to_remove_for_sort)
if data.default_umbrella_parents then
-- Add 'umbrella_parents' key if not already present.
for label, labdat in pairs(labels) do
if not labdat.umbrella_parents then
labdat.umbrella_parents = data.default_umbrella_parents
end
end
end
end
function export.finalize_raw_categories(raw_categories, data)
data = data or {}
export.add_partial_breadcrumbs(raw_categories,
data.addl_terms_to_remove_for_breadcrumb_base, data.addl_terms_to_remove_for_sort)
end
return export
nqvux1m5hfwoyb92875osjfdu6cgy4x