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.22
case-sensitive
สื่อ
พิเศษ
พูดคุย
ผู้ใช้
คุยกับผู้ใช้
วิกิพจนานุกรม
คุยเรื่องวิกิพจนานุกรม
ไฟล์
คุยเรื่องไฟล์
มีเดียวิกิ
คุยเรื่องมีเดียวิกิ
แม่แบบ
คุยเรื่องแม่แบบ
วิธีใช้
คุยเรื่องวิธีใช้
หมวดหมู่
คุยเรื่องหมวดหมู่
ภาคผนวก
คุยเรื่องภาคผนวก
ดัชนี
คุยเรื่องดัชนี
สัมผัส
คุยเรื่องสัมผัส
อรรถาภิธาน
คุยเรื่องอรรถาภิธาน
TimedText
TimedText talk
มอดูล
คุยเรื่องมอดูล
Event
Event talk
มือ
0
3564
5770989
5726275
2026-09-30T04:10:31Z
Ai Ku Karng
17824
/* ภาษาแสก */
5770989
wikitext
text/x-wiki
{{also/auto}}
== ภาษาไทย ==
=== การออกเสียง ===
{{th-pron}}
=== รากศัพท์ 1 ===
{{wp}}
{{picdic
|image=Paume de main.jpeg
|width=310
|labels=
{{picdiclabel|th|color=white|fontsize=18|posx=100|posy=179|link=ฝ่ามือ}}
{{picdiclabel|th|color=white|fontsize=12|posx=10|posy=200|link=ข้อมือ|align=left}}
{{picdiclabel|th|color=white|fontsize=12|posx=90|posy=70|link=หัวแม่มือ}}
{{picdiclabel|th|color=white|fontsize=12|posx=200|posy=125|link=นิ้วชี้}}
{{picdiclabel|th|color=white|fontsize=12|posx=225|posy=160|link=นิ้วกลาง}}
{{picdiclabel|th|color=white|fontsize=12|posx=220|posy=205|link=นิ้วนาง}}
{{picdiclabel|th|color=white|fontsize=12|posx=200|posy=245|link=นิ้วก้อย}}
|detail1=
{{picdicimg|de|image=Arm flex supinate.jpg|link=แขน}}
}}
{{inh+|th|tai-swe-pro|*mɯːᴬ⁴}}, จาก{{inh|th|tai-pro|*mwɯːᴬ}}
ร่วมเชื้อสายกับ{{cog|tts|มือ}}, {{cog|lo|ມື}}, {{cog|nod|ᨾᩨ}}, {{cog|khb|ᦙᦹ}}, {{cog|blt|ꪣꪳ}}, {{cog|twh|ꪝꪳ}}, {{cog|shn|မိုဝ်း}}, {{cog|phk|မိုဝ်}}, {{cog|aio|မိုဝ်}}, {{cog|tdd|ᥛᥪᥰ}}, {{cog|aho|𑜉𑜢𑜤𑜈𑜫}}, {{cog|tyz|mừ}}, {{cog|za|fwngz}}, {{cog|pcc|fengz}}, {{cog|skb|มื๊อ}}, {{cog|zzj|mwz}} (ดูเพิ่มที่{{cog|za|mwz}})
เทียบ{{cog|swi|myal}}, {{cog|qfa-onb-pro|*məːᴬ²}}, {{cog|qfa-lic-pro|*C-mɯː}}
==== คำนาม ====
{{th-noun}}
# [[อวัยวะ]][[ส่วน]][[หนึ่ง]][[ของ]][[ร่างกาย]][[อยู่]][[ต่อ]][[จาก]][[ปลาย]][[แขน]][[ประกอบ]][[ด้วย]][[ฝ่า]]มือ[[และ]][[นิ้ว]]มือ [[สำหรับ]][[จับ]][[เป็นต้น]]
# [[เรียก]][[สิ่ง]][[หรือ]][[อุปกรณ์]][[บาง]][[ชนิด]][[ที่]][[มี]][[รูปร่าง]][[อย่าง]]มือและ[[ใช้]]จับ[[แทน]]มือ[[ได้]]
#: {{ux|th|มือกล}}
#: {{ux|th|มือหุ่นยนต์}}
# เรียก[[ผู้]][[ร่วม]][[เล่น]][[การพนัน]]บางอย่างหรือ[[แชร์]]เป็นต้น [[ว่า]] มือ
#: {{ux|th|คนหนึ่งจะเล่นกี่มือก็ได้}}
# [[หนวด]]ของ[[ไม้เลื้อย]]บางชนิดใช้[[เกาะ]]สิ่ง[[อื่น]]อย่างมือ
#: {{ux|th|มือตำลึง}}
#: {{ux|th|มือบวบ}}
===== คำแปลภาษาอื่น =====
{{trans-top|อวัยวะส่วนหนึ่งของร่างกายอยู่ต่อจากปลายแขน}}
* กรีก: {{t+|el|χέρι|n}}
* กะดู: {{t|zkd|tvhuV}}
* กะเหรี่ยง:
*: ปะโอ: {{t|blk|စူ}}
*: โปตะวันตก: {{t|pwo|စူၪ}}
*: สะกอ: {{t|ksw|စု}}
* กาตาลา: {{t+|ca|mà|f}}
* กาโร: {{t|grt|jak}}
* เกาหลี: {{t+|ko|손}}
* เขมร: {{t+|km|ដៃ}}
* เขมรเหนือ: {{t|kxm|ได}}
* คุชราต: {{t+|gu|હાથ}}
* คูนิงามิ: {{t|xug|手|tr=てぃー, thī}}
* คำตี้: {{t|kht|မိုဝ်း}}
* คำเมือง: {{t+|nod|ᨾᩨ}}
* จ้วง: {{t|za|mwz}}, {{t|za|fwngz}}
* จอร์เจีย: {{t+|ka|ხელი}}, {{t+|ka|მტევანი}}
* จาม:
*: ตะวันตก: {{t|cja|tangin}}
*: ตะวันออก: {{t|cjm|tangin}}
* จีน:
*: กวางตุ้ง: {{t+|yue|手}}
*: ดุงกาน: {{t|dng|шу}}
*: หมิ่นตะวันออก: {{t|cdo|手}}
*: แคะ: {{t|hak|手|tr=sú}}
*: หมิ่นใต้: {{t+|nan-hbl|手|tr=chhiú}}
*: จีนกลาง: {{t+|cmn|手}}
*: อู๋: {{t|wuu|手}}
* จุน: {{t|cuq|mow¹}}
* ซามี:
*: เหนือ: {{t|se|giehta}}
* ซูก: {{t|tsg|lima}}
* ญี่ปุ่น: {{t+|ja|手|tr=て, te}}
* ดัตช์: {{t+|nl|hand|f|tr=ฮันด์}}
* เดนมาร์ก: {{t+|da|hånd|c}}
* ตังกุต: {{t|txg|𗃑}}
* ตั่ย: {{t|tyz|mừ}}
* ตากาล็อก: {{t+|tl|kamay}}
* ตุรกี: {{t+|tr|el}}
* ทมิฬ: {{t+|ta|கை}}
* ตอกปีซิน: {{t+|tpi|han}}
* ทะวืง: {{t|thm|ซี}}
* ไทดำ: {{t|blt|ꪣꪳ}}
* ไทใต้คง: {{t|tdd|ᥛᥪᥰ}}
* ไทลื้อ: {{t|khb|ᦙᦹ}}
* ไทใหญ่: {{t+|shn|မိုဝ်း}}
* นอร์เวย์:
*: บุ๊กมอล: {{t+|nb|hand|f}}, {{t+|nb|hånd|m|f}}
*: นือนอสก์: {{t+|nn|hand|f}}
* นุง: {{t|nut|mư}}
* บาลี: {{t|pi|หตฺถ}}
* เบงกอล: {{t+|bn|হাত}}, {{t+|bn|দস্ত}}
* โปรตุเกส: {{t+|pt|mão|f}}
* โปแลนด์: {{t+|pl|ręka|f}}, {{t+|pl|dłoń|f}}
* ฝรั่งเศส: {{t+|fr|main|f}}
* พม่า: {{t+|my|လက်}}
* ฟรีเชียตะวันตก: {{t+|fy|hân|c|tr=ฮอน}}
* ฟินแลนด์: {{t+|fi|käsi}}
* มณีปุระ: {{t+|mni|ꯈꯨꯠ}}
* มลยาฬัม: {{t+|ml|കൈ}}
* มลายูแบบปัตตานี: {{t|mfa|تاڠٍي}}
* มอญ: {{t+|mnw|တဲ}}
* มาเลเซีย: {{t+|ms|tangan}}, {{t+|ms|lima}} {{q|โบราณ|เลิกใช้}}, {{t+|ms|yad}}
* มิยาโกะ: {{t|mvi|手|tr=てぃー, tī}}
* ยาเอยามะ: {{t|rys|手|tr=てぃー, tī}}
* เยอรมัน: {{t+|de|Hand|f}}
* โยนางูนิ: {{t|yoi|手|tr=てぃー, tī}}
* รัสเซีย: {{t+|ru|рука́|f}}
* โรฮีนจา: {{t|rhg|hát}}
* ละติน: {{t+|la|manus|f}}
* ลัตเวีย: {{t+|lv|roka|f}}, {{t+|lv|plauksta|f}}
* ลาว: {{t+|lo|ມື}}
* ลิทัวเนีย: {{t+|lt|ranka|f}}, {{t+|lt|plaštaka|f}}
* เวียดนาม: {{t+|vi|tay}}
* สเปน: {{t+|es|mano|f}}
* สวาฮีลี: {{t+|sw|mkono|c3}}
* สวีเดน: {{t+|sv|hand|c}}
* แสก: {{t|skb|มื๊อ}}
* ไหล: {{t|lic|meuu}}
* อเวสตะ: {{t|ae|𐬰𐬀𐬯𐬙𐬀}}
* อะตง: {{t|aot|chak}}
* อังกฤษ: {{t+|en|hand|tr=แฮนด์}}
* อัมฮารา: {{t|am|እጅ}}
* อาเซอร์ไบจาน: {{t+|az|əl}}
* อาร์มีเนีย: {{t+|hy|ձեռք}}
* อาหรับ: {{t+|ar|يَد|f}}
* อิตาลี: {{t+|it|mano|f}}
* อินโดนีเซีย: {{t+|id|tangan}}, {{t+|id|yad}}
* อินุกติตุต: {{t|iu|ᐊᒡᒐᒃ}}
* อูรักลาโวยจ: {{t|urk|ตางัน}}
* เอสเปรันโต: {{t+|eo|mano}}
* แอลเบเนีย: {{t+|sq|dorë|f}}
* โอกินาวะ: {{t|ryu|手|tr=てぃー, tī}}
* โอริยา: {{t+|or|ହାତ}}
* ไอซ์แลนด์: {{t+|is|hönd|f}}, {{t+|is|mund|f}}
* ไอริช: {{t+|ga|lámh|f}}
* ฮาวาย: {{t|haw|lima}}
* ฮินดี: {{t+|hi|हाथ|m}}
* ฮีบรู: {{t+|he|יָד|f}}
{{trans-bottom}}
==== คำลักษณนาม ====
{{th-cls}}
# [[บอก]][[จำนวน]][[นับ]] 5 [[ลูก]] [[เป็น]] 1 มือ (ใช้[[ใน]][[เวลา]]นับ[[ผลไม้]]บางชนิด [[เช่น]] [[มะปราง]] [[มังคุด]] [[เงาะ]])
=== รากศัพท์ 2 ===
==== คำนาม ====
{{th-noun}}
# ใช้ประกอบ[[หน้า]][[ชื่อ]][[เครื่องดนตรี]]ที่ใช้มือ[[บรรเลง]] [[เพื่อ]][[หมาย]][[ถึง]]ผู้ที่มี[[ความชำนาญ]]หรือมี[[ทักษะ]]ใน[[การบรรเลง]][[ดนตรี]][[นั้น]] ๆ
#: {{ux|th|มือระนาด}}
#: {{ux|th|มือจะเข้}}
#: {{ux|th|มือกลอง}}
#: {{ux|th|มือปี่}}
=== รากศัพท์ 3 ===
จากรูปร่างของผลส้มชนิดนี้ที่คล้ายนิ้วมือ
==== คำนาม ====
{{th-noun}}
# ชื่อ[[ส้ม]]ชนิด ''Citrus medica'' L. var. ''sarcodactylis'' (Hoola van Nooten) Swingle ใน[[วงศ์]] Rutaceae [[ซึ่ง]]ส่วน[[ล่าง]]ของ[[ผล]]มี[[ลักษณะ]][[คล้าย]]นิ้วมือ ใช้[[ทำ]][[ยาดม]]ได้ เรียกว่า ส้มมือ
{{topics|th|กายวิภาคศาสตร์}}
== ภาษาแสก ==
=== รากศัพท์ ===
{{inh+|skb|tai-pro|*mwɯ:ꟲ||วัน}}; ร่วมเชื้อสายกับ{{cog|th|มื้อ}}, {{cog|nod|ᨾᩨ᩶}}, {{cog|lo|ມື້}}, {{cog|khb|ᦙᦹᧉ}}, {{cog|shn|မိုဝ်ႉ}}
=== การออกเสียง ===
* {{IPA|skb|/mɯː¹/|[mɯː˧]|a=บ้านบะหว้า}}
=== คำนาม ===
{{skb-noun}}
# [[วัน]]
r32jeaosf8y38e8gcaubza91mfrfiq8
भाषा
0
4420
5770974
1507161
2026-09-30T02:54:36Z
~2026-52673-48
19634
5770974
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== คำนาม ===
{{sa-noun|g=f}}
# [[ภาษา]]
{{sa-decl-noun-f}}
ayftfvk3ipgm5rym6k892q23hdvbtit
शर्करा
0
6550
5770986
5684797
2026-09-30T03:22:55Z
~2026-52673-48
19634
5770986
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== รากศัพท์ ===
{{inh+|sa|inc-pro|*śárkaraH}}, จาก{{inh|sa|iir-pro|*ĉárkaraH}}, จาก{{inh|sa|ine-pro|*ḱorkeh₂|t=กรวด}}; ร่วมเชื้อสายกับ{{cog|grc|κρόκη||กรวด}}
=== คำนาม ===
{{sa-noun|g=f}}
# [[กรวด]]
# [[นิ่ว]]
# [[น้ำตาล]] (ผงหรือก้อนให้รสหวาน)
{{sa-decl-noun-f}}
== ภาษาฮินดี ==
{{wikipedia|lang=hi}}
=== รากศัพท์ ===
{{lbor|hi|sa|शर्करा}}; {{dbt|hi|शक्कर}}
=== การออกเสียง ===
* {{hi-IPA}}
=== คำนาม ===
{{hi-noun|f|ur=شرکرا}}
# {{lb|hi|ทางการ}} [[น้ำตาล]] {{gloss|ผงให้รสหวาน}}
# {{lb|hi|เคมี}} [[กลูโคส]]; [[ซูโครส]]
{{hi-ndecl|<F>}}
==== คำพ้องความ ====
* {{sense|น้ำตาล}} {{l|hi|चीनी}}, {{l|hi|शक्कर}}
==== อ้างอิง ====
* {{R:hi:McGregor}}
25igf4ik0lchwttuwg8r8iq56gyifzn
इच्छा
0
6606
5770975
5684810
2026-09-30T02:55:59Z
~2026-52673-48
19634
5770975
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== รากศัพท์ ===
{{inh+|sa|ine-pro|*h₂eys-}}, ซึ่งเป็นรากของ {{m|sa|इच्छति}} อีกด้วย
=== คำนาม ===
{{sa-noun|g=f}}
# [[ความอยาก]], [[ความต้องการ]], [[ความปรารถนา]]
#: {{syn|sa|आशा|तृष्णा}}
==== การผันรูป ====
{{sa-decl-noun-f}}
==== คำสืบทอด ====
* {{desc|raj|चा}}
* {{desc|te|ఇచ్ఛ}}
* {{desc|th|อิจฉา}}
== ภาษาฮินดี ==
=== รากศัพท์ ===
{{bor+|hi|sa|इच्छा}}
=== การออกเสียง ===
* {{hi-IPA}}
=== คำนาม ===
{{hi-noun|f|ur=اچها}}
# [[ความอยาก]], [[ความต้องการ]], [[ความปรารถนา]]
#: {{hi-x|मेरी '''इच्छा''' है कि मेरी मृत्यु के बाद, यह घर बेचा जाए।|มันเป็นความต้องการของฉัน ที่จะขายบ้านหลังนี้ หลังจากที่ฉันตาย}}
#: {{syn|hi|कामना|चाह|ख़्वाहिश|अभिलाषा}}
==== การผันรูป ====
{{hi-noun-ā-f|इच्छ}}
==== ลูกคำ ====
* {{l|hi|इच्छामृत्यु}}
02iedv39njvekm117ay9wq21uwsxpm9
5770976
5770975
2026-09-30T02:56:41Z
~2026-52673-48
19634
5770976
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== รากศัพท์ ===
{{inh+|sa|ine-pro|*h₂eys-}}, ซึ่งเป็นรากของ {{m|sa|इच्छति}} อีกด้วย
=== คำนาม ===
{{sa-noun|g=f}}
# [[ความอยาก]], [[ความต้องการ]], [[ความปรารถนา]]
#: {{syn|sa|आशा|तृष्णा}}
==== การผันรูป ====
{{sa-decl-noun-f}}
==== คำสืบทอด ====
* {{desc|raj|चा}}
* {{desc|te|ఇచ్ఛ}}
* {{desc|th|อิจฉา}}
== ภาษาฮินดี ==
=== รากศัพท์ ===
{{bor+|hi|sa|इच्छा}}
=== การออกเสียง ===
* {{hi-IPA}}
=== คำนาม ===
{{hi-noun|f|ur=اچها}}
# [[ความอยาก]], [[ความต้องการ]], [[ความปรารถนา]]
#: {{hi-x|मेरी '''इच्छा''' है कि मेरी मृत्यु के बाद, यह घर बेचा जाए।|มันเป็นความต้องการของฉัน ที่จะขายบ้านหลังนี้ หลังจากที่ฉันตาย}}
#: {{syn|hi|कामना|चाह|ख़्वाहिश|अभिलाषा}}
==== การผันรูป ====
{{hi-ndecl|<F>}}
==== ลูกคำ ====
* {{l|hi|इच्छामृत्यु}}
d8wtj690jfc4xpuscrk8rs1cof7k7gp
पुत्री
0
6761
5770981
5385406
2026-09-30T03:05:42Z
~2026-52673-48
19634
5770981
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== รากศัพท์ ===
จาก{{affix|sa|पुत्र|-ई|t1=son|pos2=feminine suffix}}.
=== คำนาม ===
{{sa-noun|g=f}}
# [[ลูกสาว]]
==== การผันรูป ====
{{sa-decl-noun-f}}
==== คำเกี่ยวข้อง ====
* {{l|sa|पुत्र}}
* {{l|sa|पौत्र}}
==== คำสืบทอด ====
* {{desc|pa|ਪੁੱਤਰੀ}}
* {{→}} ฮินดูสตานี:
** {{desc|hi|पुत्री}}
** {{desc|ur|پتری|tr=putrī}}
* {{desc|bn|পুত্রী|bor=1}}
* {{desc|bor=1|km|បុត្រី}}
* {{desc|bor=1|ml|പുത്രി}}
* {{desc|bor=1|ms|puteri}}
** {{desc|id|putri}}
* {{desc|bor=1|te|పుత్రిక|g=f}}
* {{desc|bor=1|th|บุตรี}}
{{topics|sa|ครอบครัว}}
== ภาษาฮินดี ==
=== รากศัพท์ ===
{{bor+|hi|sa|पुत्री}}
=== การออกเสียง ===
* {{hi-IPA}}
=== คำนาม ===
{{hi-noun|f|m=पुत्र|ur=پتری}}
# [[ลูกสาว]]
==== การผันรูป ====
{{hi-ndecl|<F>}}
==== คำพ้องความ ====
* {{l|hi|बेटी}}
* {{l|hi|लड़की}}
=== อ้างอิง ===
* {{R:hi:Bahri}}
* {{R:hi:McGregor}}
{{topics|hi|ครอบครัว}}
6ffcp9zws65evxhv7nkoliz5cw808mz
पात्र
0
7203
5770979
2187591
2026-09-30T03:02:41Z
~2026-52673-48
19634
5770979
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== คำนาม ===
{{sa-noun|g=n}}
# [[ภาชนะ]][[สำหรับ]][[ดื่ม]], [[ถ้วย]], [[แก้ว]], [[หม้อ]], [[จาน]]
# [[นักแสดง]]
{{sa-decl-noun-n}}
==== คำสืบทอด ====
{{top2}}
* ไทย: {{l|th|บาตร}}
{{bottom}}
== ภาษาฮินดี ==
=== รากศัพท์ ===
{{root|hi|ine-pro|*peh₃-}}
ยืมจาก{{bor|hi|sa|पात्र}}; ร่วมเชื้อสายกับ{{cog|ga|ól}}, {{cog|it|poculo}} และ{{cog|gmy|patera||𐃧}}
=== การออกเสียง ===
* {{hi-IPA}}
=== คำนาม ===
{{hi-noun|m}}
# [[ถ้วย]], [[ภาชนะ]][[ใส่]][[น้ำ]]
# [[นักแสดง]]; [[ตัวละคร]]
==== การผันรูป ====
{{hi-ndecl|<M>}}
==== ลูกคำ ====
* {{l|hi|के पात्र}}
93gdwil254m4dx2leziifaz497xbjv4
धूलि
0
7943
5770980
1507160
2026-09-30T03:04:09Z
~2026-52673-48
19634
5770980
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== คำนาม ===
{{sa-noun|g=f}}
# [[ธุลี]]
{{sa-decl-noun-f}}
b3qp9rwsr6jrkgqzlv6ui71kmi7fckd
रोटी
0
14084
5770983
5684987
2026-09-30T03:10:41Z
~2026-52673-48
19634
5770983
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== รากศัพท์ ===
ยืมกลับจาก{{bor|sa|hi|रोटी}}
=== การออกเสียง ===
* {{sa-IPA}}
=== คำนาม ===
{{sa-noun|g=f}}
# {{alternative spelling of|sa|रोटिका||ขนมปัง}}
{{sa-decl-noun-f}}
=== อ้างอิง ===
* {{R:MW|889}}
== ภาษาฮินดี ==
{{wikipedia|lang=hi}}
[[ไฟล์:Chapati.jpg|thumb|{{lang|hi|रोटी}}]]
=== รากศัพท์ ===
{{inh+|hi|psu}}, จาก{{inh|hi|sa|रोटिका}}
=== การออกเสียง ===
* {{hi-IPA}}
=== คำนาม ===
{{hi-noun|f|ur=روٹی}}
# [[โรตี]] (ขนมปังแบน)
#: {{hypo|hi|चपाती|नान}}
==== การผันรูป ====
{{hi-ndecl|<F>}}
==== คำสืบทอด ====
* {{desc|afb|bor=1|روتي|tr=rōti}}
* {{desc|bor=1|ps|روټۍ}}
{{topics|hi|อาหาร}}
ifer0vc71ho6u48r5k0cqhpu8dn41jj
5770984
5770983
2026-09-30T03:12:07Z
~2026-52673-48
19634
5770984
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== รากศัพท์ ===
ยืมกลับจาก{{bor|sa|hi|रोटी}}, จาก{{der|sa|psu}}, จาก{{der|sa|sa|रोटिका}}
=== การออกเสียง ===
* {{sa-IPA}}
=== คำนาม ===
{{sa-noun|g=f}}
# {{alternative spelling of|sa|रोटिका||ขนมปัง}}
{{sa-decl-noun-f}}
=== อ้างอิง ===
* {{R:MW|889}}
== ภาษาฮินดี ==
{{wikipedia|lang=hi}}
[[ไฟล์:Chapati.jpg|thumb|{{lang|hi|रोटी}}]]
=== รากศัพท์ ===
{{inh+|hi|psu}}, จาก{{inh|hi|sa|रोटिका}}
=== การออกเสียง ===
* {{hi-IPA}}
=== คำนาม ===
{{hi-noun|f|ur=روٹی}}
# [[โรตี]] (ขนมปังแบน)
#: {{hypo|hi|चपाती|नान}}
==== การผันรูป ====
{{hi-ndecl|<F>}}
==== คำสืบทอด ====
* {{desc|afb|bor=1|روتي|tr=rōti}}
* {{desc|bor=1|ps|روټۍ}}
{{topics|hi|อาหาร}}
cg3lkoi1w3en7i7h9pg3nk4n1nvveh6
5770991
5770984
2026-09-30T07:54:00Z
Octahedron80
267
/* รากศัพท์ */
5770991
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== รากศัพท์ ===
ยืมกลับจาก{{bor|sa|hi|रोटी}}, จาก{{der|sa|psu}}, จาก{{der|sa|sa|रोटिका}}
=== การออกเสียง ===
* {{sa-IPA}}
=== คำนาม ===
{{sa-noun|g=f}}
# {{alternative spelling of|sa|रोटिका||ขนมปัง}}
{{sa-decl-noun-f}}
=== อ้างอิง ===
* {{R:MW|889}}
== ภาษาฮินดี ==
{{wikipedia|lang=hi}}
[[ไฟล์:Chapati.jpg|thumb|{{lang|hi|रोटी}}]]
=== รากศัพท์ ===
{{inh+|hi|pra-sau|रोट्ट-}}, จาก{{inh|hi|sa|रोटिका}}
=== การออกเสียง ===
* {{hi-IPA}}
=== คำนาม ===
{{hi-noun|f|ur=روٹی}}
# [[โรตี]] (ขนมปังแบน)
#: {{hypo|hi|चपाती|नान}}
==== การผันรูป ====
{{hi-ndecl|<F>}}
==== คำสืบทอด ====
* {{desc|afb|bor=1|روتي|tr=rōti}}
* {{desc|bor=1|ps|روټۍ}}
{{topics|hi|อาหาร}}
044xgeqxsow7e5h23dap8nqmts7qbdx
5770992
5770991
2026-09-30T07:54:52Z
Octahedron80
267
/* รากศัพท์ */
5770992
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== รากศัพท์ ===
ยืมกลับจาก{{bor|sa|hi|रोटी}}; {{doublet|sa|रोटिका}}
=== การออกเสียง ===
* {{sa-IPA}}
=== คำนาม ===
{{sa-noun|g=f}}
# {{alternative spelling of|sa|रोटिका||ขนมปัง}}
{{sa-decl-noun-f}}
=== อ้างอิง ===
* {{R:MW|889}}
== ภาษาฮินดี ==
{{wikipedia|lang=hi}}
[[ไฟล์:Chapati.jpg|thumb|{{lang|hi|रोटी}}]]
=== รากศัพท์ ===
{{inh+|hi|pra-sau|रोट्ट-}}, จาก{{inh|hi|sa|रोटिका}}
=== การออกเสียง ===
* {{hi-IPA}}
=== คำนาม ===
{{hi-noun|f|ur=روٹی}}
# [[โรตี]] (ขนมปังแบน)
#: {{hypo|hi|चपाती|नान}}
==== การผันรูป ====
{{hi-ndecl|<F>}}
==== คำสืบทอด ====
* {{desc|afb|bor=1|روتي|tr=rōti}}
* {{desc|bor=1|ps|روټۍ}}
{{topics|hi|อาหาร}}
0735gxle56qw8two4q7i0uy4p0h0sso
ꪹꪊ꫁ꪱ
0
21126
5770987
1639550
2026-09-30T03:51:02Z
Ai Ku Karng
17824
/* คำสรรพนาม */
5770987
wikitext
text/x-wiki
== ภาษาไทดำ ==
=== รูปแบบอื่น ===
* {{l|blt|ꪹꪊꪱꫂ}}
=== รากศัพท์ ===
{{bor+|blt|ltc|-}} {{ltc-l|主}}; ร่วมเชื้อสายกับ{{cog|th|เจ้า}}, {{cog|lo|ເຈົ້າ}}, {{cog|khb|ᦈᧁᧉ}}, {{cog|shn|ၸဝ်ႈ}}, {{cog|aho|𑜋𑜈𑜫}} หรือ {{m|aho|𑜋𑜨𑜧}}
=== การออกเสียง ===
{{blt-pron}}
=== คำนาม ===
{{blt-noun}}
# [[เจ้า]] (ผู้เป็นใหญ่)
=== คำสรรพนาม ===
{{blt-pronoun}}
# [[เจ้า]] (ท่าน)
# [[ตัวเอง]]
7una4xdl7y7lqne893qhzsqjodj6pcs
ญ่าง
0
22051
5770994
5629327
2026-09-30T09:52:28Z
Thai-Northeastern
17169
/* ภาษาญ้อ */
5770994
wikitext
text/x-wiki
{{also/auto}}
== ภาษาไทย ==
=== การออกเสียง ===
{{th-pron|ย่าง}}
=== คำนาม ===
{{th-noun form}}
# {{obsolete form of|th|ย่าง}}
== ภาษาญ้อ ==
=== การออกเสียง ===
* {{IPA|tts|/ɲaːŋ/|a=สว่างแดนดิน}}
=== คำกริยา ===
{{tts-verb}}
# [[เดิน]]
== ภาษาอีสาน ==
=== รูปแบบอื่น ===
* {{alt|tts|ย่าง}}
=== รากศัพท์ ===
{{inh+|tts|tai-swe-pro|*jaːŋᴮ²}}; ร่วมเชื้อสายกับ{{cog|th|ย่าง}}, {{cog|lo|ຍ່າງ}}, {{cog|khb|ᦍᦱᧂᧈ}}, {{cog|blt|ꪑ꪿ꪱꪉ}}, {{cog|shn|ယၢင်ႈ}}, {{cog|tdd|ᥕᥣᥒ}}
=== การออกเสียง ===
* {{IPA|tts|/ɲaːŋ˨˨/|a=ขอนแก่น}}
* {{คำอ่านไทย|ญาง<sup>ต่ำ-ระดับ</sup>}} (ประมาณ)
=== คำกริยา ===
{{tts-verb}}
# [[เดิน]]
t0p0a0900sghwdt8dpn7vum5yxz985p
5770995
5770994
2026-09-30T09:53:04Z
Thai-Northeastern
17169
5770995
wikitext
text/x-wiki
{{also/auto}}
== ภาษาไทย ==
=== การออกเสียง ===
{{th-pron|ย่าง}}
=== คำนาม ===
{{th-noun form}}
# {{obsolete form of|th|ย่าง}}
== ภาษาญ้อ ==
=== การออกเสียง ===
* {{IPA|nyw |/ɲaːŋ˥˨/|a=สว่างแดนดิน}}
=== คำกริยา ===
{{tts-verb}}
# [[เดิน]]
== ภาษาอีสาน ==
=== รูปแบบอื่น ===
* {{alt|tts|ย่าง}}
=== รากศัพท์ ===
{{inh+|tts|tai-swe-pro|*jaːŋᴮ²}}; ร่วมเชื้อสายกับ{{cog|th|ย่าง}}, {{cog|lo|ຍ່າງ}}, {{cog|khb|ᦍᦱᧂᧈ}}, {{cog|blt|ꪑ꪿ꪱꪉ}}, {{cog|shn|ယၢင်ႈ}}, {{cog|tdd|ᥕᥣᥒ}}
=== การออกเสียง ===
* {{IPA|tts|/ɲaːŋ˨˨/|a=ขอนแก่น}}
* {{คำอ่านไทย|ญาง<sup>ต่ำ-ระดับ</sup>}} (ประมาณ)
=== คำกริยา ===
{{tts-verb}}
# [[เดิน]]
ckxb7huctcl83t6bfemmh3r82vlv4f6
5770996
5770995
2026-09-30T09:53:18Z
Thai-Northeastern
17169
5770996
wikitext
text/x-wiki
{{also/auto}}
== ภาษาไทย ==
=== การออกเสียง ===
{{th-pron|ย่าง}}
=== คำนาม ===
{{th-noun form}}
# {{obsolete form of|th|ย่าง}}
== ภาษาญ้อ ==
=== การออกเสียง ===
* {{IPA|nyw |/ɲaːŋ˥˨/|a=สว่างแดนดิน}}
=== คำกริยา ===
{{nyw -verb}}
# [[เดิน]]
== ภาษาอีสาน ==
=== รูปแบบอื่น ===
* {{alt|tts|ย่าง}}
=== รากศัพท์ ===
{{inh+|tts|tai-swe-pro|*jaːŋᴮ²}}; ร่วมเชื้อสายกับ{{cog|th|ย่าง}}, {{cog|lo|ຍ່າງ}}, {{cog|khb|ᦍᦱᧂᧈ}}, {{cog|blt|ꪑ꪿ꪱꪉ}}, {{cog|shn|ယၢင်ႈ}}, {{cog|tdd|ᥕᥣᥒ}}
=== การออกเสียง ===
* {{IPA|tts|/ɲaːŋ˨˨/|a=ขอนแก่น}}
* {{คำอ่านไทย|ญาง<sup>ต่ำ-ระดับ</sup>}} (ประมาณ)
=== คำกริยา ===
{{tts-verb}}
# [[เดิน]]
sz9a6u5p19v362bcek4f4zdonefa08f
5770997
5770996
2026-09-30T09:53:59Z
Thai-Northeastern
17169
5770997
wikitext
text/x-wiki
{{also/auto}}
== ภาษาไทย ==
=== การออกเสียง ===
{{th-pron|ย่าง}}
=== คำนาม ===
{{th-noun form}}
# {{obsolete form of|th|ย่าง}}
== ภาษาญ้อ ==
=== การออกเสียง ===
* {{IPA|nyw |/ɲaːŋ˥˨/|a=สว่างแดนดิน}}
=== คำกริยา ===
{{nyw-verb}}
# [[เดิน]]
== ภาษาอีสาน ==
=== รูปแบบอื่น ===
* {{alt|tts|ย่าง}}
=== รากศัพท์ ===
{{inh+|tts|tai-swe-pro|*jaːŋᴮ²}}; ร่วมเชื้อสายกับ{{cog|th|ย่าง}}, {{cog|lo|ຍ່າງ}}, {{cog|khb|ᦍᦱᧂᧈ}}, {{cog|blt|ꪑ꪿ꪱꪉ}}, {{cog|shn|ယၢင်ႈ}}, {{cog|tdd|ᥕᥣᥒ}}
=== การออกเสียง ===
* {{IPA|tts|/ɲaːŋ˨˨/|a=ขอนแก่น}}
* {{คำอ่านไทย|ญาง<sup>ต่ำ-ระดับ</sup>}} (ประมาณ)
=== คำกริยา ===
{{tts-verb}}
# [[เดิน]]
285z853f4r2t94bkcc8pp3jzzszzqg3
กล้วย
0
23726
5770970
5721801
2026-09-29T17:07:51Z
Jamnanja
16523
/* คำพ้องความ */
5770970
wikitext
text/x-wiki
== ภาษาไทย ==
{{วิกิพีเดีย}}
=== รากศัพท์ ===
{{inh+|th|tai-pro|*kluəjꟲ}}; ร่วมเชื้อสายกับ{{cog|nod|ᨠᩖ᩠ᩅ᩠᩶ᨿ,ᨠ᩠ᩃ᩠ᩅ᩠᩶ᨿ}}, {{cog|lo|ກ້ວຍ}}, {{cog|khb|ᦂᦽᧉ}}, {{cog|blt|ꪀ꫁ꪺꪥ}}, {{cog|twh|ꪀꪺꪥꫂ}}, {{cog|shn|ၵူၺ်ႈ}}, {{cog|aho|𑜀𑜤𑜐𑜫}}, {{cog|pcc|joic}}, {{cog|za|gyoij}}
ความหมาย 5-6 ใช้แทนคำว่า {{m|th|ควย}} ซึ่งออกเสียงคล้ายกัน
=== การออกเสียง ===
{{th-pron|กฺล้วย}}
=== คำนาม ===
[[ไฟล์:Luxor, Banana Island, Banana Tree, Egypt, Oct 2004.jpg|thumb|right|150px|(1) กล้วย]]
[[ไฟล์:Bananas.jpg|thumb|right|150px|(2) กล้วย]]
{{th-noun}}
# [[ชื่อ]][[ไม้ล้มลุก]][[หลาย]][[ชนิด]][[ใน]][[สกุล]] ''Musa'' [[วงศ์]] Musaceae [[จัด]][[แยก]][[ออก]][[ได้]][[เป็น]] 2 [[จำพวก]] จำพวก[[ที่]][[แตกหน่อ]]เป็น[[กอ]] [[ผล]][[สุก]][[เนื้อ]][[นุ่ม]] [[กิน]]ได้ [[มี]]หลายชนิด[[และ]]หลาย[[พันธุ์]] [[เช่น]] [[กล้วยน้ำว้า]] [[กล้วยไข่]] [[กล้วยหอม]] [[บาง]]ชนิดผลสุกเนื้อ[[แข็ง]] [[มัก]][[เผา]] [[ต้ม]] [[หรือ]][[เชื่อม]]กิน เช่น [[กล้วยกล้าย]] [[กล้วยหักมุก]], จำพวกที่[[ไม่]]แตกหน่อเป็นกอ [[ขยาย]]พันธุ์[[ด้วย]][[เมล็ด]] [[ใบประดับ]]ไม่[[ร่วง]] เช่น [[กล้วยนวล]] [[กล้วยผา]]
# ผล[[ของ]][[ต้น]]กล้วย (ความหมาย 1)
# {{lang|th|([[ปลา]]~)}} {{synonym of|th|รากกล้วย}}
# {{lang|th|(ปลา~)}} {{synonym of|th|ไส้ตัน}}
# {{lb|th|ปาก|สแลง}} [[อวัยวะเพศชาย]]
#: {{ux|th|ผู้ชายเอกวาดอร์ครองแชมป์'''กล้วย'''ยาวที่สุดในโลก}}
# {{lb|th|ปาก|สแลง}} [[การชู]][[นิ้วกลาง]] {{gl|ท่าทางแสดงความดูหมิ่น}}
#: {{ux|th|แจก'''กล้วย'''กลางถนน แท๊กซี่ไล่ฟันเดือด}}
#: {{ux|th|ให้'''กล้วย'''เป็นเหตุ! ยิงอริดับต่อหน้าลูก}}
# {{lb|th|ปาก|สแลง}} [[เงิน]]หรือ[[ผลประโยชน์]]ที่[[เอา]][[ไว้]][[ซื้อใจ]] (นักการเมือง)<ref>https://themomentum.co/wordodyssey-fruitidioms/</ref>
#: {{ux|th|ป.ป.ช. ขยับสอบปมไลน์หลุด “แจก'''กล้วย'''” ส.ส. พรรคเล็กเดือนละแสน}}
==== คำพ้องความ ====
* (1)(2) {{l|th|กทลี}}, [[รัมภา]]
==== ลูกคำ ====
{{col4|th
|กล้วย ๆ
|กล้วยไข่
|กล้วยตาก
|กล้วยน้ำว้า
|กล้วยบวชชี
|กล้วยไม้
|ปลีกล้วย
|หมึกกล้วย
|หยวกกล้วย
}}
==== คำแปลภาษาอื่น ====
{{trans-top|(1, 2)}}
* กรีก: {{t+|el|μπανάνα|f}}
* กะเหรี่ยง:
*: สะกอ: {{t|ksw|သကွံ}}
* เกาหลี: {{t+|ko|바나나}}
* เขมร: {{t+|km|ចេក}}
* เขมรเหนือ: {{t|kxm|เจจ}}
* คุชราต: {{t|gu|કેળું|n}}
* คำเมือง: {{t|nod|ᨠᩖ᩠ᩅ᩠᩶ᨿ}}
* จ้วง: {{t|za|gyoij}}, {{t|za|gyoijhom}}
* จอร์เจีย: {{t|ka|ბანანი}}
* จีน:
*: กวางตุ้ง: {{t+|yue|香蕉}}, {{t|yue|蕉}}
*: ดุงกาน: {{t|dng|щёнҗё}}, {{t|dng|баҗё}}
*: หมิ่นตะวันออก: {{t|cdo|芭蕉}}
*: กั้น: {{t|gan|香蕉}}
*: แคะ: {{t|hak|弓蕉|tr=kiûng-chêu}}
*: หมิ่นใต้: {{t|nan-hbl|弓蕉//芎蕉|tr=keng-chio, kin-chio, geng-chio}}, {{t|nan-hbl|金蕉|tr=kim-tsio}}
*: จิ้น: {{t|cjy|香蕉}}
*: จีนกลาง: {{t+|cmn|香蕉}}
*: อู๋: {{t|wuu|香蕉}}
*: เซียง: {{t|hsn|香蕉}}
* ซูลู: {{t+|zu|ubhanana|c1a|c2a}}
* เซอร์โบ-โครเอเชีย:
*: ซิริลลิก: {{t|sh|бана́на|f}}
*: ละติน: {{t+|sh|banána|f}}
* ญ้อ: {{t|nyw|ก้วย}}
* ญัฮกุร: {{t|cbn|พราด่}}, {{t|cbn|พราด}}
* ญี่ปุ่น: {{t+|ja|バナナ|tr=banana}}, {{t+|ja|甘蕉|tr=かんしょう, kanshō}}
* ตากาล็อก: {{t+|tl|saging}}, {{t|tl|alinsanay}}
* ตุรกี: {{t+|tr|muz}}
* ทมิฬ: {{t+|ta|வாழைப்பழம்}}, {{t+|ta|வாழை}}
* ทิเบต: {{t|bo|ཀེ་ར}}, {{t|bo|ཀེ་ལ}}, {{t|bo|ངང་ལག}}
* ไทขาว: {{t|twh|ꪀꪺꪥꫂ}}
* ไทดำ: {{t|blt|ꪀ꫁ꪺꪥ}}
* ไทลื้อ: {{t|khb|ᦂᦽᧉ}}
* ไทใหญ่: {{t+|shn|ၵူၺ်ႈ}}
* นอร์เวย์:
*: บุ๊กมอล: {{t+|nb|banan|m}}
* เนปาล: {{t+|ne|केरा}}
* บัลแกเรีย: {{t|bg|бана́н|m}}
* เบลารุส: {{t|be|бана́н|m}}
* ปัญจาบ: {{t+|pa|ਕੇਲਾ|m}}
* เปอร์เซีย: {{t+|fa|مُوْز}}, {{t+|fa|بَنان}}
* ฝรั่งเศส: {{t+|fr|banane|f|tr=บานาน}}
* พม่า: {{t|my|ငှက်ပျောသီး}}
* ฟินแลนด์: {{t+|fi|banaani}}
* มลายูแบบปัตตานี: {{t|mfa|ڤيسٍي}}
* มอญ: {{t|mnw|ဗြာတ်}}
* มาซิโดเนีย: {{t+|mk|бана́на|f}}
* มาเลเซีย: {{t+|ms|pisang}}, {{t|ms|mauz}}
* ยูเครน: {{t+|uk|бана́н|m}}
* เยอรมัน: {{t+|de|Banane|f}}
* รัสเซีย: {{t+|ru|бана́н|m}}
* โรมาเนีย: {{t+|ro|banană|f}}
* ลาว: {{t+|lo|ກ້ວຍ}}
* ลิทัวเนีย: {{t+|lt|bananas|m}}
* เลอเวือะตะวันออก: {{t|lwl|อมอ-อีฮ}}
* เวียดนาม: {{t|vi|([[trái]]) [[chuối]]}}, {{t|vi|([[quả]]) [[chuối]]}}
* โวลาปุก: {{t+|vo|benen}}
* เศรปา: {{t|xsr|ཀེ་ར}}
* สเปน: {{t+|es|banana|f}}, {{t+|es|plátano|m}}
* สวีเดน: {{t+|sv|banan}}
* สันสกฤต: {{t+|sa|कदली|f}}
* แสก: {{t|skb|หลุ้ง}}
* อะตง: {{t|aot|rek}}, {{t|aot|rekthai}}
* อังกฤษ: {{t+|en|banana|tr=บะแนนะ}}
* อาเจะฮ์: {{t|ace|pisang}}
* อาร์มีเนีย: {{t+|hy|բանան}}, {{t+|hy|ադամաթուզ}}
* อาหม: {{t|aho|𑜀𑜤𑜐𑜫}}
* อาหรับ: {{t|ar|مَوْزَة|f}}, {{t|ar|مَوْز|m}}
* อิตาลี : {{t+|it|banana|f}}
* อินโดนีเซีย: {{t+|id|pisang}}
* อีสาน: {{t|tts|ก้วย}}
* อูรักลาโวยจ: {{t|urk|ปีซัก}}
* เอสเปรันโต: {{t+|eo|banano}}
* ฮังการี: {{t+|hu|banán}}
* ฮินดี: {{t+|hi|केला|m}}
* ฮีบรู: {{t+|he|בָּנָנָה|f}}
{{trans-bottom}}
=== คำคุณศัพท์ ===
{{th-adj|-}}
# {{lb|th|ปาก}} [[ง่าย]][[มาก]]
#: {{ux|th|เรื่องนี้'''กล้วย'''มากสำหรับผม}}
==== คำพ้องความ ====
* [[กล้วย ๆ]]
=== อ้างอิง ===
{{รายการอ้างอิง}}
{{topics|th|พืช|ผลไม้|ปลา|มอลลัสก์}}
7g7crdfjqlngl8og3f94i82mrtovjp7
ผาล
0
24136
5770969
1492942
2026-09-29T16:46:48Z
Jamnanja
16523
/* การออกเสียง */
5770969
wikitext
text/x-wiki
==ภาษาไทย==
===การออกเสียง===
{{th-pron|ผาน}}
=== คำนาม ===
{{th-noun}}
# [[เครื่องมือ]][[เหล็ก]]สำหรับสวม[[หัวหมู]][[เครื่องไถ]] เพื่อเจาะ[[พลิก]][[หน้าดิน]]
deh63a360tcexo746bh6tx1c645manp
ขัว
0
30806
5770998
5734860
2026-09-30T10:00:18Z
Thai-Northeastern
17169
5770998
wikitext
text/x-wiki
{{also/auto}}
== ภาษาไทย ==
=== รากศัพท์ ===
ร่วมเชื้อสายกับ{{cog|tts|ขัว}}, {{cog|lo|ຂົວ}}, {{cog|nod|ᨡ᩠ᩅᩫ}}, {{cog|kkh|ᨡ᩠ᩅᩫ}}, {{cog|khb|ᦷᦃ}}, {{cog|blt|ꪄꪺ}}, {{cog|shn|ၶူဝ်}}, {{cog|tdd|ᥑᥨᥝᥴ}}, {{cog|aho|𑜁𑜤𑜈𑜫}}, {{cog|zzj|kue|tr=ขัว, สะพานไม้}}
=== การออกเสียง ===
{{th-pron}}
=== คำนาม ===
{{th-noun}}
# {{lb|th|กลอน}} [[สะพาน]]
== ภาษาคำเมือง ==
=== การออกเสียง ===
* {{IPA|nod|/xua˨˦/|a=เชียงใหม่}}
=== คำนาม ===
{{nod-noun}}
# {{alternative form of|nod|ᨡ᩠ᩅᩫ}}
== ภาษาญ้อ ==
=== การออกเสียง ===
* {{IPA|nyw|/kʰua˨˩˧|a=สว่างแดนดิน}}
=== คำนาม ===
{{nyw-noun}}
# [[สะพาน]]
== ภาษาอีสาน ==
=== คำนาม ===
{{tts-noun}}
# สะพาน
=== คำกริยา ===
{{tts-verb}}
# [[ขุด]][[ดิน]][[อย่าง]][[ตื้น]]
==== ดูเพิ่ม ====
* {{l|tts|ก่น}}
00fcmqta0yrpxpyirugpacjdlql1fjp
5770999
5770998
2026-09-30T10:00:37Z
Thai-Northeastern
17169
5770999
wikitext
text/x-wiki
{{also/auto}}
== ภาษาไทย ==
=== รากศัพท์ ===
ร่วมเชื้อสายกับ{{cog|tts|ขัว}}, {{cog|lo|ຂົວ}}, {{cog|nod|ᨡ᩠ᩅᩫ}}, {{cog|kkh|ᨡ᩠ᩅᩫ}}, {{cog|khb|ᦷᦃ}}, {{cog|blt|ꪄꪺ}}, {{cog|shn|ၶူဝ်}}, {{cog|tdd|ᥑᥨᥝᥴ}}, {{cog|aho|𑜁𑜤𑜈𑜫}}, {{cog|zzj|kue|tr=ขัว, สะพานไม้}}
=== การออกเสียง ===
{{th-pron}}
=== คำนาม ===
{{th-noun}}
# {{lb|th|กลอน}} [[สะพาน]]
== ภาษาคำเมือง ==
=== การออกเสียง ===
* {{IPA|nod|/xua˨˦/|a=เชียงใหม่}}
=== คำนาม ===
{{nod-noun}}
# {{alternative form of|nod|ᨡ᩠ᩅᩫ}}
== ภาษาญ้อ ==
=== การออกเสียง ===
* {{IPA|nyw|/kʰua˨˩˧|a=สว่างแดนดิน}}
=== คำนาม ===
{{nyw-noun}}
# [[สะพาน]]
== ภาษาอีสาน ==
=== คำนาม ===
{{tts-noun}}
# สะพาน
=== คำกริยา ===
{{tts-verb}}
# [[ขุด]][[ดิน]][[อย่าง]][[ตื้น]]
==== ดูเพิ่ม ====
* {{l|tts|ก่น}}
s24tdik7k3p5fam64sa2mfw1ff7e1v8
5771000
5770999
2026-09-30T10:01:01Z
Thai-Northeastern
17169
5771000
wikitext
text/x-wiki
{{also/auto}}
== ภาษาไทย ==
=== รากศัพท์ ===
ร่วมเชื้อสายกับ{{cog|tts|ขัว}}, {{cog|lo|ຂົວ}}, {{cog|nod|ᨡ᩠ᩅᩫ}}, {{cog|kkh|ᨡ᩠ᩅᩫ}}, {{cog|khb|ᦷᦃ}}, {{cog|blt|ꪄꪺ}}, {{cog|shn|ၶူဝ်}}, {{cog|tdd|ᥑᥨᥝᥴ}}, {{cog|aho|𑜁𑜤𑜈𑜫}}, {{cog|zzj|kue|tr=ขัว, สะพานไม้}}
=== การออกเสียง ===
{{th-pron}}
=== คำนาม ===
{{th-noun}}
# {{lb|th|กลอน}} [[สะพาน]]
== ภาษาคำเมือง ==
=== การออกเสียง ===
* {{IPA|nod|/xua˨˦/|a=เชียงใหม่}}
=== คำนาม ===
{{nod-noun}}
# {{alternative form of|nod|ᨡ᩠ᩅᩫ}}
== ภาษาญ้อ ==
=== การออกเสียง ===
* {{IPA|nyw|/kʰua˨˩˧/|a=สว่างแดนดิน}}
=== คำนาม ===
{{nyw-noun}}
# [[สะพาน]]
== ภาษาอีสาน ==
=== คำนาม ===
{{tts-noun}}
# สะพาน
=== คำกริยา ===
{{tts-verb}}
# [[ขุด]][[ดิน]][[อย่าง]][[ตื้น]]
==== ดูเพิ่ม ====
* {{l|tts|ก่น}}
g9q5ge4ecbzuoes9fj91rchba2z4sv8
𡧳
0
63936
5770972
1794417
2026-09-30T00:19:52Z
PhantomFunds
19633
5770972
wikitext
text/x-wiki
{{character info|image=新加坡的「賽」簡體.svg}}
== ภาษาร่วม ==
=== อักษรจีน ===
{{Han char|rn=40|rad=宀|as=6|sn=9|four=|canj=JMCW|ids=⿱宀西}}
==== อ้างอิง ====
* {{Han ref|kx=0285.101|dkj=|dj=|hdz=|uh=219F3}}
== ภาษาจีน ==
{{zh-see|賽|sgs}}
eniuleytpdoh5jgv0sz1fqh83cshnh2
काष्ठ
0
139509
5770978
1871732
2026-09-30T02:59:57Z
~2026-52673-48
19634
5770978
wikitext
text/x-wiki
== ภาษาสันสกฤต ==
=== รากศัพท์ ===
{{unknown|sa}}
=== การออกเสียง ===
{{sa-IPA}}
=== คำนาม ===
{{sa-noun|g=n}}
# [[ไม้]], [[ซุง]]
# [[ไม้ฟืน]]
# [[เครื่องมือ]][[สำหรับ]][[วัด]][[ระยะ]]
{{sa-decl-noun-n}}
==== คำสืบทอด ====
* {{desc|th|กาฐ}}
* {{desc|rmq|caté}}
** {{desc|es|cate}}
1ipvlve96r23r8ixr1zxseyg5peeu5p
ਕੁੰਜੀ
0
152614
5770985
1276395
2026-09-30T03:17:28Z
~2026-52673-48
19634
5770985
wikitext
text/x-wiki
== ภาษาปัญจาบ ==
=== คำนาม ===
{{pa-noun|f|sha=کُنجی}}
# [[กุญแจ]]
{{pa-ndecl|t=f-ī*}}
qil85c66kc68vsu2srlyprq5aj2njlq
5770993
5770985
2026-09-30T07:56:04Z
Octahedron80
267
/* ภาษาปัญจาบ */ เก็บกวาด
5770993
wikitext
text/x-wiki
== ภาษาปัญจาบ ==
=== รากศัพท์ ===
{{etymon|pa|id=key|:inh|inc-opa:ਕੁੰਜੀ<ety:inh<pra:𑀓𑀼𑀁𑀘𑀺𑀬𑀸<id:key>>><ref:{{R:inc-opa:Glossary||84}}>|tree=1|text=:sa}}<ref> {{R:CDIAL|kuñcikā|3225|pg=165}}</ref>
=== การออกเสียง ===
* {{pa-IPA}}
=== คำนาม ===
{{pa-noun|f|sha=کُنجی}}
# [[ลูกกุญแจ]]
==== การผันรูป ====
{{pa-ndecl|t=f-ī*}}
==== ลูกคำ ====
* {{l|pa|ਕੁੰਜੀਦਾਰ|pos=a|t=key-operated}}
==== คำสืบทอด ====
* {{desc|bn|কুঞ্জি|bor=1}}
* {{desc|inc-hnd|bor=1}} {{see desc}}
*: {{desc|hi|कुंजी}}
*: {{desc|ur|کُن٘جی}}
* {{desc|mai|कुंजि|bor=1}}
* {{desc|mr|कुंजी|bor=1}}
* {{desc|ne|कुंजि|bor=1}}
* {{desc|him||bor=1|ts=kõj̈i}}
=== อ้างอิง ===
{{reflist}}
=== อ่านเพิ่ม ===
{{box-top}}
* {{R:pa:Singh}}
* {{R:pa:Mahan Kosh}}
* {{R:pa:Punjabi University}}
{{box-bottom}}
cs566wxlovltjiy6wv8rk2fjhqt04df
माला
0
170567
5770982
1564741
2026-09-30T03:09:28Z
~2026-52673-48
19634
5770982
wikitext
text/x-wiki
== ภาษาบาลี ==
=== คำนาม ===
{{pi-noun|f}}
# {{pi-sc||มาลา}}
==== การผันรูป ====
{{pi-decl-noun|g=f}}
== ภาษาสันสกฤต ==
=== คำนาม ===
{{sa-noun|g=f}}
# [[พวงมาลัย]], [[พวงหรีด]], [[มงกุฎ]]
# [[ลูกประคำ]]
{{sa-decl-noun-f}}
qrvc2jnzk4hrhdcxvmr768hg7qpcojq
เญ̂อ
0
170835
5770988
1388282
2026-09-30T03:57:23Z
Ai Ku Karng
17824
/* ภาษาแสก */
5770988
wikitext
text/x-wiki
== ภาษาแสก ==
=== การออกเสียง ===
* {{IPA|skb|/ɲɤː³/|[ɲɤː˧˩ˀ]|a=บ้านบะหว้า}}
=== คำกริยา ===
{{skb-verb}}
# [[จำ]]
7cmdidzwc4cgqt29w6ntyj80vgm7wv4
ฟ้า
0
211938
5770968
5760802
2026-09-29T13:40:42Z
Ai Ku Karng
17824
/* ภาษาไทย */
5770968
wikitext
text/x-wiki
{{also/auto}}
== ภาษาไทย ==
{{wp|ท้องฟ้า}}
{{wp|สีฟ้า}}
[[File:Sky over Munich 02.jpg|thumb|ท้องฟ้า]]
[[File:Shades of light blue.png|thumb|สีฟ้า]]
=== รูปแบบอื่น ===
* {{alt|th|ฝ้า||เลิกใช้}}
=== รากศัพท์ ===
{{inh+|th|th-ayu|*faːꟲ⁴}} (Pittayaporn, 2016), จาก{{inh|th|tai-swe-pro|*vaːꟲ⁴}}, จาก{{inh|th|tai-pro|*vaːꟲ}}; ร่วมเชื้อสายกับ{{cog|tts|ฟ้า}}, {{cog|lo|ຟ້າ}}, {{cog|nod|ᨼ᩶ᩣ}}, {{cog|kkh|ᨼ᩶ᩣ}}, {{cog|khb|ᦝᦱᧉ}}, {{cog|blt|ꪡ꫁ꪱ}}, {{cog|twh|ꪡꪱꫂ}}, {{cog|shn|ၽႃႉ}} หรือ {{m|shn|ၾႃႉ}}, {{cog|tdd|ᥜᥣᥳ}}, {{cog|kht|ၸႃႇ}}, {{cog|phk|ၸႃ}}, {{cog|aho|𑜇𑜠}}, {{m|aho|𑜇𑜡}}, {{m|aho|𑜇𑜨𑜠}}, {{m|aho|𑜇𑜨𑜡}} หรือ {{m|aho|𑜇𑜞𑜠}}, {{cog|za|fax}}; เทียบ{{cog|qfa-lic-pro|*fʰaːʔ}}
=== การออกเสียง ===
{{th-pron}}
=== คำนาม ===
{{th-noun}}
# ({{lang|th|[[ท้อง]]~}}) [[ส่วน]][[เบื้อง]][[บน]][[ที่]][[มอง]][[เห็น]][[ครอบ]][[แผ่นดิน]][[อยู่]]
#: {{ux|th|ดาวเต็มฟ้า}}
# ({{lang|th|[[ท้อง]]~}}) [[อากาศ]]เบื้องบน
#: {{ux|th|ฟ้าครึ้ม}}
#: {{ux|th|ยิงปืนขึ้นฟ้า}}
# [[สวรรค์]]
#: {{ux|th|นางฟ้า}}
#: {{ux|th|ฟ้าดินเป็นพยาน}}
# [[เจ้าฟ้า]]
==== คำเกี่ยวข้อง ====
{{col4|th||ฟ้าคะนอง|ฟ้าผ่า|ฟ้าร้อง|ฟ้าหลัว|ฟ้าเคืองสันหลัง|ฟ้าแลบ|ฟ้าไม่กระเทือนสันหลัง}}
==== คำแปลภาษาอื่น ====
{{trans-top|ส่วนที่ครอบแผ่นดินอยู่}}
* กรีก: {{t+|el|ουρανός|m}}
* กาตาลา: {{t+|ca|cel|m}}
* กาลิเซีย: {{t+|gl|ceo|m}}
* เกาหลี: {{t+|ko|하늘}}
* เขมร: {{t+|km|មេឃ}}
* คำตี้: {{t|kht|ကၢင်ႈꩭၢဝ်}}
* คำเมือง: {{t+|nod|ᨼ᩶ᩣ}}
* จ้วง: {{t|za|fax}}
* จอร์เจีย: {{t+|ka|ცა}}
* จีน
*: จีนกลาง: {{t+|cmn|天空|tr=tiānkōng}}, {{t+|cmn|天|tr=tiān}}
* เจียเม่า: {{t|jio|vuəj¹}}
* ญัฮกุร: {{t|cbn|ฮึกาซ}}
* ญี่ปุ่น: {{t+|ja|空|tr=そら, sora}}, {{t+|ja|大空|tr=おおぞら, ōzora}}, {{t+|ja|天空|tr=tenkū}}, {{t+|ja|あめ|tr=ame|alt=天}} {{qualifier|old}}
* ดัตช์: {{t+|nl|hemel|m|tr=เฮเมิล}}
* ตากาล็อก: {{t|tl|kalangitan}}, {{t+|tl|langit}}
* ไทดำ: {{t+|blt|ꪡ꫁ꪱ}}
* ไทลื้อ: {{t|khb|ᦝᦱᧉ}}, {{t|khb|}}
* ไทใหญ่: {{t+|shn|ၵၢင်ႁၢဝ်}}, {{t+|shn|ႁၢဝ်}}
* นาโปลี: {{t|nap|cielo|m}}
* เนปาล: {{t+|ne|आकाश}}
* ปัญจาบ: {{t+|pa|ਅਸਮਾਨ}}, {{t+|pa|ਆਕਾਸ਼}}, {{t|pa|ਗਗਨ}}
* เปอร์เซีย: {{t|fa-ira|آسْمان}}, {{t|fa-ira|آسِمان}}, {{t|fa-ira|سِپِهْر}}, {{t|fa-ira|جُو}}
* โปรตุเกส: {{t+|pt|céu|m}}
* ฝรั่งเศส: {{t+|fr|ciel|m|tr=ซีแยล}}
* พม่า: {{t+|my|ကောင်းကင်}}, {{t+|my|မိုး}}
* ฟรีเชียตะวันตก: {{t+|fy|himel|c|tr=ฮีเมิล}}
* ฟินแลนด์: {{t+|fi|taivas}}
* มราฐี: {{t|mr|आकाश}}
* มลายูแบบปัตตานี: {{t|mfa|لاڠيء}}
* มอญ: {{t+|mnw|အမှဲ}}, {{t+|mnw|လကး}}, {{t|mnw|အာကာသ်}}
* มาเลเซีย: {{t+|ms|langit}}
* มิงเกรเลีย: {{t|xmf|ცა}}
* มีรังดา: {{t|mwl|cielo|m}}
* เยอรมัน: {{t+|de|Himmel|m}}
* รัสเซีย: {{t+|ru|не́бо|n}}
* โรมาเนีย: {{t+|ro|cer|n}}
* ละติน: {{t+|la|caelum|n}}
* ลาว: {{t+|lo|ຟ້າ}}
* เลอเวือะ:
*: ตะวันออก: {{t|lwl|มลอง}}
* เวียดนาม: {{t+|vi|trời}}, {{t+|vi|bầu trời}}
* สเปน: {{t+|es|firmamento|m}}, {{t+|es|cielo|m}}
* สันสกฤต: {{t+|sa|दिव}}, {{t+|sa|आकाश}}
* อังกฤษ: {{t+|en|sky|tr=สกาย}}
* อารบิก: {{t|ar|سَمَاء|f}}
* อิตาลี: {{t+|it|cielo|m}}
* อินโดนีเซีย: {{t+|id|langit}}
* อีโด: {{t+|io|cielo}}
* อูรักลาโวยจ: {{t|urk|ลาแงะ}}
* เอสเปรันโต: {{t+|eo|ĉielo}}
* โอริยา: {{t|or|ଆକାଶ}}
* ฮินดี: {{t+|hi|आसमान|m}}, {{t+|hi|आकाश|m}}, {{t+|hi|अम्बर}}, {{t+|hi|गगन}}, {{t+|hi|नभ}}, {{t+|hi|आभ|m}}
{{trans-bottom}}
=== คำคุณศัพท์ ===
{{th-adj}}
# [[สี]][[น้ำเงิน]][[อ่อน]][[อย่าง]]สี[[ท้องฟ้า]][[ใน]][[เวลา]][[มี]][[แดด]] [[เรียก]][[ว่า]] สีฟ้า
#: {{color panel|94C8FD}}
==== คำแปลภาษาอื่น ====
{{trans-top|สีน้ำเงินอ่อนอย่างสีท้องฟ้าในเวลามีแดด}}
* มองโกเลีย: {{t+|mn|цэнхэр}}
* ละติน: {{t+|la|caeruleus}}, {{t|la|caerulus}}
* ลาว: {{t|lo|ຟ້າ}}
* อังกฤษ: {{t+|en|blue}}, {{t+|en|light blue}}, {{t+|en|sky blue}}, {{t+|en|azure}}
* อิตาลี: {{t+|it|azzurro}}
{{trans-bottom}}
==== ดูเพิ่ม ====
{{ตาราง:สี/th}}
== ภาษาคำเมือง ==
=== การออกเสียง ===
* {{IPA|nod|/faː˦˥/|a=เชียงใหม่}}
=== คำนาม ===
{{nod-noun}}
# {{alternative form of|nod|ᨼ᩶ᩣ}}
gndb551pg1527pdlrofs0ly6p27p6ro
ทวิพจน์
0
229568
5770967
5770960
2026-09-29T12:02:47Z
Octahedron80
267
ย้อนรุ่นแก้ไข [[Special:Diff/5770960|5770960]] ของ [[Special:Contributions/~2026-52286-17|~2026-52286-17]] ([[User talk:~2026-52286-17|คุย]])
5770967
wikitext
text/x-wiki
== ภาษาไทย ==
=== รากศัพท์ ===
{{bor+|th|sa|द्विवचन|ทฺวิวจน}} หรือ{{bor|th|pi|ทฺวิวจน}}; {{surf|th|ทวิ|พจน์}}
=== การออกเสียง ===
{{th-pron|ทะ-วิ-พด}}
=== คำนาม ===
{{th-noun}}
# {{lb|th|ไวยากรณ์}} [[คำ]][[ที่]][[กล่าว]][[ถึง]][[สอง]][[สิ่ง]] (ในบางภาษา)
==== คำเกี่ยวข้อง ====
* {{l|th|เอกพจน์}}
* {{l|th|ไตรพจน์}}
* {{l|th|พหูพจน์}}
{{topics|th|สอง}}
p40v5k2en8bfp7oi68cqw8znjdveqic
जम्बु
0
230248
5770977
1564678
2026-09-30T02:58:49Z
~2026-52673-48
19634
5770977
wikitext
text/x-wiki
== ภาษาบาลี ==
=== คำนาม ===
{{pi-noun|f}}
# {{pi-sc||ชมฺพุ}}
==== การผันรูป ====
{{pi-decl-noun|g=f}}
== ภาษาสันสกฤต ==
=== คำนาม 1 ===
{{sa-noun|g=f}}
# [[ชมพู่]] ([[ต้นไม้]])
{{sa-decl-noun-f}}
==== คำพ้องความ ====
* {{l|sa|जम्बुल}}
==== คำสืบทอด ====
* บาลี: {{l|pi|ชมฺพุ}}
** ไทย: {{l|th|ชมพู่}}
* ฮินดี: {{l|hi|जामुन}}
=== คำนาม 2 ===
{{sa-noun|g=n}}
# [[ชมพู่]] ([[ผลไม้]])
{{sa-decl-noun-n}}
{{topics|sa|พืช|ผลไม้}}
sxzz3h5orfwgjcwiwwf2bgp1jwzgk5l
คุยกับผู้ใช้:Octahedron80
3
245286
5770971
5770953
2026-09-29T18:14:02Z
咽頭べさ
11687
5770971
wikitext
text/x-wiki
== การแสดงผลพินอินในแม่แบบตัวอย่าง ==
สวัสดีครับ เพิ่งสังเกตว่า[[แม่แบบ:zh-x]] ของวิกิไทยกับอังกฤษแสดงพินอินไม่เหมือนกัน เช่น 了 หรือ 的 ใน [[找]] ผมเข้าไปดูในโมดูลแล้ว แต่ก็ยังหาต้นตอไม่เจอ พอจะช่วยแก้ให้ตรงกันได้ไหมครับ [[ผู้ใช้:Ponpan|Ponpan]] ([[คุยกับผู้ใช้:Ponpan|คุย]]) 12:03, 19 มีนาคม 2567 (+07)
::ตัวอักษรจีนบางตัวมันอ่านได้มากกว่า 1 แบบ มันจะมีการทำงานที่แยกออกไปต่างหาก --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 12:26, 19 มีนาคม 2567 (+07)
::: ผมคิดว่ามันน่าจะมีโมดูลหลังบ้านสักตัวที่ใช้กำหนดพินอินหลักที่จะแสดงในแม่แบบตัวอย่าง อาจจะเป็นพินอินที่ใช้บ่อยสุดของตัวอักษรจีนนั้น ๆ แต่ผมก็ยังหาไม่เจอ --[[ผู้ใช้:Ponpan|Ponpan]] ([[คุยกับผู้ใช้:Ponpan|คุย]]) 12:39, 19 มีนาคม 2567 (+07)
:::: อยู่ในนี้ [[มอดูล:zh/data/cmn-pron]] ไม่ได้อัปเดตมานานแล้ว น่าจะหายแล้ว --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 12:49, 19 มีนาคม 2567 (+07)
::::: หายแล้วครับ ขอบคุณครับ --[[ผู้ใช้:Ponpan|Ponpan]] ([[คุยกับผู้ใช้:Ponpan|คุย]]) 12:54, 19 มีนาคม 2567 (+07)
==อยากจะขอความช่วยเหลือบางอย่าง==
สวัสดีคุณพี่ {{ping|Octahedron80}} คุณช่วยสอนวิธีใช้งาน bot ได้ไหม ฉันอยากจะขอเรื่องนี้ แล้วฉันเองก็ไม่เช่นเคยใช้งาน แล้วก็ในคอมพิวเตอร์ของเราต้อง Install ยังไง แนะนำให้หน่อยได้ไหม ในวิกิพจนานุกรมภาษามอญงานทุกอย่างฉันคนเดียวต้องทำอยู่ ไม่มีใครช่วยฉันด้วย ฉันเองก็อยากจะลองดู [[ผู้ใช้:Intobesa.bot|bot]] หรือว่าฉันจะมาหาคุณที่บ้านหรือ ถ้าแบบนั้นฉันดีที่สุด เพราะว่าฉันไม่ค่อยเข้าใจเรื่องเทคโนโลยี เรื่องนี้คุณก็รู้อยู่ดี ถ้าคุณลองทำให้ฉันมองเห็น สำหรับฉันจะพอเข้าใจ คุณช่วยให้ฉันหน่อยได้ไหม ฉันอยากจะขอความกรุณาเรื่องนี้ โปรดช่วยด้วย ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 17:15, 3 เมษายน 2567 (+07)
----
:ผมใช้งาน pywikibot โดยสามารถใช้งานผ่านเว็บไซต์ https://hub-paws.wmcloud.org <u>ซึ่งได้ติดตั้ง pywikibot ไว้แล้ว</u> ไม่ต้องติดตั้งอะไรลงในคอมพิวเตอร์ -- เป็นวิธีที่ง่ายที่สุด ที่ไม่ต้องเขียนโปรแกรมเอง แต่ต้องสั่งงานใน <u>Terminal</u> ให้ถูกไวยากรณ์ -- ในเบื้องต้น คุณต้องมีความรู้ภาษา <u>python</u> และ <u>bash</u> ของ Linux ที่จะใช้งานมัน
:pywikibot เป็นสคริปต์อัตโนมัติ ไม่ถึงกับเป็นบอต แต่ถึงกระนั้น นโยบายของวิกิทั้งหมด กำหนดให้ตั้งชื่อ user name ที่สามารถระบุได้ว่าเป็นบอต (เช่นมีคำว่า bot อยู่ในชื่อ และระบุข้อมูลเจ้าของ) ซึ่งจะต้องสมัครบัญชีใหม่ให้บอตโดยเฉพาะ (Intobesa.bot) และให้ระมัดระวังว่าคุณกำลังใช้บัญชีใดอยู่
:ก่อนใช้งาน ต้องสร้างไฟล์ <u>user-config.py</u> ขึ้นแล้วเก็บไว้ที่นั่น ซึ่งเป็นตัวตั้งค่าว่า จะใช้ pywikibot กับโครงการใด และใช้บัญชีอะไร ผมเขียนให้ไปเลย ดูรายละเอียดเต็มที่ [https://www.mediawiki.org/wiki/Manual:Pywikibot/user-config.py]
<pre>
# -*- coding: utf-8 -*-
mylang = 'mnw'
family = 'wiktionary'
usernames['wiktionary']['mnw'] = 'Intobesa.bot'
console_encoding = 'utf-8'
</pre>
:เปิด <u>Terminal</u> เพื่อสั่งงานผ่าน bash ก็ใช้งานได้เลย
:ขั้นตอนแรกต้องล็อกอิน (ทำครั้งแรกครั้งเดียวเท่านั้น)
<pre>pwb.py login</pre>
:ตัวอย่าง จะแสดงรายการหน้าที่อยู่ในหมวดหมู่ "အက္ခရ် သေံ"
<pre>pwb.py listpages -cat:"အက္ခရ် သေံ"</pre>
:ตัวอย่าง จะแทนที่คำ จาก "သေံ" เป็น "မန်" ในหน้าที่ใช้งานแม่แบบ "IPA Mon" อยู่ (อย่ากด all เดี๋ยวจะเหนื่อยย้อนกลับ)
<pre>pwb.py replace "သေံ" "မန်" -transcludes:"IPA Mon"</pre>
:ยังมีคำสั่งและตัวเลือกอีกมากมายที่มีประโยชน์ ดูคำสั่งทั้งหมดได้ที่ [https://www.mediawiki.org/wiki/Manual:Pywikibot/Scripts]
:อนึ่ง การแก้ไขด้วยบอต อาจทำให้เกิดความผิดพลาดจำนวนมหาศาลได้ในเวลาอันรวดเร็ว ดังนั้นควรใช้อย่างระมัดระวัง -- ถ้าคุณมีความรู้ระดับสูง คุณสามารถเขียนโปรแกรม python โดยใช้ไลบรารีของ pywikibot ให้ทำงานซับซ้อนมากกว่านี้ได้ และเมื่อคุณชำนาญแล้ว ก็สามารถขอ bot flag กับ metawiki ได้ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 17:54, 3 เมษายน 2567 (+07)
::เพิ่มเติม Ctrl X/C/V จะใช้ไม่ได้ใน Terminal ต้องกดปุ่ม Shift Delete = Cut; Ctrl Insert = Copy; Shift Insert = Paste --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 18:54, 3 เมษายน 2567 (+07)
----
:::ขอบคุณมากครับ ตอนนี้ฉันกำลังพยายามอยู่ <span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 15:40, 4 เมษายน 2567 (+07)
::::ฉันพยายามแค่ไหนก็ยังไม่ได้ ก็ฉันไม่ค่อยเข้าใจ คุณทำให้ฉันมองเห็นได้ไหม เรื่องนี้ฉันก็ไม่เช่นเคย พยายามอยู่สองสามชั่วโมงแล้ว ยังไงก็ไม่ได้เสียเวลาอีกมาก งานอื่นก็ยังไม่ได้ทำเลย คุณทำวีดีโอแล้วก็ให้ฉันมองเห็นได้ไหม ฉันต้องการ ๒ อย่าง ก็คือ ๑. ในวิกิพีเดียภาษามอญ คำ ( ္ရ) นี้ ฉันต้องการเปลี่ยน เป็น (္ၚ ) เพราะว่าวิธีการเขียนผิด ๒. ในวิกิพจนานุกรมภาษามอญ ตัวอย่างคำ ဒါတ္တ นี้ ต้องการอยากจะสร้างเพจ ทั้งหมดคุณเขียนให้ code ได้ไหม ถ้าเป็นไปได้ฉันอยากจะมาที่บ้านคุณ ฉันมีบัตรประชาชนเป็นคนไทยอยู่แล้ว ประเทศไทยที่ไหนก็ฉันไปได้ คุณช่วยให้ฉันได้ไหม ฉันอยากจะขออีกขอบคุณครับ <span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 17:43, 4 เมษายน 2567 (+07)
----
:::::ถ้าจะใช้กับวิกิพีเดีย เพิ่มอันนี้ลงใน user-config.py ด้วย
<pre>
usernames['wikipedia']['mnw'] = 'Intobesa.bot'
</pre>
:::::ข้อแรก สามารถสั่งแบบนี้
:::::<pre>pwb.py replace "္ရ" "္ၚ" -cat:"ชื่อหมวดหมู่" -family:wikipedia</pre>
:::::หรือไม่ก็
:::::<pre>pwb.py replace "္ရ" "္ၚ" -search:"คำที่ค้นหา" -family:wikipedia</pre>
:::::ออปชั่น cat search หรืออื่น ๆ มันจำเป็นมากที่ต้องกำหนดขอบเขตว่า ให้สคริปต์ทำงานในหน้าใดบ้าง
:::::ส่วนข้อสอง pywikibot ไม่สามารถทำงานแบบนี้ได้ ทำได้แต่เก็บกวาดเล็ก ๆ น้อย ๆ -- ถ้าจะสร้างรายการพจนานุกรมที่สวยงามและไม่ผิดพลาด ต้องเขียนสคริปต์ python ขึ้นมาเอง มันข้ามขั้นเกินไป อยากให้คุณศึกษาการเขียนโปรแกรม python ก่อน ขนาดผมก็ยังใช้เวลาเป็นปี กว่าจะเขียนได้ ลองผิดลองถูก เขียนไปพลางและอ่าน documentation ไปพลาง --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 19:51, 4 เมษายน 2567 (+07)
:::::ส่วนคำต่าง ๆ ที่ผมสร้างขึ้นในวิกิพจนานุกรมได้อย่างรวดเร็วนั้น ไม่ได้ใช้บอตข้างบน ผมลอกมาจาก en แล้วใช้สคริปต์ช่วยเก็บกวาด สร้างจาก JavaScript, jQuery ซึ่งเป็นความรู้ที่ผมใช้ทำงานในอาชีพ และ Lua ซึ่งเป็นภาษาที่ใช้เขียนมอดูล ก็ศึกษาเอาจากโค้ดที่คนอื่นเขียน ไม่มีใครสอน (เพราะเขาไม่นิยมเขียนกัน) --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 19:59, 4 เมษายน 2567 (+07)
::::::ผมเองก็งงอยู่เรื่องนี้นานแล้ว ตอนที่ผมใช้วิกิครั้งแรก มีความผิดพลาดมาก ไม่มีใครสอนให้ ไม่มีใครแนะนำให้ มีแต่คนที่รอล็อคบัญชีของเรา ฉันเองก็โกรธมาก สิ่งที่ฉันโกรธที่สุดก็คือหน้าเพจที่ฉันสร้างเอาไว้ ไม่ได้แจ้งให้ฉันทราบ ลบออกเฉื่อยเลย ตอนนี้ฉันใช้วิกิ ไม่ใช่มีความรู้ เฉพาะไปเปิดดูของผู้อื่น แล้วก็ Copy มา ขณะนี้ต้องศึกษาอยู่ประมาณ ๓ ปีกว่า ตอนใช้วิกิครั้งแรกแย่มาก ไม่ใช่ฉันอ่านหนังสือไม่ออก แค่ฉันไม่เช่นคือก็เทคโนโลยีเท่านั้น สายตาเองก็ไม่ค่อยดีบางครั้งคำสะกดผิดมั้ง ปัญหานี้แหละในวิกิพีเดียภาษาไทยก็ภาษาญี่ปุ่น Admin บางคน เข้าใจผิดหรือเปล่าผมก็ไม่ทราบ หน้าเพจฉันสร้างเอาไว้ พวกเขาไม่ให้พูดคุยเรื่องสาเหตุปัญหาลบเฉยเลย นั่นแหละทำให้ฉันโกรธที่สุด เพราะว่าสำหรับหน้าเพจนั้น ฉันต้องเขียนเอาไว้เหนื่อยแค่ไหน พวกเขาก็ไม่สนใจ สิ่งที่ฉันพยายามเอาไว้ทั้งหมดไม่ใช่การละเมิด ฉันแค่อยากจะช่วยเหลือเท่านั้น ตอนนี้วิกิพีเดียภาษาไทยแล้วก็วิกิพีเดียภาษาญี่ปุ่นฉันไม่ยุ่งแล้ว แล้วก็ไม่ได้ช่วยอะไรแล้ว เพราะว่าฉันรู้สึกเหมือนไม่มีความยุติธรรม ความจริงแล้วหน้าเพจผู้อื่นสร้างเอาไว้ถ้ามีปัญหาบางอย่างให้พูดคุยก่อนที่หลังค่อยลบออก เราต้องการอย่างนี้ ตอนนี้ใน วิกิพีเดีย ภาษาไทยก็ภาษาญี่ปุ่นไม่มีแบบนี้ การกระทำแบบนั้นเหมือนไม่มีความเคารพผู้อื่น ในวิกิฉันพยายามแค่ไหนเมื่อไหร่ดูผลงานของฉันได้ บางคนไม่เข้าใจการกระทำของฉัน เรื่องนั้นสำหรับฉันน้อยใจด้วยแล้วก็โกรธมาก สิ่งที่ฉันโกรธมากก็มีอย่างหนึ่งอีก อันนั้นคือ ตัวเองก็อ่านภาษามอญไม่ออก เกี่ยวข้องกับภาษามอญก็ไม่คล่องแคล่ว เกี่ยวข้องกับคำศัพท์ผู้อื่นเขียนเอาไว้ถูกหรือผิดแยกย้ายไม่เป็นจะมาเถียงฉันอีก แบบนี้ฉันนิดเดียวก็ไม่ชอบ เอาละฉันพูดแค่นี้แหละ สำหรับคำแนะนำขอบคุณมากๆนะ แต่ฉันยังไม่เข้าใจ ฉันพยายามแค่ไหนสมองของฉันไม่ยอมรับ ถ้ามีโรงเรียนการสอนวิกิอย่าลืมบอกฉันด้วย ฉันต้องการอยากจะไปเรียน ฉันทิ้งเบอร์โทรเอาไว้ ๐๘๓๑๖๔๔๖๕๙ อย่าลืมโทรหาฉันด้วย ฉันจะรอคอยขอบคุณครับ <span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 13:03, 5 เมษายน 2567 (+07)
== เตือนให้ลงคะแนนตอนนี้เพื่อเลือกสมาชิกของคณะกรรมการประสานงานหลักจรรยาบรรณสากลกลุ่มแรก ==
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – vote reminder|คุณสามารถค้นหาข้อความนี้แปลเป็นภาษาอื่นเพิ่มเติมได้ในเมตาวิกิ]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – vote reminder}}&language=&action=page&filter= {{int:please-translate}}]''
ถึงชาววิกิมีเดีย
คุณได้รับข้อความนี้เนื่องจากคุณเคยเข้าร่วมในกระบวนการหลักจรรยาบรรณสากลมาก่อน
นี่เป็นการเตือนว่าระยะเวลาการลงคะแนนเสียงสำหรับคณะกรรมการประสานงานหลักปฏิบัติสากล (U4C) จะสิ้นสุดในวันที่ จะสิ้นสุดในวันที่ 9 พฤษภาคม พ.ศ. 2567 อ่านข้อมูลใน [[หลักปฏิบัติสากล/คณะกรรมการประสานงาน/การเลือกตั้ง/2024|หน้าการลงคะแนนเสียงในเมทาวิกิ]] เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการลงคะแนนเสียงและสิทธิ์ของผู้มีสิทธิเลือกตั้ง
คณะกรรมการประสานงานหลักปฏิบัติสากล(U4C) เป็นกลุ่มระดับโลกที่อุทิศตนเพื่อให้การดำเนินงานหลักจรรยาบรรณสากล เป็นไปอย่างเท่าเทียมกันและสม่ำเสมอ สมาชิกชุมชนได้รับเชิญให้ส่งใบสมัครสำหรับคณะกรรมการประสานงานหลักปฏิบัติสากล สำหรับข้อมูลเพิ่มเติมและความรับผิดชอบของคณะกรรมการประสานงานหลักปฏิบัติสากล โปรดไปที่ [[หลักจรรยาบรรณสากล/คณะกรรมการประสานงาน/กฎบัตร]]
กรุณาแบ่งปันข้อความนี้กับสมาชิกในชุมชนของคุณ เพื่อให้พวกเขาสามารถมีส่วนร่วมได้เช่นกัน
ในนามของทีมโครงการหลักจรรยาบรรณสากล<section end="announcement-content" />
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 05:54, 3 พฤษภาคม 2567 (+07)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Universal_Code_of_Conduct/Coordinating_Committee/Election/2024/Previous_voters_list_3&oldid=26721208 -->
==การสอบถามสิ่งที่ไม่เข้าใจเกี่ยวข้องก็ IPA ภาษามอญ==
สวัสดีคุณพี่ {{ping|Octahedron80}} ใน [[လကံ]] คุณใส่ IPA ว่า tᵊkɔm นั้น တ္ကံ၊ တကံ၊ တကီု แต่ความหมายไม่เหมือนนะ และ อีกด้วย လကံ၊ လ္ကံ นี้เราต้องระวังที่สุดก็คือมันออกได้สองเสียง ถ้าเราออกเสียงว่า lᵊkɔm มันออกไปความหมายอื่น ถ้าเราออกเสียงว่า lᵊkɔʔ มันออกไปความหมายอื่นเช่นกัน ผมเห็นการที่คุณใส่เอาไว้นั่นแหละผมก็งงอยู่ ผมเองก็สายตาไม่ค่อยดีถ้าผมไม่เปิดตาชัดๆผิดพลาดไปหมด เดี๋ยวผมแก้ไขให้--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 13:20, 23 ตุลาคม 2567 (+07)
ขออภัยที่แก้หลายครั้งเพราะไม่ได้ฟังเสียงก่อน อนึ่งผมรู้เฉพาะมอญในไทย တ္ကံ ตะเกาะ ที่แปลว่า island ซึ่งบางพวกบางทีก็น่าจะอ่านว่า เกาะ เหมือนกัน คล้ายภาษาไทย // เรื่องเสียงพยัญชนะไม่ตรงกับรูปเขียน เป็นปัญหาใหญ่สำหรับคนเรียนภาษามอญ ต้องระบุให้ชัดว่า เสียงของประเทศไหน และเสียงไหนแปลว่าอะไร -[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 13:37, 23 ตุลาคม 2567 (+07)
:: ลองเปิดดูในวิกิพจนานุกรมภาษามอญ การอัพเดทของฉันล่าสุด ถ้าต้องออกเสียง kɔʔ ကံ၊ ကအ် เกาะ ไม่ใช่แล้วล่ะ เพราะว่าเป็นการออกเสียงคล้ายคลึงเท่านั้น ความหมายนิดเดียวก็ไม่เหมือนนะครับ ในภาษามอญของเราการออกเสียงคล้ายคลึงแบบนี้มีเยอะมากครับ เรื่องนี้คนมอญทุกคนไม่ทราบหรอก เพราะว่าคนมอญในประเทศพม่า แล้ว ในประเทศไทยส่วนใหญ่ การพูดคุยภาษามอญไม่มีการอนุรักษ์ พวกเขาก็ใช้มั่วซั่ว ภาษามอญของเราก็มีการเปลี่ยนแปลงตามวรรณยุกต์ ถ้าเอาแบบมอญประเทศไทย ส่วนใหญ่ใช้ไม่ได้ เพราะว่าการเขียนพวกเขาส่วนใหญ่ เป็นการเขียนภาษามอญยุคสมัยกลาง ฉันเองก็ไปทั่วประเทศไทยตามหาเก็บข้อมูลเกี่ยวข้องกับภาษามอญแล้ว ถ้าต้องแสดงตัวอย่างเช่น ကတ် แล้ว ကိုတ် การออกเสียงเหมือนกันแต่ ความหมายนิดเดียวก็ไม่เหมือน ဍိုက်၊ ဍာ် ก็เช่นกัน การเขียนภาษามอญหรือ การศึกษา ภาษามอญ ต้องมีการระวังเยอะมาก ถ้ามีความรู้ภาษามอญเล็กน้อย แยกย้ายไม่ออกหรอกอันไหนจริงอันไหนไม่จริง ฉันเองก็ตอนเรียนภาษามอญอยู่คือมีความประสบผิดพลาดเยอะมาก ฉันจะได้เขียนภาษามอญขนาดนี้ ฉันก็ผ่านการศึกษามาเยอะมากแล้ว--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 14:58, 23 ตุลาคม 2567 (+07)
::: ฉันแก้ไขให้แล้วนะลองอ่านดู--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 15:27, 23 ตุลาคม 2567 (+07)
:::: ทั้งวิกิพจนานุกรมภาษาไทยฉันตรวจสอบและแก้ไขเป็นเรียบร้อยหมดแล้ว คุณทั้งวิกิพจนานุกรมภาษาอังกฤษช่วยแก้ไขให้หน่อย เพราะว่าฉันแก้ไขไม่ได้ฉันไม่มีสิทธิ์ ถ้าคุณต้องการแปลภาษาอังกฤษฉันจะให้--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 17:06, 23 ตุลาคม 2567 (+07)
==คำขอความช่วยเหลือบางอย่าง==
สวัสดีคุณพี่ {{ping|Octahedron80}} พี่ครับหน้านี้ [[:wikt:mnw:wai]] ลองเปิดดู มี Error อะไรก็ไม่ทราบ ถ้าเกี่ยวข้องกับภาษาไทยมีปัญหาอย่างนี้แหละ ผมก็พยายามแก้ไขแต่ยังไงก็ไม่ทราบมันหมายถึงอะไร พี่ช่วยหน่อยได้ป่ะ ฉันขอนะขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 14:10, 6 พฤศจิกายน 2567 (+07)
:ผมแก้ไขจุดที่มีปัญหาให้แล้วครับ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 14:19, 6 พฤศจิกายน 2567 (+07)
==คำขอเคลื่อนย้ายเอกสาร==
* [[teiku auto]] → [[teikuauto]]
คุณไม่สามารถย้ายหรือแก้ไขเอกสารด้วยเหตุผลดังต่อไปนี้: "ผู้ใช้ใหม่ห้ามลบป้ายแจ้งลบ" --[[ผู้ใช้:YeBoy371|YeBoy371]] ([[คุยกับผู้ใช้:YeBoy371|คุย]]) 15:30, 8 พฤศจิกายน 2567 (+07)
ผมก็ไม่ทราบว่า คุณจะเปลี่ยนไปเปลี่ยนมาทำไม ผมจะยึดตามภาษาอังกฤษปัจจุบันนะครับ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 17:03, 8 พฤศจิกายน 2567 (+07)
==ขอความช่วยเหลือ==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ ช่วยแก้ไขให้หน้า [[:wikt:mnw:မဝ်ဂျူ:rsk-IPA]] นี้หน่อย ผมพยายามแค่ไหนก็ไม่สำเร็จ มี Error อะไรก็ผมไม่ทราบและไม่เข้าใจด้วย ลองดูหน้า [[:wikt:mnw:вецейгодзинови]] นี้ ถ้ามีเวลาว่างช่วยหน่อยนะ สมองผมเองเกี่ยวข้องก็เทคโนโลยีมันไม่ยอมรับ สมองผมจำได้แค่หนังสือเท่านั้น การแปลภาษาสำหรับผมมันไม่ยากแต่มันยากที่สุดก็ code CSS นั่นแหละ พยายามจะศึกษาอยู่ก็มันไม่เข้าใจ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 14:13, 9 พฤศจิกายน 2567 (+07)
:มอดูลของภาษาอังกฤษนั้น เปลี่ยนแปลงตลอดเวลา ถ้าไม่อัปเดต เราก็จะล้าหลัง และมอดูลใหม่ ๆ ที่เกิดทีหลัง จะใช้งานกับของเก่าที่มีอยู่ไม่ได้ครับ ต้องหมั่นอัปเดตครับ // ให้เวลาผมแก้ไขก่อน ต้องทำหลายหน้า --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 14:43, 9 พฤศจิกายน 2567 (+07)
:อัปเดตมอดูลต่าง ๆ ให้พอใช้งานได้แล้ว แต่ยังเหลืออีกหลายจุดที่ยังมีปัญหา เช่นแม่แบบยังไม่ได้อัปเดต ถ้าพบก็ค่อยตามไปแก้ วันนี้แก้วิกิภาษามอญตั้งแต่บ่าย จนเกือบเที่ยงคืน พอก่อน --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 23:36, 9 พฤศจิกายน 2567 (+07)
:: ครับผม ขอบคุณมากครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 14:34, 10 พฤศจิกายน 2567 (+07)
:::: พี่ครับ ผมพยายามหาตัว s นี้ไม่เจอ ถ้าต้องแปลภาษามอญมันเรียกว่า ဂမၠိုင် ตัวอย่างเช่น Noun ⏩ နာမ် Nouns ⏩ နာမ်ဂမၠိုင် พี่ลองดู [[:wikt:mnw:veren]] นี้ ผมชอบในคำศัพท์ภาษาไทยคือ ([[:หมวดหมู่:คำหลักภาษาไทย|คำหลักภาษาไทย]]) คำศัพท์นี้ถ้าไปใช้ในภาษามอญน่าจะเหมาะสม เพราะว่ามันสั้น ถ้าต้องแปลภาษามอญเรียกว่า คำ ⏩ ဝေါဟာ หลัก ⏩ အဓိက ภาษา ⏩ ဘာသာ ไทย ⏩ သေံ (คำหลักภาษาไทย ဝေါဟာအဓိကဘာသာသေံ) ถ้าเอาแบบสไตล์มอญตามวรรณกรรม (ဝေါဟာအဓိကသေံဂမၠိုင်) และอีกด้วย คำ (รูปผัน) นี้ ถ้าแปลภาษามอญมันกลายเหมือนตลก เพราะว่า รูป ⏩ ရုပ် ผัน ⏩ ကၠောံ (รูปผัน ရုပ်ကၠောံ) ถ้าต้องแปลให้เหมาะสมที่สุดเรียกว่า (ဗီုပြင်အပြံင်အလှာဲ) ผมอยากได้แบบนั้นครับ พี่ช่วยเพิ่มให้หน่อย ผมต้องเพิ่มยังไงยังไม่ทราบเลย ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 15:26, 10 พฤศจิกายน 2567 (+07)
::::: เอาเรื่องแรกก่อน ผมสร้าง [[:mnw:မဝ်ဂျူ:mnw-utilities]] ขึ้นมาโดยเฉพาะ แล้วแก้ไข categories ใน headword นิดหน่อย // เราจะไม่แก้ en-utilities เพราะมันใช้งานร่วมกับคำในภาษาอังกฤษ // ในอนาคตสามารถเพิ่มอย่างอื่นได้อีกลงใน mnw-utilities --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 16:02, 10 พฤศจิกายน 2567 (+07)
::::: เรื่องชื่อหมวดหมู่ก็ควรจะใช้แบบวรรณกรรมดีที่สุดครับ ผมลองทำแล้วไม่รู้ถูกหรือเปล่า [[:mnw:เด็กชาย]] // หมวดหมู่ไหนไม่ใช้งาน ช่วยลบด้วย ตาลายไปหมด (ถ้าลบไม่ได้ก็เปลี่ยนชื่อแทน) --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 16:22, 10 พฤศจิกายน 2567 (+07)
::::: มีอีกเรื่องที่ต้องระวังคือ อย่าตั้งชื่อแต่ละภาษา เป็นภาษามอญที่<u>สะกดซ้ำกัน</u> เพราะระบบอาจจะเลือกรหัสมาผิด และการจัดหมวดหมู่ก็จะผิด ดูภาพรวมได้ใน [[:mnw:ညးလွပ်:Octahedron80/update languages]] --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 16:34, 10 พฤศจิกายน 2567 (+07)
:::::: ขอบคุณมากๆ ครับสำหรับให้เวลาช่วยเหลือวิกิพจนานุกรมภาษามอญ เกี่ยวข้องกับวิกิ สิ่งที่ผมไม่เข้าใจมีเยอะมาก เคยมีสาเหตุปัญหานั่นแหละ ผมก็อยากจะศึกษาเกี่ยวข้องกับวิกิ แต่ไม่มีใครแนะนำ ไม่มีใครสอนให้ มีวิธีไหนก็ตามถ้าผมมองไม่เห็นกับตาตามทำไม่ถูกหรอก ตอนนี้ผมใช้วิกิอยู่ ไม่ใช่มีความรู้ ไปตามทำแบบผู้อื่นใช้งานเอาไว้ ผมก็พยายามให้มันดีที่สุดแต่บังเอิญมันก็ผิดพลาดโดยไม่ได้ตั้งใจ ตอนนี้ผมก็อยากจะสอบถามพี่มีอีกแต่ผมก็เกรงใจแล้ว ไม่อยากดึงเวลาพี่อีก ผมอยากรู้ว่าใน [[:mnw:မဝ်ဂျူ:module_categorization#L-312|#L-312]] ต้องใส่ ဂမၠိုၚ် อย่างไร ผมพยายามซ้ำแล้วซ้ำอีกก็มันไม่สำเร็จ ลองดูตัวอย่างอัน [[:en:Category:Thai modules]] และ [[:mnw:ကဏ္ဍ:မဝ်ဂျူသေံဂမၠိုၚ်]] นี้ พี่ก็ช่วยให้เราเยอะมากแล้วเราก็เกรงใจ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 14:33, 11 พฤศจิกายน 2567 (+07)
:::พี่ครับ ถ้ามีเวลาว่างช่วยแก้ไขให้ [[:mnw:မဝ်ဂျူ:ca-verb]] นี้หน่อย ผมพยายามแค่ไหนกับมันไม่สำเร็จ ลองดูในหน้า [[:mnw:veren]] นี้ ขอบคุณมากๆ ครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 21:15, 11 พฤศจิกายน 2567 (+07)
::: สวัสดีตอนเช้าครับคุณพี่ ถ้ามีเวลาว่างช่วยแก้ไขให้อัน [[:mnw:မဝ်ဂျူ:ru-noun]] นี้หน่อยนะ มีปัญหา Error ในหน้า [[:mnw:интервьюер]] อยู่ครับ ขอบคุณพี่นะสำหรับช่วยให้เรา--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 06:43, 12 พฤศจิกายน 2567 (+07)
::: คุณพี่ครับ ลองดูหน้า [[:mnw:बृहस्पति|बृहस्पति]] นี้หน่อยครับ มี Error อะไรก็ผมไม่ทราบครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 17:00, 13 พฤศจิกายน 2567 (+07)
::: สวัสดีครับคุณพี่ {{ping|Octahedron80}} หมายเลขอังกฤษเปลี่ยนให้เป็นหมายเลขมอญได้ไหม ความที่ผมต้องการก็คือภาษามอญต้องเป็นเฉพาะภาษามอญไม่อยากไปผสมกับอักษรอื่น ถ้าอย่างนั้นไม่ใช่ในอนาคตก็มีความเข้าใจผิดได้ ผมเองก็ตอนมีชีวิตอยู่ อยากปกป้องภาษามอญเอาไว้เต็มที่เท่าที่มีชีวิตอยู่ คุณพี่ลองดู ဝေါဟာသပုင်ဝဏ္ဏ 3 မ-ဂမၠိုင် นี้ในหน้า [[:mnw:alemán|alemán]] ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 14:21, 18 พฤศจิกายน 2567 (+07)
::: คุณพี่ครับ [[:mnw:မဝ်ဂျူ:de-headword]] นี้จำเป็นต้องอัพเดทไหม ผมลองอัพเดทแล้วแต่มันไม่ทำงาน ดังนั้นผมก็ต้องยอมกลับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 11:06, 19 พฤศจิกายน 2567 (+07)
:::: de-headword มันใช้ได้อยู่แล้วครับ แต่ที่เห็นบางหน้า error ต้องแก้ในหน้าคำศัพท์ เพราะมันเป็นเรียกใช้งานแบบเก่า ก็ให้ไปลอกมาใหม่ เช่น [[:mnw:Mensch]], [[:mnw:Traummann]] ผมลองแก้ไปแล้ว ให้คุณดู // อย่างไรก็ตาม ควรอัปเดตทุกอย่าง เพราะมิฉะนั้นจะตามเขาไม่ทัน --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 11:16, 19 พฤศจิกายน 2567 (+07)
::: ครับผม ขอบคุณมากครับ สำหรับจะต้องแก้ไขมีเยอะมาก ผมเองก็ไม่ค่อยจะว่าง เท่าที่มีเวลาก็ค่อยๆ แก้ไขไป แต่ผมมีข้ออย่าสอบถามพี่อีก {lb|th|slang}} นี้มันไม่ทำงาน จะต้องทำยังไงต่อบ้างครับ พี่ลองดูในหน้า [[:mnw:องค์]] นี้ เมื่อก่อนก็ใช้ได้อยู่--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 11:54, 19 พฤศจิกายน 2567 (+07)
::: คุณพี่ครับถ้ามีเวลาว่างช่วยแก้ไขให้ [[:mnw:မဝ်ဂျူ:labels]] นี้หน่อย สาเหตุหมวดหมู่ไม่ตรง เพื่อตัวอย่างลองดู [[:en:Category:Thai slang|Thai slang]] นี้ อยากได้เป็นแบบ ဝေါဟာ(slang)(Thai)ဂမၠိုင် ➡ ဝေါဟာအရေဝ်ဗေဗာန်သေံဂမၠိုင် นี้ครับ ผมพยายามแค่ไหนก็ไม่สำเร็จ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 14:30, 19 พฤศจิกายน 2567 (+07)
:::: สาเหตุก็คือ မဝ်ဂျူ:labels/data มันเก่าไปแล้ว ผมก็อัปเดตทั้งหมดให้แล้ว // จุดที่ผมแก้อีกคือ [[mnw:မဝ်ဂျူ:labels]] ผมสลับ pos กับชื่อภาษา แล้วเติม ဂမၠိုင် ซึ่ง မဝ်ဂျူ:labels จะไม่เติม ဝေါဟာ เพราะคาดว่า น่าจะมีหมวดหมู่อื่นที่ไม่ต้องเติม ဝေါဟာ โดยผมแก้ชื่อหมวดหมู่ใน pos_categories ใน [[mnw:မဝ်ဂျူ:labels/data]] แทน // ถ้าอยากได้หมวดหมู่เขียนอย่างอื่น ไปแก้เอาใน မဝ်ဂျူ:labels/data ใน pos_categories <u>โดยไม่ต้องเติม ဂမၠိုင် เพราะเติมให้อัตโนมัติ</u> ที่ต้องทำแบบนี้ เพื่อให้ชื่อภาษา แทรกลงไปอยู่ตรงกลางได้ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 08:30, 20 พฤศจิกายน 2567 (+07)
:: ครับผมขอบคุณมากครับ เกี่ยวข้องกับวิกิ ผมต้องเรียนรู้มีเยอะมาก ผมเองก็ไม่ค่อยมีเวลาจะว่างแล้ว และไม่มีใครให้กำลังใจด้วย ผมเองก็ต้องค่อยๆไป--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 16:49, 21 พฤศจิกายน 2567 (+07)
::: คุณพี่ครับลองตรวจสอบหน้า [[mnw:निम्न]] นี้หน่อย ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 16:44, 21 พฤศจิกายน 2567 (+07)
:: สวัสดีครับ คุณพี่ครับ ช่วยตรวจสอบให้หน้า [[mnw:ဗီုပြင်သိုင်တၟိ:အိန်ဒဝ်-အဳရာန်-အခိုက်ကၞာ/warāȷ́ʰás]] นี้หน่อย ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 10:31, 22 พฤศจิกายน 2567 (+07)
::: ก็ตามนั้นเลยครับ รหัส qfa-sub-bma ไม่มี เขาเปลี่ยนเป็น qsb-bma --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 10:44, 22 พฤศจิกายน 2567 (+07)
::: คุณพี่ครับ class 5 นี้ต้องแปลอย่างไร [[:en:Category:Chamalal class 5 nouns|Chamalal class 5 nouns]] นี้ผมต้องการว่า '''နာမ်ချာမာလာန်၅ တန်ဂမၠိုင်''' ลองดูในหน้า [[mnw:аᵸз]] คุณพี่เท่าเวลาว่าง ช่วยเพิ่มให้หน่อยนะ ผมหมดเวลาต้องหยุดงานแล้วล่ะ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 15:07, 22 พฤศจิกายน 2567 (+07)
::: ผมแก้ไขได้แล้วนะคุณพี่ครับ ขออภัยสำหรับที่ต้องรบกวนสาเหตุความที่ไม่รู้ ตอนนี้ลองดูมั่วๆ สำเร็จแล้วล่ะ ขอบคุณจริงๆนะสำหรับช่วยเหลือเรา ถ้าไม่รู้ไม่ทราบมีเพิ่มเติมอีกแล้วก็ขออนุญาตสอบถามเพิ่มเติมด้วยนะ เราต้องการความช่วยเหลือจากคุณพี่มาก เพราะว่าคุณพี่มีความประสบเกี่ยวข้องกับวิกิแต่เรายังไม่มีความเข้าใจ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 19:16, 22 พฤศจิกายน 2567 (+07)
:: คุณพี่ครับถ้ามีเวลาว่างช่วยจัดการให้สำหรับหน้า [[mnw:ဗီုပြင်သိုင်တၟိ:အဝါရဝ်-အာန်ဒဳယာန်-အခိုက်ကၞာ/ɬ:ɨn]] นี้หน่อย เรื่องนี้ผมเคยไปบอกแล้ว แต่ผมคิดว่าน่าจะเพราะเขาไม่เชื่อ อันที่จริง จะภาษาอังกฤษต้องแปลภาษามอญแล้วก็เขียนสั้นๆยังไงก็ไม่ได้หรอก ถ้าเขียนไปแล้วก็ไม่มีความหมายแล้วไม่มีใครอ่านออกด้วย สำหรับคนอื่นจะได้อ่านออกต้องเขียนยาวๆ ตัวอย่างเช่นลองดูวีดีโอคำแปล[https://web.facebook.com/share/r/FjSqpiatGpz1D4Q4/ ภาษามอญนี้] ถ้ามีคำศัพท์ลึกซึ้งมาก ต้องเขียนยาวกว่านี้อีก อย่างนั้นไม่ใช่แล้วก็คนที่อ่านไม่เข้าใจอธิบายหรอก เรื่องนี้ผมต้องอธิบายอย่างไรก็ไม่ทราบเพื่อเขาเข้าใจ ผมเองก็คุยกับผู้อื่นไม่ค่อยเก่งหรอก เก่งเฉพาะท่องหนังสือ ถ้าพี่ช่วยได้ช่วยให้หน่อยนะ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 15:36, 23 พฤศจิกายน 2567 (+07)
::: อันนี้ไม่สามารถแก้ได้ครับ ชื่อหน้ายาวเกินไปที่จะตั้ง มันเป็นข้อจำกัด (limit) ของซอฟต์แวร์ Mediawiki แล้ว "ชื่อเรื่องหน้าที่ขอยาวเกินไป ไม่สามารถยาวกว่า 255 ไบต์ในการเข้ารหัส UTF-8" ภาษาไทยของเราก็มีข้อจำกัดเหมือนกัน ภาษาอังกฤษของเขาใส่ a-z ได้เต็มที่เลย 255 ตัว เพราะเขาตัวละ 1 ไบต์ แต่พอเป็นภาษาไทยหรือมอญแล้ว ตัวอักษรหนึ่งตัวตามรหัส UTF-8 จะกินไป 3 ไบต์ ดังนั้นภาษาไทยหรือมอญล้วน ๆ จะตั้งชื่อยาวสุดได้แค่ประมาณ 255 ÷ 3 = 85 ตัว ไม่สามารถเพิ่มได้มากกว่านี้ เปรียบเหมือนคุณมีกล่องใส่ของได้ 255 ชิ้น คุณใส่ของเกินไปมากกว่า 255 ชิ้น มันก็จะล้น ใส่ได้ไม่หมดครับ // วิกิภาษาไทยยังไม่พบหมวดหมู่ที่ยาวเกิน มีแต่ชื่อคำในพจนานุกรมที่ยาวเกิน (เช่นชื่อเต็มกรุงเทพฯ ก็แก้โดยตั้งเป็นชื่ออย่างอื่น) แต่อีกไม่นานก็คงจะเจอปัญหาแบบคุณเหมือนกัน เราอาจจะต้องยอมตั้งชื่อด้วยตัวอักษรย่อ หรือเป็นอังกฤษบ้าง --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 15:57, 23 พฤศจิกายน 2567 (+07)
::: ข้อความ ဝေါဟာအဝါရဝ်-အာန်ဒဳယာန်-အခိုက်ကၞာဂွံလဝ်အာဲကၟာဲနူဝေါဟာခါခေန်ယှေန် သၟဝ်ကျာလ္ပာ်ဗၟံက်-အခိုက်ကၞာဂမၠိုင် นับได้ 286 ไบต์ // ข้อความ ဝေါဟာအဝါရဝ်-အာန်ဒဳယာန်-အခိုက်ကၞာကၠုင်နူဝေါဟာခါခေန်ယှေန် သၟဝ်ကျာလ္ပာ်ဗၟံက်-အခိုက်ကၞာဂမၠိုင် นับได้ 262 ไบต์ // [https://www.atatus.com/tools/byte-counter โดยใช้เครื่องมือนี้นับ] ก็เห็นได้ชัดว่า ทั้งสองชื่อ เกิน 255 ไบต์ ใช้ตั้งชื่อหน้าไม่ได้ (ผมไม่แน่ใจว่า namespace นับด้วยหรือเปล่า) --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 16:11, 23 พฤศจิกายน 2567 (+07)
::: [[mw:Page title size limitations]] อธิบายเรื่องนี้ไว้ และการขยายเพิ่มให้มากกว่า 255 ไบต์ ก็ไม่ง่าย เพราะต้องลงไปแก้ถึงระดับ source code และปรับแก้ database อีกหลายขั้นตอน แน่นอนว่า เขาไม่ทำให้เฉพาะเราแน่นอน วิกิที่อื่นเขาก็ไม่ทำ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 16:39, 23 พฤศจิกายน 2567 (+07)
:: ต้นสาเหตุก็มาจากภาษาอังกฤษนั่นแหละ คนพี่ลองดู [[en:Category:Proto-Northeast Caucasian language|Proto-Northeast Caucasian language]] นี้ ชื่อเขาตั้งเดิมก็ยาวอยู่แล้ว ถ้าจะแปลภาษามอญยังไงก็ต้องยาวอยู่แล้ว เรื่องนี้ต้องทำยังไงดีผมคิดไม่ออกแล้วล่ะ อันที่จริงผมไม่รู้อะไรหรอก ผมเอามาตามภาษาอังกฤษนั้น คุณพี่ก็มีความประสบเกี่ยวกับวิกิยู่ ถ้าคุณพี่ลองไปขอพวกเขาจะให้หรือเปล่า คุณพี่ลองไปขอให้หน่อยได้ไหม ผมก็คิดไม่ออกแล้วล่ะ ความที่ผมต้องการแค่อยากจะปรับปรุงภาษามอญเจริญมากขึ้นคนมอญจะอยู่เมืองนอกก็สำหรับพวกเขาจะได้มีประโยชน์บางอย่างความที่ผมต้องการแค่นั้น การกระทำผมทั้งหมดอ่านภาษาอังกฤษแล้วก็แปลเอาไว้ไม่มีเพิ่มเติมความคิดตัวเอง เมื่อก่อนผมเคยไปขอเอาไว้ในหน้า [https://phabricator.wikimedia.org/T327270 Request to build a letter length category for Mon Wiktionary] นี้ ผมคิดว่าน่าจะพวกเขาไม่ค่อยวางใจผม ผมก็ทำงานมานานแล้ว ไม่เคยมีสิทธิ์ใดๆ คนที่ให้กำลังใจก็ไม่มี บางครั้งผมก็น้อยใจมาก ผมก็ต้องออกหาเงินเพื่อจะได้ใช้ต่อวิกิ บางคนก็น่าจะไม่เข้าใจการกระทำผมหรือเปล่า ถ้าคิดไปเรื่องนี้ผมก็น้อยใจมาก การกระทำผมทั้งหมดแค่อยากจะปรับปรุงเท่านั้น--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 17:33, 23 พฤศจิกายน 2567 (+07)
::: เขารวมปัญหาข้อเดียวกันนี้ไปที่ [https://phabricator.wikimedia.org/T325665 Increase title length] ซึ่งสร้างมาตั้งแต่ปี 2022 ดูแล้วยังมีอีกหลายภาษาที่อยากได้เหมือนกัน แต่คงยังไม่ทำในเร็ว ๆ นี้ ถ้าปัญหาใหญ่พอ เขาก็คงทำให้ เพราะมันไม่ใช่การแก้ตัวเลขตัวเดียว การเปลี่ยนแปลง database จะกระทบข้อมูลที่มีอยู่เป็นล้าน ๆ หน้า ตอนนี้เราก็ทำอย่างอื่นไปก่อน ในเมื่อมันยังไม่ support เราก็ยังไม่ต้องใส่ใจ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 19:20, 23 พฤศจิกายน 2567 (+07)
::: ครับผมขอบคุณมากครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 22:35, 23 พฤศจิกายน 2567 (+07)
:: สวัสดีครับคุณพี่ถ้ามีเวลาว่างกรุณาลองตรวจสอบให้หน้า [[mnw:中有]] นี้หน่อย ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 06:51, 26 พฤศจิกายน 2567 (+07)
:: เออคุณพี่ครับ ผมแก้ไขสำเร็จแล้วครับ ขออภัยที่ต้องรบกวน--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 07:11, 26 พฤศจิกายน 2567 (+07)
:: คุณพี่ครับช่วยอัพเดทให้อัน [[mnw:မဝ်ဂျူ:Hani-sortkey/data/serialized]] นี้หน่อย ผมอัพเดทไม่ได้ เพราะว่าไฟล์มันเยอะมาก คอมพิวเตอร์ผมไม่ไหว--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 14:45, 26 พฤศจิกายน 2567 (+07)
:: คุณพี่ครับ หมวดหมู่ terms with non-redundant non-automated sortkeys นี้ ต้องถอดออกอย่างไรบ้าง คุณพี่ถอดออกให้หน่อยได้ไหม ผมคิดว่ามันรบกวนใส่ตาผู้อ่าน ผมเอาหมวดหมู่ที่จำเป็นเท่านั้นที่ไม่จำเป็นหรือไม่สำคัญผมอยากถอดออกทั้งหมด เพราะว่าผมไม่อยากรบกวนสายตาผู้อ่าน คนมอญส่วนใหญ่ก็พวกเขาไม่ค่อยรู้เรื่องการเทคโนโลยีรวมผมด้วยดังนั้นผมก็ไม่อยากรบกวนสายตาพวกเขาด้วย คนพี่ลองดูในหน้า [[mnw:中有]] นี้--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 16:34, 26 พฤศจิกายน 2567 (+07)
:: คุณพี่ครับถ้ามีเวลาว่างลองตรวจสอบให้หน้า [[mnw:注音符號]] นี้หน่อย มี Error อะไรผมตอบไม่ถูกครับ ผมลองพยายามแก้ไขแล้วแต่ไม่เห็นต้นสาเหตุ ผมก็ไม่เข้าใจด้วย--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 22:46, 26 พฤศจิกายน 2567 (+07)
:: คุณพี่ครับถ้ามีเวลาว่างกรุณาตรวจสอบให้หน้า [[mnw:ဗညာ]] นี้หน่อย ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 22:56, 28 พฤศจิกายน 2567 (+07)
:: คุณพี่ครับถ้ามีเวลาว่างกรุณาลองตรวจสอบให้หน้า [[mnw:chú]] นี้หน่อย มีปัญหา Error เกี่ยวข้องกับภาษา mkh-vie-pro omx อยู่ครับ ผมก็ต้องไปแก้ไขที่ไหนไม่ทราบครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 09:34, 29 พฤศจิกายน 2567 (+07)
::: คุณพี่ครับถ้ามีเวลาว่างลองตรวจสอบให้หน้า [[mnw:လီး]] นี้หน่อยนะ ยังมี Error อยู่ครับ ผมก็ไม่ทราบต้นสาเหตุแก้ไขไม่ถูก ขอบคุณมากๆนะ คุณพี่ --<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 13:26, 29 พฤศจิกายน 2567 (+07)
:: สวัสดีครับคุณพี่ ถ้ามีเวลาว่างช่วยตรวจสอบให้หน้า [[mnw:する]] นี้หน่อยครับ มี Error อยู่ครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 14:24, 30 พฤศจิกายน 2567 (+07)
::: เออคุณพี่ครับ ผมแก้ไขสำเร็จแล้วนะครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 15:32, 30 พฤศจิกายน 2567 (+07)
:: คุณพี่ครับ [[mnw:မဝ်ဂျူ:ja-see]] นี้จะได้ใช้งานได้ช่วยอัพเดทให้หน่อย ผมพยายามอัพเดทอย่างไรก็ไม่ได้ ลองดู [[mnw:為る]] นี้ครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 16:26, 30 พฤศจิกายน 2567 (+07)
:::: คุณพี่ {{ping|Octahedron80}} ครับ third แล้วก็ oxytone นั้น ต้องไปแปลที่ไหน หรือว่าเป็นออโต้เปล่า ผมพยายามแค่ไหนก็ค้นหาไม่เจอ ผมเองก็หมดวิธีต่างๆ ที่ผมเข้าใจ คุณพี่ถ้ามีเวลาว่างช่วยหน่อยนะ นอกจากคุณพี่ไม่มีใครช่วยผม มีแต่คุณพี่คนเดียว แนวทางผมไม่เข้าใจทางเทคโนโลยี CSS code คุณพี่ลองดูในหน้า [[mnw:νύξ]] นี้ third ต้องแปลแล้วก็เรียกว่า တတိယ และ oxytone นั้นเรียกว่า အံက်ဇြဳတေုန် ช่วยหน่อยนะ ตอนนี้ผมยอมแพ้แล้วล่ะ เพราะว่าเสียเวลาหาไม่เจอแสบตาด้วย นั่นแหละต้นสาเหตุบังเอิญผมไม่เข้าใจ ผมก็พยายามจะได้เข้าใจ แต่ไม่มีใครแสดงให้ผมเห็น ถ้าไม่มีใครแสดงให้ผมเห็นยังไงก็ผมไม่เข้าใจหรอก ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 12:06, 1 ธันวาคม 2567 (+07)
::::: เรื่อง third ขอแนะนำว่าควรเปลี่ยนไปใช้ตัวเลขดีกว่า เพราะผมไม่รู้การเขียนเลขเป็นคำมอญ ซึ่งมันก็มีทั้งมอญแบบเดิมจริง ๆ กับมอญที่ยืมบาลีมา และมีทั้งจำนวนนับเหมือนเบอร์โทร นับจำนวนมากน้อย และนับอันดับที่ มันก็จะยุ่งเหยิงไปกันใหญ่ ถ้าใช้ตัวเลขก็จะมีข้อดีคือ ใช่แค่ตัวอักษรเดียว (ก็คือตัวเลข) และอีกทั้ง first second third etc. มันเป็นคำที่ใช้กับมอดูลภาษาอังกฤษ เราคงไปแก้มันไม่ได้ ส่วนเรื่อง oxytone ผมไม่ทราบว่ามันแปลว่าอะไร --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 22:04, 1 ธันวาคม 2567 (+07)
:: ตอนนี้ผมแก้ไข oxytone ได้แล้ว ที่ผมแก้ไขไม่ได้ก็ third นั่นแหละ คุณพี่ลองดู [[:zh:模組:Grc-headword]] นั้นได้นะ เขาทำอย่างไรเอาไว้ผมก็ยังไม่ทราบ ผมไป Copy เอาของเขาลองใช้ดูก็ไม่ได้ เรื่องนี้น่าจะคุณพี่เข้าใจ คำแปลมีดังนี้( ["first"] = "ပထမ", / ["second"] = "ဒုတိယ",/ ["Attic"] = "အာက်ဒေတ်",/ ["third"] = "တတိယ",/ ["irregular"] = "ဟွံတဝ်ဟွံညဳသာ",)ครับ ผมควรทำอย่างไรก็ยังไม่ทราบครับ จะงงแล้วล่ะ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 00:26, 7 ธันวาคม 2567 (+07)
:::::: คุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาว่างลองตรวจสอบ [[mnw:ولایتی]] นี้หน่อยครับเพราะว่ามี Error อยู่ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 00:31, 7 ธันวาคม 2567 (+07)
:: สวัสดีครับ คุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาว่างลองตรวจสอบ [[mnw:franc]] นี้หน่อยครับเพราะว่ามี Error อยู่ในภาษาฝรั่งเศส ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 11:27, 11 ธันวาคม 2567 (+07)
:: คุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาว่างช่วยกรุณาแก้ไขให้อัน [[mnw:မဝ်ဂျူ:fr-headword]] นี้หน่อย ผมพยายามแค่ไหนก็ไม่ได้มี Error อยู่ ลองดูหน้า [[mnw:militaire]] นี้ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 19:25, 17 ธันวาคม 2567 (+07)
:::: คุณพี่ครับถ้ามีเวลาว่างช่วยลบออกให้ s นี้หน่อย ผมไม่ทราบต้องไปลบอันไหน กำลังพยายามแค่ไหนก็ไม่ได้ ลองดูหน้า [[mnw:militar]] นี้ครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 01:15, 18 ธันวาคม 2567 (+07)
คุณพี่ครับถ้ามีเวลาว่างช่วยแก้ไขให้ [[mnw:မဝ်ဂျူ:accel]] นี่หน่อย มี Error อยู่ครับ ลองดูหน้า [[mnw:militi]] นี้ครับ ผมก็ไม่ทราบมันสาเหตุอะไร ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 19:58, 18 ธันวาคม 2567 (+07)
:: คุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาว่างช่วยแก้ไขให้อัน [[mnw:မဝ်ဂျူ:ar-verb]] นี้หน่อย มี Error อยู่ครับลองดูหน้า [[mnw:يشمس]] นี้ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 17:49, 20 ธันวาคม 2567 (+07)
::: เนื่องจาก [[Module:table]] มีการเปลี่ยนชื่อฟังก์ชัน shallowcopy→shallowCopy กับ deepcopy→deepCopy (ซึ่งก็ไม่รู้จะเปลี่ยนทำไม) จะทำให้กระทบอีกหลายมอดูลเป็นวงกว้าง ต้องแก้อีกหลายจุด ไทยเราก็มีปัญหานี้เหมือนกัน --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 08:12, 21 ธันวาคม 2567 (+07)
::: ขอบคุณมากๆ ครับ ผมก็ไม่ค่อยเข้าใจเกี่ยวข้องกับรหัส CSS ดังนั้นช่วยตัวเองไม่ได้ต้องไปขอความช่วยเหลือผู้อื่น ผมก็กำลังพยายามจะได้เข้าใจ แต่ไม่มีใครแสดงให้ผมเห็น ถ้าผมไม่เห็นกับตา ยังไงก็ผมไม่เข้าใจหรอก--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 09:20, 21 ธันวาคม 2567 (+07)
:: คุณพี่ครับ Error หน้า [[mnw:ထာမ်ပလိက်:arc-noun]] นี้ หมายความว่าอะไรผมไม่ทราบครับ ถ้าคุณพี่มีเวลาว่างอีกก็ช่วยดูให้หน่อยนะ ผมก็ทำอะไรไม่เป็น ดังนั้นยังไงก็ผมขออนุญาตรบกวนด้วยนะ ในวิกิมีเดียผมก็ไปขอความช่วยเหลือผู้อื่นไม่ได้ มีแต่คุณพี่คนเดียวนั่นแหละ ขอบคุณอีกครั้งนะสำหรับช่วยให้เรา--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 09:20, 21 ธันวาคม 2567 (+07)
::: หน้า [[mnw:يشمس]] ก็ยังมีอยู่นะ มันใช้งานยังไม่ได้ครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 09:26, 21 ธันวาคม 2567 (+07)
:::: นี่ยังแก้ไม่ได้ หาสาเหตุไม่เจอ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 08:26, 23 ธันวาคม 2567 (+07)
:: คุณพี่ครับใน [[mnw:မဝ်ဂျူ:pt-headword]] ช่วยลบออกให้ s หน่อย ผมก็ไม่ทราบอันไหนเป็น s ลองดูในหน้า [[mnw:ínsula]] ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 23:28, 22 ธันวาคม 2567 (+07)
:: คุณพี่ครับ languages นี้ต้องไปแปลที่ไหนบ้างครับแล้วก็ต้องสลับยังไงเอาตาม languages ဘာသာ (Thai language = ဘာသာသေံ) นี้นะ ถ้าเป็นไปได้คุณพี่ใส่ให้ด้วยนะ เพื่อตัวอย่างลองดูในหน้า [[mnw:آڑو]] ครับ ขอบคุณครับ
[[ไฟล์:Taikadai-en1.png|thumb|กลุ่มภาษาไท]]
::: “language” แปลว่า ภาษา ส่วน “languages” แปลว่า กลุ่มภาษา หรือ “group of languages” มีค่าเท่ากับ “family” ไม่ได้แปลว่า มีภาษาหลายอันซ้ำกัน // เช่น Tai languages คือกลุ่มภาษาไท (ไม่ใช่ภาษาของ သေံ สยาม คุณต้องอ่านมันว่า ไท หรือ ไต) ซึ่งมีทั้งในไทย=สยาม และนอกสยาม (อินเดีย พม่า ลาว เวียดนาม จีน) และ Tai languages (กลุ่มภาษาไท) ก็ไม่เท่ากับ Thai language (ภาษาไทย=สยาม) ด้วย เพราะ Thai language เป็นภาษาหนึ่งที่อยู่ภายใต้ Tai languages เท่านั้น // หากใช้ ဘာသာဂမၠိုင် อาจจะเข้าใจเป็นอย่างอื่นไหม หรือควรจะเปลี่ยนเป็น family คุณลองพิจารณาว่า ใช้คำไหนอ่านแล้วไม่เข้าใจผิดเป็นอย่างอื่น --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 20:29, 24 ธันวาคม 2567 (+07)
:: คืออย่างนี้ครับคุณพี่ ผมอธิบายไปแบบง่ายๆและกันน็อค ถ้าเอาตามเสียง Thai =ထာၚ် / Tai= တိုၚ် มันกลายเป็นคำตลกในภาษามอญของเรา ดังนั้นเราก็ไม่ใช้คำนั้น ถ้าใช้ไปตามออกเสียง Thai =ထာၚ် / Tai= တိုၚ် นั้นแล้วก็สำหรับผู้อ่านมีความคิดหลายอย่างได้ เราก็ใช้เฉพาะเป็น သေံ ตามประวัติศาสตร์ ถ้าใช้เป็น သေံ มีคนเข้าใจมาก คำอังกฤษ “group of languages” นี้ ถ้าต้องแปลภาษามอญมันเรียกว่า (group=ဂကောံ/of=ဆေၚ်စပ်ကဵု/ languages=ဂမၠိုၚ် “ဂကောံဆေၚ်စပ်ကဵုဘာသာ“) คำมอญ ဂမၠိုၚ် นี้ เราไม่ได้ใช้เหมือนภาษาอังกฤษ เราใช้เฉพาะคำสุดท้าย เมื่อใช้คำมอญ ဂမၠိုၚ် นี้ ต้องระวังมากขึ้นและต้องสังเกตมากขึ้นด้วย เมื่อแปลภาษาอังกฤษบางคำต้องตัดออก ใช้ไปทั้งหมดไม่ได้ บางครั้งต้องเพิ่มเติมก็มีอีก คำนี้ “family” เรียกว่า '''ဝေါၚ်သ''' แต่เมื่อใช้คำนี้ต้องระวังด้วย สำหรับจะได้แปลภาษาถูก ต้องอ่านต้นกำเนิดด้วย ในภาษามอญของเราคำออกเสียงเหมือนกันแต่ความหมายไม่เหมือนมีเยอะแยะ ดังนั้นเมื่อเราเขียนภาษามอญต้องระวังด้วย เพื่อตัวอย่างลองดูค้ำ ကိုတ် ကတ် ๒ นี้ แต่ความจริงก็เรียกว่าเสียงเบากับเสียงหนัก ในภาษาพม่าก็มีด้วย ตัวอย่างเช่น ပြတ် ပျက် คำออกเสียงเหมือนกันเป็นแบบนี้มีแต่ในภาษามอญมากกว่า ถ้าต้องแปลตามแบบ “family Tai languages” นี้ เรียกว่า '''ဝေါၚ်သဘာသာသေံ''' ไหนๆ ก็ต้องตัดออก '''s''' ตัวอย่างเช่น (Languages by family= အရေဝ်ဘာသာနူကဵုဝေါၚ်သ) ไหนๆ ก็ต้องเพิ่มไป အရေဝ် นี้เพื่อคำเต็ม ผมอยากจะแนะนำให้คุณพี่ว่าอย่างอื่นไม่ต้องไปใส่ก่อน รอให้ผมอ่านต้นกำเนิดก่อน ถ้าผมยังไม่ได้อ่านต้นกำเนิด แปลไปตามเห็นแล้วก็น่าจะมีความผิดก็ได้ เพราะว่าเกี่ยวข้องกับคำ group, family, language, languages, of ออกได้ความหมายจำนวนมาก ดังนั้นคุณพี่ไม่ต้องไปใส่ใจอย่างอื่นเสียเวลา ใส่ให้ผม languages เป็น ဘာသာ ก็พอ ผมก็ยังไม่ได้อ่านต้นกำเนิด ดังนั้นผมก็พูดอะไรไม่ได้ ตอนนี้ผมมองเห็นสาเหตุปัญหา languages เท่านั้น อย่างอื่นยังไม่เจอ ดังนั้นผมก็ไม่ทราบต้นกำเนิด ในหน้า [[mnw:آڑو]] หมวดหมู่ '''ဝေါဟာအူရဒူကၠုင်နူဝေါဟာအဳရာန် languagesဂမၠိုင်''' นั้น ผมอยากได้ '''ဝေါဟာအူရဒူကၠုင်နူဝေါဟာဘာသာအဳရာန်ဂမၠိုင်''' ครับ คุณพี่แก้ไขแค่นั้นก็พอ เพราะว่าในวิกิพจนานุกรมภาษามอญของเรายังมีปัญหาอักษรอยู่ ถ้าเพิ่มไป group, family นี้อีก ทำให้หมวดหมู่อักษรเยอะก็ได้ วิกิพจนานุกรมภาษามอญของเรายังไม่ลงรับเช่นนั้น ดังนั้นเราก็ต้องหาวิธีลดอักษรในหมวดหมู่ เมื่อไหร่พวกเขาจะอนุมัติให้ ผมก็ยังไม่ทราบ ถ้าต้องพูดในใจผม แบบนี้ผมรอไม่ไหวหรอก เพราะว่ามันนานเกิน ในวิกิพจนานุกรมภาษามอญงานทุกอย่างมีแต่ผมคนเดียว ผมเองก็ไม่ค่อยสบาย เงินก็ต้องออกหาเพื่อจะได้ใช้ต่อ ยังไงก็รอไม่ไหวจริงๆ หรอก ผมก็เป็นคนพูดจริงจังแบบนี้แหละ น่าจะคุณพี่เข้าใจสินะ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 13:22, 25 ธันวาคม 2567 (+07)
::: ผมเห็นว่า การที่คุณเปลี่ยนชื่อกลุ่มภาษาไท เป็นกลุ่มภาษาสยาม (သေံ) อาจจะทำให้คนรุ่นหลังเข้าใจผิดว่า กลุ่มภาษานี้มีต้นกำเนิดมาจากสยาม เพราะเขาจะไม่เห็นเหตุผลของคุณบอกไว้ที่นี่ ทั้งที่ความจริงคือ กลุ่มภาษาไทมีต้นกำเนิดมาจากจีนโบราณ นักภาษาศาสตร์ทั่วโลกรู้กันดีว่ากลุ่มภาษานี้ชื่อว่า ไทหรือไต // อีกอย่างนึง ไทหรือไต มันเป็นแค่ชื่อที่เรียก คุณสามารถใช้ ထာၚ် หรือ တိုၚ် ก็ได้ไม่มีปัญหา (หรือคุณอาจสะกดแบบอื่นให้ออกเสียงเหมือนกันก็ได้) ไม่ว่าความหมายจะดีหรือไม่ เพราะเป็นชื่อของมัน สมมติว่า มีคนที่ชื่อสมชาย แต่คุณไม่ชอบชื่อสมชาย แล้วคุณไปเปลี่ยนเขาใหม่ว่าสมพงศ์ มันก็ไม่ได้ เพราะสมพงศ์ไม่ใช่ชื่อของเขา ถูกไหมครับ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 08:51, 27 ธันวาคม 2567 (+07)
ถ้าจำเป็นต้องใช้แล้วก็เอาตาม (Thai terms borrowed from family Tai languages = ဝေါဟာသေံလွဳလဝ် နူဝေါဟာဘာသာဂကူဝံသသေံဂမၠိုင် / Thai terms borrowed from group Tai languages = ဝေါဟာသေံလွဳလဝ် နူဝေါဟာဂကောံဘာသာသေံဂမၠိုင် / Thai terms inherited from family Tai languages = ဝေါဟာသေံဂွံလဝ်အာဲကၟာဲနူဝေါဟာဘာသာဂကူဝံသသေံဂမၠိုင် / Thai terms inherited from group Tai languages = ဝေါဟာသေံဂွံလဝ်အာဲကၟာဲနူဝေါဟာဂကောံဘာသာသေံဂမၠိုင်) นี้นะคุณพี่ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 14:43, 25 ธันวาคม 2567 (+07)
::: คุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาว่างช่วยแก้ไขให้ [[mnw:မဝ်ဂျူ:lo-pron]] นี้หน่อย มี Error อยู่ครับ ลองดูหน้า [[mnw:ໄມ້ກວາດ]] ครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 22:14, 29 ธันวาคม 2567 (+07)
:: คุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาว่างช่วยแก้ไขให้ [[mnw:မဝ်ဂျူ:fr-headword]] นี้หน่อย มี Error อยู่ครับ ลองดูหน้า [[mnw:bilié]] ครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 20:51, 1 มกราคม 2568 (+07)
::: คุณพี่ {{ping|Octahedron80}} ครับ ปัญหา [[mnw:тэнхлүүн явахад тэмээгээр тусалснаас тэвдэж явахад тэвнээр тусалсан нь дээр]] นี้มันคืออะไรช่วยบอกให้หน่อยได้ไหม ผมไม่รู้เรื่องครับแล้วไม่เข้าใจด้วย--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 15:44, 16 มกราคม 2568 (+07)
:::: อันนี้ก็ปัญหาเดิม คือชื่อยาวเกิน มันช่วยไม่ได้ครับ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 19:07, 22 มกราคม 2568 (+07)
:: คุณพี่ {{ping|Octahedron80}} ถ้ามีเวลาว่างช่วยแก้ไขให้ [[mnw:cats]] นี่หน่อย ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 15:55, 24 มกราคม 2568 (+07)
==blt-pron==
สวัสดีครับ ทราบไหมครับว่าทำไม <nowiki>{{blt-pron|ꪶꪎꪣ-ꪻꪊ}}</nowiki> ไม่ทำงาน ขอบคุณครับ --[[ผู้ใช้:Alifshinobi|A.S.]] ([[คุยกับผู้ใช้:Alifshinobi|คุย]]) 17:45, 23 พฤศจิกายน 2567 (+07)
: เพราะมี ZWNJ อยู่ข้างในครับ <nowiki>{{blt-pron|ꪶꪎꪣ#-ꪻꪊ}}</nowiki> ตรง # // ใช้ BabelMap สามารถมองเห็นได้--[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 19:10, 23 พฤศจิกายน 2567 (+07)
:: ขอบคุณมากครับ ผมมองไม่เห็นตอนแรก --[[ผู้ใช้:Alifshinobi|A.S.]] ([[คุยกับผู้ใช้:Alifshinobi|คุย]]) 19:51, 23 พฤศจิกายน 2567 (+07)
==[[ခလာမ်]]==
คุณพี่ {{ping|Octahedron80}} ครับ ที่คุณพี่ใส่เอาไว้ /hə.lam/ หรือ kʰa.laːm นั้น ไม่เกี่ยวข้องประเทศพม่าหรือประเทศไทย เพราะว่าอันนั้นมันเรียกว่าเป็นคำอ่านกับเป็นคำพูดครับ ไม่สนเกี่ยวข้องไทย-พม่า และ ခလာမ် นั้น ไม่ใช่รูปแบบการเขียนครับ เป็นรูปแบบการออกเสียงครับ ในภาษามอญของเรามี ๔ ประเภท ๑. การออกเสียงอ่านหนังสือเรียกว่าวรรณกรรม ๒. เป็นคำพูดตามชาวบ้าน ๓. เป็นคำพูดพุทธศาสนิกชน ๔. เป็นคำพูดให้มีการสมควร หรือ เรียกว่าการพูดมีวัฒนธรรม (ตัวอย่างเช่น: "နာဲစပုၚ်တုဲယျဟာ นายกินข้าวยัง" ลองดูตัวอย่างคำพูด [[ပိ]] สังเกตได้ชัดเจนว่าทำไมมีการออกเสียง ๒ ประเภท เพราะว่าต้นสาเหตุคำพูดนั้นฟังแล้วไม่เพราะ นักวิชาการชาวมอญก็ต้องเปลี่ยนการออกเสียงให้มีสมควร ภาษามอญของเราก็เปลี่ยนแปลงมาเรื่อยๆ ถ้าผู้ที่มีการศึกษาน้อยเขาไม่รู้เรื่องนี้หรอก ถ้าเขาจะได้รู้เรื่องนี้ต้องมีผ่านการตรวจสอบจะนักวิชาการชาวมอญ การศึกษาภาษามอญในประเทศไทยไม่มีหรอก ในประเทศไทยนั้นเฉพาะสอนการเป็นความรู้เล็กๆน้อยๆโดยไม่มีกฎระเบียบ นั่นแหละภาษามอญในประเทศไทยใช้การอยู่เราไม่ยอมรับเพราะว่าไม่ตรงกับวรรณกรรม ผมจะกล้าพูดแบบนี้เพราะว่าผมเองก็ผ่านการศึกษามาเยอะแล้วด้วยกฎระเบียบเข้มงวด ผมออกจากวิทยาลัยมอญในเมืองมอละมไยน์ยังไม่นาน ผมเองก็มีใบอนุญาตการศึกษาด้วย) ผมพูดไปแค่นี้น่าจะคุณพี่เข้าใจสินะ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 15:26, 29 พฤศจิกายน 2567 (+07)
:คุณต้องเข้าใจก่อนว่าที่ผมเขียนว่า [[พม่า]] หรือ [[ไทย]] ไว้นั้น หมายความว่า พม่าอ่านแบบนี้ ไทยอ่านแบบนี้ คุณไม่สามารถตีความว่า ไทยอ่านแบบนี้แล้วผิด เพราะในไทยเขาอ่านแบบนี้กัน ไม่ใช่พม่า เราอยู่คนละประเทศ ย่อมอ่านแตกต่างกันได้ คุณจะบังคับให้คนมอญที่ไทยไปอ่านอย่างคนมอญที่พม่าไม่ได้ เพราะเขาคุยไม่เข้าใจกัน ถ้าคุณจะบังคับให้อ่านเหมือนพม่าทั้งหมด มันก็ไม่ต่างกับ[[เผด็จการ]]ของประเทศคุณ เหมือนภาษาที่มีในหลาย ๆ ประเทศ ยกตัวอย่างภาษาอังกฤษ เขียนเหมือนกัน แต่อ่านต่างกันก็ได้ หรือบางทีก็เขียนต่างกัน หรือบางทีคำศัพท์ก็มีเฉพาะประเทศนั้น ๆ ที่อื่นไม่มี ก็ด้วย เช่น ภาษาอังกฤษใน[[สหรัฐอเมริกา]]ก็อ่าน/เขียนอย่างนึง ภาษาอังกฤษใน[[ยุโรป]]ก็อ่าน/เขียนอย่างนึง ภาษาอังกฤษใน[[ออสเตรเลีย]]ก็อ่าน/เขียนอย่างนึง เป็นต้น ถึงคุณจะเรียนภาษามอญ[[มาตรฐาน]]มา คุณก็ต้องเข้าใจว่าใน[[ท้องถิ่น]]ก็มีภาษาของเขาเองเรียกว่า[[ภาษาถิ่น]] ([[dialect]]) ถ้าคุณไม่ยอมรับภาษาถิ่นก็เท่ากับ[[ภาษาศาสตร์]]ที่คุณเรียนไปสูญเปล่า --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 15:33, 29 พฤศจิกายน 2567 (+07)
::: ที่คุณพี่พูดมาผมเข้าใจสิครับ แต่ผมไม่ได้หมายความว่าอย่างนั้น ที่ /hə.lam/ นั้น คุณพี่ใส่เอาไว้ ([[ไทย]]) นั่นแหละเป็นความเข้าใจผิดของคุณพี่ /hə.lam/ นั้น ไม่ใช่มอญประเทศไทยอย่างเดียวใช้งานอยู่ มอญทั่วโลกก็ใช้อยู่นะ อันนั้นหมายความว่าอะไรคุณพี่ต้องศึกษาให้ชัดๆก่อน ตอนนี้คุณพี่ก็ยังไม่ได้ศึกษาให้ลึกๆ ซึ้งๆ จะมาเถียงกับเจ้าของภาษาไม่สมควรนะครับ คนมอญด้วยการคำพูดไม่ค่อยเหมือนกันผมรู้สิครับอันนั้นเป็นเฉพาะสำเนียงไม่ใช่คำพูดมีอยู่แบบนั้นไม่ใช่ประเทศไทยอย่างเดียวประเทศพม่าก็มีสิครับถ้าคุณพี่ไม่เชื่อผมพาไปให้ดูถ้าคำพูดไม่เหมือนผมกล้าพูดอันนั้นไม่ใช่ ภาษามอญแล้วละ ผมสามารถพูดคุยได้ ๑๒ ภาษา ถ้าคุณพี่ไม่เชื่อลองมาตรวจสอบก็ได้ ผมเองก็เขียนได้ภาษามอญเก่า, ภาษามอญกลาง, ภาษามอญยุคสมัย ถ้าคุณพี่ไม่เชื่อพามาคนไหนก็ได้ผมยอมให้พิสูจน์ ผมเองก็คือพบเจอพจนานุกรมไทยมอญเขียนเอาไว้แบบผิดๆ อักษรไทยมอญและการเขียนนั้น คืออะไร มีประวัติอย่างไร ภาษามอญการเปลี่ยนแปลงอย่างไร คุณพี่ศึกษาให้ลึกๆ ซึ้งๆ ก่อน ผมไม่เอาความรู้จากสมองผู้อื่น ผมอยากได้ความรู้จากคุณพี่ตนเอง การพูดภาษามอญและการเขียนภาษามอญ ไม่เหมือนอย่างไร แตกต่างอย่างไร อันนั้นก็คุณพี่ต้องศึกษามาด้วย ผมยินดีคุณพี่สนใจภาษามอญแต่ที่ผมไม่ยินดีก็ภาษามอญของเราเอาไปทางที่ผิดๆ ดังนั้นผมก็ห่วงมาก ผมเป็นเจ้าของภาษามอญขออนุญาตให้มีสิทธิ์ห่วงด้วยครับ ดังนั้นเกี่ยวข้องกับภาษาไทยผมก็ต้องฟังคำพูดเจ้าของภาษาด้วยนั่นแหละ ถ้าเกี่ยวข้องกับภาษาไทยคุณพี่พูดอะไรผมก็ต้องฟังอยู่ดีเพราะผมไม่ใช่เจ้าของภาษาไทย เกี่ยวข้องกับภาษาไทยการอ่อนแอก็มีเพราะผมไม่ใช่เจ้าของภาษาไง ถ้าเกี่ยวข้องกับภาษามอญผมไม่ฟังใครหรอกนอกจากครูบาอาจารย์ผม เพราะการศึกษาภาษามอญของผมไม่ใช่ต้อยตาม คุณพี่เห็นการกระทำผมน่าจะเข้าใจสิแล้วล่ะเมื่อไหร่ก็ดูผลงานผมในวิกิพจนานุกรมภาษามอญได้ คุณพี่ก็รู้ ใน Google แปลภาษายังไม่มีภาษามอญ ดังนั้นการแปลภาษามอญ ต้องใช้เฉพาะสมองเท่านั้น วันๆจะได้แปลภาษาสักทีไม่ใช่เรื่องง่าย ถ้าคนที่มีความรู้เล็กๆ น้อยๆ สามารถแปลภาษาไม่ได้หรอก ผมสามารถกล้าพูด ถ้าคุณพี่คิดว่าคนอื่นเก่ง ลองพามาสักหน่อยครับ ถ้าแปลภาษาได้เหมือนผม ผมให้เงินเดือนครับแต่การกระทำของเขาต้องมีความรับผิดชอบ ต้องมีเอกสารทางรัฐบาลรับรองด้วยต้องมีใบอนุญาตจบการศึกษาเกี่ยวข้องภาษามอญด้วย ผมมีนะ ผมมีเอกสารรับรองจากรัฐบาลด้วยนะและมีใบอนุญาตจบการศึกษาด้วยถ้าคุณพี่ต้องการอยากดูใบอนุญาตจบการศึกษาหรืออื่นๆ เมื่อไหร่ก็ติดต่อมาได้ผมยินดีให้ดู ที่คุณพี่คิดว่าเขาเก่งลองสอบถามซิเขามีใบอนุญาตเหมือนผมไหม ถ้าเขาไม่มีใบอนุญาตเหมือนผม ผมฟ้องคดีตามกฎหมายประเทศพม่าได้นะ แต่ประเทศไทยผมยังไม่ทราบเกี่ยวข้องกับการใบอนุญาตออกหนังสือและใบอนุญาตนักเขียน ในวิกิพีเดียภาษาไทยคุณพี่ก็รู้อยู่ใช่ป่ะ เขาป้องกันภาษาไทยเอาไว้แค่ไหนและผมล่ะ ไม่มีสิทธิ์ป้องกันภาษาตนเองแล้วหรอ ถ้าอย่างนั้นมีความยุติธรรมไหมครับ คุณพี่รักสัญชาติไทยไหม แต่สำหรับคุณพี่ผมไม่ทราบนะ สำหรับผมก็รักสัญชาติมอญเท่ากับชีวิตตนเอง การกระทำผมตอนนี้หรือการพูดผมตอนนี้เฉพาะความรักต่อชาวมอญเท่านั้น แล้วผมก็มีความเคารพต่อคนไทยด้วยนะ เมื่อคนไทยเขาพูดอะไรผมก็ฟังอยู่นะ ผมเขียนไปยาวแล้วล่ะ ผมเขียนเยอะไปแค่นี้น่าจะคุณพี่เข้าใจความรู้สึกผม ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 22:14, 29 พฤศจิกายน 2567 (+07)
==ขอยืม bot==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ ผมมี bot ตัวเองก็จริง ตอนนี้ยังไม่ได้เข้าใจวิธีการใช้เพราะว่าอย่างนั้น ผมอยากจะขอยืม bot ของคุณพี่ ผมต้องการว่า ในหน้า ပါဠိမန် ทั้งหมดนั้นมีหมดหมู่ [[:mnw:ကဏ္ဍ:ဝေါဟာပါဠိမန်နွံပ္ဍဲအဘိဓာန်ဂမၠိုင်]] อยากจะให้เปลี่ยนเป็นหมวดหมู่ [[:mnw:ကဏ္ဍ:ဝေါဟာအဓိကပါဠိမန်ဂမၠိုင်]] ทั้งหมดก็มีหน้า ๒๐๐๐ กว่ายังไงก็ต้องใช้ bot เรื่องนี้คุณพี่ช่วยให้ได้ไหม ลองดูเพื่อตัวอย่างในหน้า [[mnw:ကက္ကာရဳ]] นี้ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 16:40, 6 ธันวาคม 2567 (+07)
::ได้ครับ แต่การแก้ไขของบอตที่ยังไม่ได้ bot flag อาจจะทำให้ timeline น่ารำคาญนิดหน่อย --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 17:00, 6 ธันวาคม 2567 (+07)
::: ครับผมขอบคุณมากครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">ด็อกเตอร์.อินโดเบสะ</span>]]|[[User talk:咽頭べさ|พูด]]</span> 18:35, 6 ธันวาคม 2567 (+07)
== ขอความช่วยเหลือ ==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ [[:mnw:မဝ်ဂျူ:eo-headword]] นี้ช่วยแก้ไขให้หน่อยได้ไหม ผมพยายามอย่างไรก็ไม่สำเร็จ แล้วไม่ทราบวิธีด้วย ลองดูหน้า [[:mnw:aŭguri]] นี่ครับ คุณพี่ถ้ามีเวลาว่างช่วยแก้ไขให้หน่อยนะ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 18:18, 16 กุมภาพันธ์ 2568 (+07)
==[[:mnw:မဝ်ဂျူ:gl-headword]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ [[:mnw:မဝ်ဂျူ:gl-headword]] ช่วยลบออก s ให้หน่อยครับ ผมหาไม่เจอครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 18:40, 25 กุมภาพันธ์ 2568 (+07)
==ขอความแนะนำ==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ ที่ %code% นั้น อยากจะเปลี่ยนเป็นรหัสภาษา (คำว่า User th อยากได้ใช้ว่า ညးလွပ် သေံ) ครับ ช่วยแนะนำให้หน่อยนะคุณพี่ ผมอยากได้ใช้ตามวิกิภาษาอังกฤษ ผมคิดว่าเมื่ออนาคตจะได้มีประโยชน์บางอย่าง ช่วยหน่อยนะขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 17:42, 26 กุมภาพันธ์ 2568 (+07)
:ตรงนั้นเปลี่ยนไม่ได้ครับ มันเอาไว้ใส่รหัสภาษา ไม่ใช่ชื่อภาษา และที่จริงคำว่า User ก็ไม่ควรเปลี่ยนด้วย เพราะมันเป็นชื่อแม่แบบและหมวดหมู่ของบาเบล ที่ใช้ข้ามโครงการถึงกัน เช่น User th-N หรือ User en-3 เป็นต้น // อนึ่ง ผมไม่มีสิทธิ์แก้ไขหน้านั้น เพราะผมไม่ใช่แอดมินของภาษามอญ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 08:49, 27 กุมภาพันธ์ 2568 (+07)
:: ผมแก้ไขเองก็ได้ครับแต่ผมแค่อยากจะทราบ %code% นี้ต้องเปลี่ยน langCode ย่างไรบ้าง อยากได้ความแนะนำจากคุณพี่ครับ ขอบคุณมากครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 13:43, 28 กุมภาพันธ์ 2568 (+07)
==[[:mnw:आँखें]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ คุณพี่ครับถ้ามีเวลาว่างช่วยดูให้หน้า [[:mnw:आँखें]] นี้หน่อย ผมก็คิดไม่ออกแล้วล่ะต้องควรทำยังไง--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 11:58, 10 มีนาคม 2568 (+07)
==ปัญหาเรื่องการถอดอักษรละตินเป็นไทย==
สวัสดีครับ ปัจจุบันเพิ่งมีสงครามการแก้ไขหน้านี้ [[sơn ca]] เราควรทำอย่างไรดีกับปัญหาการถอดอักษรละตินให้เป็นอักษรไทยครับ ถ้าอักษรอื่น (ที่ไม่ใช่ละติน) ได้รับการถอดอักษร อักษรละตินเองก็ควรได้รับการถอดอักษรเช่นกัน ผู้ใช้เป้าหมายของวิกิพจนานุกรมไทยคือผู้พูดภาษาไทย เราควรสามารถใช้อักษรไทยเพื่อถอดอักษรอื่นได้ กรุณาออกความเห็นด้วยครับ ขอบคุณครับ --[[ผู้ใช้:Alifshinobi|A.S.]] ([[คุยกับผู้ใช้:Alifshinobi|คุย]]) 19:20, 18 มีนาคม 2568 (+07)
ผมก็อยากให้มีอักษรไทยทุกที่ แต่มันทำไม่ได้ทั้งหมด เพราะบางภาษามีการต่อยอด เอาอักษรละตินที่เป็นผลลัพธ์ถอดมาได้ ไปผันรูปเป็นคำอื่นต่อ ซึ่งอักษรไทยใช้ตรรกะเดียวกันกับเขาไม่ได้ และมันก็จะเป็นงานใหญ่ ถ้าจะทำรองรับหมด ในขณะเดียวกัน เราก็มีคนอยู่แค่นี้ ไม่มีคนดูแลเฉพาะภาษา เราก็ไม่รู้ว่าจะมีอะไรที่แสดงผลไม่ถูกต้องบ้าง เราก็ทำได้แค่ลอกเขามา แล้วปรับแต่งนิดหน่อย--[[พิเศษ:เรื่องที่เขียน/1.46.198.202|1.46.198.202]] 19:31, 18 มีนาคม 2568 (+07)
สำหรับภาษาเวียดนามนั้น เคยทำตัวอักษรละตินถอดเป็นอักษรไทยไว้แล้ว แต่มีปัญหาที่ ภาษาเวียดนามมีอักษรจีน ซึ่งเราไม่สามารถถอดมันออก ต้องเติมเองอยู่ดี--[[พิเศษ:เรื่องที่เขียน/1.46.198.202|1.46.198.202]] 19:34, 18 มีนาคม 2568 (+07)
::ผมคิดว่า มีบ้างก็ดีกว่าไม่มีเลย ถ้ามีผู้ใช้คนไหนต้องการจะเพิ่มการถอดอักษรเป็นอักษรไทย เราก็ไม่ควรมีกฎห้ามหรือกฎว่าต้องเอาออก การมีการถอดอักษรควรถือเป็นสิ่งที่พิเศษขึ้นมา คือมีก็ดี ไม่มีก็ได้ อนึ่ง เราไม่ควรอยู่เฉยจนกว่าโอกาสที่ดีกว่านี้หรือที่สมบูรณ์แบบปรากฏขึ้นเพราะโอกาสเช่นนั้นอาจไม่มีอยู่จริง ขอบคุณครับ --[[ผู้ใช้:Alifshinobi|A.S.]] ([[คุยกับผู้ใช้:Alifshinobi|คุย]]) 19:40, 18 มีนาคม 2568 (+07)
:::ภาษาไหนมีระบบอัตโนมัติแล้ว ก็ต้องเอาที่เขียนเองออกครับ เพื่อไม่ให้ซ้ำซ้อนกัน (มีตัว detect อยู่) แต่ถ้าอัตโนมัติแล้วไม่ใช่ตามที่ต้องการก็อาจให้เขียนเองได้ บางทีก็เกิดกรณีแบบนี้ที่ en--[[พิเศษ:เรื่องที่เขียน/1.46.198.202|1.46.198.202]] 19:46, 18 มีนาคม 2568 (+07)
::::"แต่ถ้าอัตโนมัติแล้วไม่ใช่ตามที่ต้องการก็อาจให้เขียนเองได้" ผมเห็นด้วยกับความเห็นนี้ครับ อย่างไรก็ไม่ควรลบสิ่งที่มีประโยชน์ที่เพิ่มโดยผู้ใช้ออก นอกจากว่าเป็นการเพิ่มข้อมูลผิด ขอบคุณครับ --[[ผู้ใช้:Alifshinobi|A.S.]] ([[คุยกับผู้ใช้:Alifshinobi|คุย]]) 20:01, 18 มีนาคม 2568 (+07)
:::::ใจจริงอยากให้เป็นระบบอัตโนมัติมากกว่าเขียนเองครับ แต่บางภาษานี่แทบเป็นไปไม่ได้ เช่นภาษาอังกฤษ // อนึ่งเวลาผมก๊อปปี้มาจาก en ส่วนมากก็ไม่มี transliteration ผมก็เซฟทับรุ่นเก่าไปไม่ได้ดู --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 22:50, 18 มีนาคม 2568 (+07)
เมื่อก่อน สามารถยกเว้นให้บางภาษาที่ใช้อักษรละตินสามารถถอดเป็นไทยได้ ซึ่งเคยทำไว้สองภาษาคือ eo กับ vi ตอนนี้สคริปต์ปัจจุบัน ตรรกะมันเปลี่ยนไป การทำงานจะไม่ถอดอักษรเลยถ้ามีอักษรละติน แต่ถ้าปิดไม่ให้เช็กเงื่อนไขนี้ ภาษาที่ใช้อักษรละตินทั้งหมดจะขึ้น transliteration needed ซึ่งเราไม่ต้องการแบบนั้น เพราะคำศัพท์กว่า 80% เป็นอักษรละติน ก็เลยปล่อย eo กับ vi ไว้อย่างนั้น จะพยายามหาวิธีใหม่ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 21:34, 18 มีนาคม 2568 (+07)
==สอบถามพูดคุยเรื่อง Bot ครั้งที่สอง==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ คุณพี่ครับสำหรับขับ Bot ไป copy CSS code ของคนอื่นแล้วก็วางลงได้ไหม ผมอยากจะลองดูแบบ [[𪻔]] ที่คุณพี่ทำเอาไว้ ผมสนใจอยู่นานแล้วแต่ผมยังไม่ได้สอบถามคุณพี่เพราะผมเกรงใจ ตอนนี้ไหนๆ ก็ผมต้องสอบถามคุณพี่แล้วล่ะ ถ้าเป็นไปได้ผมอยากจะมาหาคุณพี่ที่บ้านเพื่อศึกษาเรื่องนี้ สำหรับเรื่องนี้ผมเองก็ยังไม่ได้เข้าใจเลยเพราะไม่เห็นกับตา ถ้าเป็นไปได้ผมอยากจะให้คุณพี่เขียน CSS code สำหรับเรื่องนี้พอสมควรทั้งหมดและวิถีขับ Bot ตอนนี้ผมพยายามอย่างไรก็มันขึ้นอยู่ Error ตลอด อย่าคิดว่าผมรบกวนนะ แค่ผมอยากจะได้ความช่วยเหลือจากคุณพี่ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 14:52, 25 มีนาคม 2568 (+07)
==[[มอดูล:also/processed data]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ ผมอยากจะขอเรื่อง [[มอดูล:also/processed data]] ครับ ผมอยากจะขอว่าถ้าคุณพี่มีการอัพเดท ช่วยอัพเดทให้ฝั่งมอญด้วย ถ้าไฟล์ข้อมูลเยอะในคอมพิวเตอร์ผมไม่สามารถเปิดได้ครับ ตอนนี้ก็ผมอยากจะให้คุณพี่อัพเดทให้ฝั่งมอญด้วยครับ ตอนนี้ผมพยายามจะเปิดแค่ไหนเพราะไฟล์ข้อมูลเยอะผมไม่สามารถเปิดได้ครับ ช่วยหน่อยนะคุณพี่ครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 16:14, 25 มีนาคม 2568 (+07)
:คุณต้องลบรายการ 32 หน้า ที่ผมแจ้งลบไว้ก่อนนะครับ หน้าเหล่านั้นถูกตั้งชื่อโดยผิดพลาด ทำให้บอตทำงานไม่ได้ ถ้าลบแล้วบอตถึงจะทำงานได้ // คุณสามารถกดลิงก์ "ประวัติ" แทนได้ เพราะตัวรายการไม่ปรากฏลิงก์ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 11:48, 9 เมษายน 2568 (+07)
:อนึ่ง มอดูลมีการเปลี่ยนชื่อใหม่ และมีหน้าเพิ่มขึ้น --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 13:15, 9 เมษายน 2568 (+07)
:: {{ping|Octahedron80}} สำหรับเรื่องนี้ผมอยากจะให้คุณพี่จัดการเองดีกว่า เพราะว่าผมไม่ค่อยรู้เรื่องเทคโนโลยี--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 17:45, 10 เมษายน 2568 (+07)
== Hello ==
Hi admin, I'm sorry I can only speak English because I don't speak Thai. I'm a [[:m:global rollbacker|global rollbacker]] and I found this [['|broken redirect]] when doing a global patrol. The redirect target has been deleted and protected by you. I would like to request to delete this broken redirect. Thanks in advance. :) [[ผู้ใช้:ASid|ASid]] ([[คุยกับผู้ใช้:ASid|คุย]]) 18:05, 9 เมษายน 2568 (+07)
:It is an intended redirection. But since the target page was often vandalized so I protect it. I might create content for the page instead soon. --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 18:15, 9 เมษายน 2568 (+07)
::OK, thank you very much for your help. :) [[ผู้ใช้:ASid|ASid]] ([[คุยกับผู้ใช้:ASid|คุย]]) 18:21, 9 เมษายน 2568 (+07)
==[[mnw:gavé]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ คุณพี่ครับถ้ามีเวลาว่างช่วยแก้ไขให้หน่อย มี Error อีกแล้ว ผมรำคาญกับ Error นี่แหละ ผมก็ต้องมาขอความช่วยเหลือคุณพี่บอยเกรงใจแล้วล่ะ แต่ผมก็ทำอะไรไม่ได้--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 17:48, 10 เมษายน 2568 (+07)
==[[mnw:𑀉𑀝𑁆𑀞𑀸𑀯𑁂𑀇]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ ช่วยตรวจสอบให้หน่อยครับ เพราะว่ามี Error อยู่ผมก็แก้ไขไม่ถูก ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 17:54, 12 มิถุนายน 2568 (+07)
ยังหาสาเหตุไม่เจอครับ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 17:49, 18 มิถุนายน 2568 (+07)
==ขอความช่วยเหลือสำหรับแก้ไขปัญหาอัพเดท==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ [[blk:မော်ဂျူး:languages]] นี้มีปัญหา Error อยู่ ผมก็พยายามดีที่สุดแล้วแต่ยังไงก็มันไม่สำเร็จ ลองดูเพื่อตัวอย่าง [[blk:ကုတ်]] นี้ คุณพี่จ๋าช่วยหน่อยนะ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 17:48, 18 มิถุนายน 2568 (+07)
==[[:mnw:မဝ်ဂျူ:it-headword]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ [[:mnw:မဝ်ဂျူ:it-headword]] ช่วยลบออก s ให้หน่อยครับ ผมหาไม่เจอครับ ลองดูหน้า [[:mnw:linguistico]] ครับ คุณพี่จ๋าช่วยหน่อยนะ ขอบคุณครับ--[[ผู้ใช้:Intobesa.bot|Intobesa.bot]] ([[คุยกับผู้ใช้:Intobesa.bot|คุย]]) 15:45, 3 สิงหาคม 2568 (+07)
==[[ထိၚ်]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} คุณพี่คำศัพท์ [[ထိၚ်]] นั้นไม่ได้มาจากพม่า ลองเปิดดูหนังสือจารึกกษัตริย์แห่งธรรมเจดีย์ ผมพูดพี่ไม่เชื่อแล้วก็ลองเปิดอ่าน [https://web.facebook.com/groups/TTMNW/permalink/3595432830751565/ Comment] ในที่นี้ด้วย ถ้าผมพูดพี่ไม่เชื่ออะไรลองพูดคุยกับพวกเขาด้วย มีอะไรก็เพิ่มไปที่พม่าหมดอันนี้การขโมยชัดๆนะครับคุณพี่ มีอะไรก็เรียนรู้ให้แน่ใจก่อนจริงหรือไม่ ผมเองก็ไม่อยากพูดเยอะกับคนที่ไม่เข้าใจหรอกแต่การกระทำนี้ผมยอมรับได้ยาก การกระทำผมทั้งหมดก็ไม่ได้หาเรื่องใครไม่ได้มีเรื่องกับใครแค่ปกป้องภาษาของตนเท่านั้น ขอให้มีน้ำใจด้วยนะครับคุณพี่ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 19:20, 3 กันยายน 2568 (+07)
:เอาเป็นว่าผมเปลี่ยนวิธีเขียนใหม่ก็แล้วกัน เพราะผมก็ไม่มีหลักฐาน ไม่รู้ว่าพม่ายืมมาจากมอญจริงหรือเปล่า เพราะการเขียนคล้ายกันมันก็ไม่ได้หมายความว่ายืมมาเสมอไป แต่ที่แน่ๆคือ 3 ภาษานั้น (เขิน ไทใหญ่ ไทใต้คง) ยืมจากพม่า เพราะไม่ได้ติดต่อกับมอญ --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 19:47, 3 กันยายน 2568 (+07)
: ok ฉันเพิ่มให้ตามอ้างอิงแล้วกันเนาะ ถ้าคุณมีโอกาสฉันแนะนำให้คุณไปอ่านด้วย แต่มันไม่ใช่ภาษามอญยุคสมัยแต่มันเป็นภาษามอญยุคสมัยเก่าศตวรรษที่ 1 ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 22:00, 3 กันยายน 2568 (+07)
== Update [[มอดูล:Jpan-headword]] ==
Hi, please update [[มอดูล:Jpan-headword]] page to sync with English Wiktionary's code: https://en.wiktionary.org/w/index.php?title=Module:Jpan-headword&diff=prev&oldid=88203734, also the create new section and subscribe buttons in this talk page are somehow not working. [[ผู้ใช้:Public class|Public class]] ([[คุยกับผู้ใช้:Public class|คุย]]) 09:17, 19 พฤศจิกายน 2568 (+07)
==[[:mnw:adeffu]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ คุณพี่ครับในหน้า [[:mnw:adeffu]] นี้มีปัญหา Error อยู่ ช่วยให้หน่อยได้ไหม ผมหลงทางแล้วล่ะ พยายามยังไงก็ไม่สำเร็จ คุณพี่ถ้าว่างก็ช่วยหน่อยนะ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 18:17, 30 มกราคม 2569 (+07)
==[[:mnw:cocaïnes]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ คุณพี่ครับถ้ามีเวลาว่างช่วยแก้ไข [[:mnw:မဝ်ဂျူ:languages/data/2]] ให้หน่อยตั้งแต่เมื่อวานผมกำลังค้นหาแต่ไม่เจอ มันมีปัญหา Error อยู่ครับ ขออภัยต้องรบกวนนะครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 16:14, 6 กุมภาพันธ์ 2569 (+07)
==[[:mnw:ordinary seaman]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ คุณพี่ครับถ้ามีเวลาว่างช่วยแก้ไข [[:mnw:ordinary seaman]] ให้หน่อยครับ ยังมี Error อีก ผมก็หาไม่เจอครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 23:40, 11 กุมภาพันธ์ 2569 (+07)
== [[:หมวดหมู่:อักขระอักษรจีน]] ==
To fix error category, you should need update [[Template:auto cat]] to work properly. [[ผู้ใช้:Hiyuune|Hiyuune]] ([[คุยกับผู้ใช้:Hiyuune|คุย]]) 15:45, 19 กุมภาพันธ์ 2569 (+07)
:As you can see, English Wiktionary (our model) has integrated auto cat codes into its category modules. We are trying to catch them up. But we cannot exactly follow their logic because Thai language has different grammatical ordering. And many modules are needed to update along with it. There are hastily many things to do more than a single template. Now, we are fixing the entry templates that are more important than categories. --[[พิเศษ:เรื่องที่เขียน/~2026-11205-88|~2026-11205-88]] ([[คุยกับผู้ใช้:~2026-11205-88|คุย]]) 00:09, 20 กุมภาพันธ์ 2569 (+07)
:A few changes in codes between modules might cause a large error chain so we are very careful to modify. Please be patient.--[[พิเศษ:เรื่องที่เขียน/~2026-11205-88|~2026-11205-88]] ([[คุยกับผู้ใช้:~2026-11205-88|คุย]]) 00:23, 20 กุมภาพันธ์ 2569 (+07)
== [[ผู้ใช้:Octahedron80/mfa]] ==
สวัสดีครับ พอดีสงสัยว่ารูปทับศัพท์ภาษามลายูปัตตานีในตารางนี้มาจากหนังสือเกณฑ์ทับศัพท์ของราชบัณฑิตฯ หรือเปล่าครับ เพราะดูแล้วคิดว่า ทำไมระบบทับศัพท์กับเวลาพูดมันดู "แปลก" --[[ผู้ใช้:Waniosa Amedestir|Waniosa Amedestir]] ([[คุยกับผู้ใช้:Waniosa Amedestir|คุย]]) 10:02, 28 กุมภาพันธ์ 2569 (+07)
:{{ping|Waniosa Amedestir}} ราชบัณฑิตมีเพียงหลักการทับศัพท์มลายู/มาเลย์ (ms) ซึ่งใช้ไม่ได้กับมลายูแบบปัตตานี (mfa) ซึ่งมีหน่วยเสียงมากกว่าทั้งพยัญชนะและสระ (ราชบัณฑิตไม่มีหลักการทับศัพท์ mfa อาจจะด้วยเหตุผลทางการเมือง) หรือหากจะใช้หลักการทับศัพท์ภาษาอาหรับ (ar) ก็ใช้ไม่ได้เหมือนกันเพราะเป็นคนละตระกูล // แต่เดิมมหาวิทยาลัยทักษิณเคยมีระบบการถอดเสียง IPA ด้วยอักษรอาหรับ(ยาวี) มาตั้งแต่ พ.ศ. 2553 [https://drive.google.com/open?id=1U-ERNu9EvjfB7f5U7ABLsvRPN1GxIrwx&usp=drive_fs] ส่วนอักษรไทยที่ใช้กันอยู่นั้นค่อนข้างจะสะเปะสะปะ สะกดไม่เหมือนกัน ผมจึงใช้ระบบการถอดเสียงอักษรอาหรับ(ม.ทักษิณ) และ lexicon ต่าง ๆ ที่มีอยู่ บูรณาการระบบการถอดเสียงอักษรไทยขึ้นมาใหม่ ให้สอดคล้องกับทั้งอักษรอาหรับและ IPA แบบหนึ่งต่อหนึ่ง ผลที่ได้ก็เป็นดังนั้น เห็นรูปสะกดแล้วออกเสียงได้ถูกต้อง --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 10:32, 28 กุมภาพันธ์ 2569 (+07)
==[[:mnw:မဝ်ဂျူ:it-headword]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาว่างช่วยแก้ไข [[:mnw:မဝ်ဂျူ:it-headword]] ให้หน่อยครับ คุณพี่ลองดูหน้า [[:mnw:raro]] นี้ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 08:27, 9 มีนาคม 2569 (+07)
:ตอนนี้มอดูลมันไม่เหมือนเดิม ต่างจากเดิมมาก หากคัดลอกมาใหม่แล้วแปลใหม่ อาจจะดีกว่า --[[ผู้ใช้:Octahedron80|Octahedron80]] ([[คุยกับผู้ใช้:Octahedron80|คุย]]) 08:38, 16 มีนาคม 2569 (+07)
==[[:mnw:မဝ်ဂျူ:ca-headword]]==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาว่างช่วยลบออกให้ s ให้หน่อยครับ ลองดูในหน้า [[:mnw:gai]] ครับ ผมก็เกรงใจคุณพี่แต่พยายามหาไม่เจอ ถ้ามีเวลาว่างช่วยหน่อยนะครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 19:53, 25 มีนาคม 2569 (+07)
== You may be an eligible candidate for the U4C election ==
<div lang="en" dir="ltr" class="mw-content-ltr">
Greetings,
The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee (U4C)]] seeks candidates for the 2026 election. The U4C is the global committee responsible for overseeing enforcement of the [[foundation:Special:MyLanguage/Policy:Universal Code of Conduct|Universal Code of Conduct]]. Elections are held annually, if elected a committee member serves for two years.
This year the U4C requires candidates to hold administrator rights on at least one wiki, which is why you are being contacted as you appear to hold this right. There are other requirements, such as candidates must be at least 18 years old and may not be employed by the Wikimedia Foundation or other related chapters and affiliates. You can find more information in the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026#Call_for_Candidates|call for candidates on Meta-wiki]]. Additionally, the committee's working language is English; some ability to communicate in English is required.
The election opens on 18 May, if you are eligible and interested you have until 10 May to submit your candidacy. There will be a week in between for candidates to answer questions from the community. Voting takes place privately in [[m:Special:MyLanguage/SecurePoll|SecurePoll]], successful candidates must receive at least 60% support. More information is available on [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|the 2026 Elections page]], including timelines and other candidacy information. If you read over the material and consider yourself qualified, please consider submitting your name to run for the committee. If you think someone else in your community might be interested and qualified, please encourage them to run.
In partnership with the U4C -- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) 03:11, 29 เมษายน 2569 (+07) </div>
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Keegan_(WMF)/test&oldid=30472482 -->
==อยากได้ความช่วย==
สวัสดีคุณพี่ {{ping|Octahedron80}} ครับ คุณพี่ครับถ้ามีเวลาว่างช่วยแก้ไข Error ให้หน่อย ลองดูใน [[:mnw:mandla#အာက်သလာန်|mandla]] ครับ ผมพยายามอยู่หลายวันแล้ว แต่ยังไงก็ผมหาสาเหตุไม่เจอ และไม่ทราบด้วยต้องไปหาที่ไหน คุณพี่ครับช่วยหน่อยนะ ผมเองก็ไม่รู้แล้วล่ะต้องไปแก้ไขที่ไหน จะงงหมดแล้ว ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 23:26, 15 พฤษภาคม 2569 (+07)
:สำหรับภาษาไอซ์แลนด์ จำเป็นต้องมีตาราง is-ndecl ในส่วนภาษาของมัน เพื่อที่จะหยิบคำมาแสดงใน headword โค้ดไม่ได้ผิดอะไรครับ --[[ผู้ใช้:OctraBot|OctraBot]] ([[คุยกับผู้ใช้:OctraBot|คุย]]) 14:00, 18 พฤษภาคม 2569 (+07)
::: {{ping|Octahedron80}} ครับผม อ๋อมันเป็นอย่างนี้เอง ผมเองก็รำคาญ Error นั่นแหละ ไม่ค่อยจะได้เพิ่มไป เพราะว่ามีสาเหตุ Error ตลอด ผมก็แก้ไขไม่ถูกด้วยเพราะฉะนั้นผมไม่ได้เพิ่มไป ตอนนี้ต้องเปลี่ยนความคิดใหม่แล้วล่ะ ขอบคุณนะช่วยให้ผม ใน Wiki ที่ผมยังไม่รู้ยังมีเยอะ ถ้าคุณพี่ยังมีเวลาว่างอีกก็ [[:mnw:amaro#အဳတခ်လဳ|amaro]] นี้ช่วยตรวจสอบให้หน่อย ยังมี Error อีกแล้ว ผมเองก็ความรู้เทคโนโลยีอ่อนโยนมาก เพราะฉะนั้นพยายามจะเรียนรู้อยู่แล้วแต่บางสิ่งไม่เข้าใจ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 17:09, 18 พฤษภาคม 2569 (+07)
::: คุณพี่ {{ping|Octahedron80}} ครับ ถ้ายังมีเวลาว่างช่วยตรวจสอบ Error ให้หน่อย [[:mnw:هم|هم]] ขออภัยต้องรบกวน ผมเองก็พยายามแก้ไขแล้วแต่ไม่สำเร็จ ผมเองก็ไม่ทราบต้นสาเหตุด้วย ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 18:50, 22 พฤษภาคม 2569 (+07)
==การขอความช่วยเหลือเพื่อเพิ่มข้อมูล==
คุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาว่างแล้วก็ช่วยไปเพิ่มข้อมูลใน [[:en:Appendix:Days of the week]] ให้หน่อยได้ไหมครับ เพราะผมไม่สามารถไปแก้ไขได้ เพราะฉะนั้นผมอยากได้ความช่วยเหลือจากคุณพี่ครับ ผมอยากจะให้คุณพี่เพิ่มว่า
<syntaxhighlight lang="js" copy>
|-
! [[Mon]]
| [[အဒိုတ်]]
| [[စန်]]
| [[အၚာ]]
| [[ဗုဒ္ဓဝါ]]
| [[ဗြဴဗ္တိ]]
| [[သိုက်]]
| [[သ္ၚိသဝ်]]
|-
! [[Middle Mon]]
| [[ရဝိတ်]]
| [[စဉ်]]
| [[မ္ၚဵု]]
| [[ဗုဒ္ဓဝါ]]
| [[ဗြသ္ပတိ]]
| [[သောက်]]
| [[သ္ၚိဝါ]]
|-
! [[Old Mon]]
| [[ရဝိဝါရ်]]
| [[စန္ဒြဝါရ်]]
| [[မင်္ဂလဝါရ်]]
| [[ဗုဒ္ဓဝါရ်]]
| [[ဗိဟသပ္တိ]]
| [[သုကြဝါရ်]]
| [[သနိဝါရ်]]
|-
! [[Mon]] (Classical)
| 𑀭𑀯𑀺𑀯𑀸𑀭𑁆
| 𑀘𑀦𑁆𑀤𑁆𑀭𑀯𑀸𑀭𑁆
| 𑀫𑀗𑁆𑀕𑀮𑀯𑀸𑀭𑁆
| 𑀩𑀼𑀤𑁆𑀥𑀯𑀸𑀭𑁆
| 𑀩𑀺𑀳𑀲𑀧𑁆𑀢𑀺
| 𑀲𑀼𑀓𑁆𑀭𑀯𑀸𑀭𑁆
| 𑀲𑀦𑀺𑀯𑀸𑀭𑁆
|-
! [[Mon]]-[[Pali]]
| [[ရဝိဝါရော]]
| [[စန္ဒဝါရော]]
| [[ကုဇဝါရော]]
| [[ဗုဒ္ဓဝါရော]]
| [[ဂုရုဝါရော]]
| [[သုက္ကဝါရော]]
| [[သနိဝါရော]]
|-
</syntaxhighlight>
แค่นี้แหละครับ ขอบคุณครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 22:57, 9 สิงหาคม 2569 (+07)
==การขอช่วยตรวจสอบ==
คุณพี่ {{ping|Octahedron80}} ครับ ใน [[:mnw:မဝ်ဂျူ:sk-noun]] มี Error อะไรผมก็ยังไม่ทราบครับ ผมก็พยายามอัพเดทไปอย่างอื่นแล้วก็ยังไม่เห็นผลงาน ผมก็ยังไม่เข้าใจมัน Error อะไร เพื่อการแสดงสาเหตุปัญหาคุณพี่ลองเปิดดู [[:mnw:matematička]] นี่ครับวันๆผมหงุดหงิดไอ้ Error นี่แหละ ในประเทศไทยถ้ามีการประชุมแนะนำการใช้ Wiki จะมีแล้วก็ช่วยบอกผมด้วยนะผมอยากไปด้วย วิธีการใช้มีผู้เขียนเอาไว้ก็มีแต่ผมไม่เข้าใจไม่ใช่อ่านไม่ออก วิธีการใช้อันนั้นยังไงก็ผมต้องเห็นกับตาถ้าผมไม่เห็นกับตาอ่านไปก็ไม่มีประโยชน์เพราะผมไม่เข้าใจ ผมเป็นคนอยู่ในป่าตั้งแต่เด็กเพราะฉะนั้นผมการสัมผัสเทคโนโลยีไม่ค่อยรู้เรื่องหรอกแต่พยายามอยู่ดีที่สุดแล้วมันก็ยังคงไม่เข้าใจอีก ขอบคุณนะสำหรับช่วยให้เราถ้าคำวาจาไม่สุภาพขอขมาด้วยนะ ผมเป็นคนอย่างนี้แหละพูดไปตรงไปตรงมา--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 18:20, 13 สิงหาคม 2569 (+07)
:ฟังก์ชัน make_simple_row พารามิเตอร์ที่ 2 ต้องการคำอังกฤษเพื่อไปตัดเป็นโค้ด 3 ตัวอักษร เช่น nom, gen, dat, ฯลฯ เพื่อเรียกใช้ตัวแปรที่กำหนด ถ้าแปลเป็นคำแปลมอญ ตัวอักษรที่ตัดมาจะกลายเป็นมอญ กลายเป็น မ, ဗ, ပ, ฯลฯ (3 ไบต์) มันจึงไม่มีค่า (nil) ทำงานต่อไม่ได้ วิธีแก้คือเพิ่มพารามิเตอร์ที่ 3 ใส่คำมอญเท่านั้น แก้ไข make_simple_row นิดหน่อย เพื่อให้พารามิเตอร์ที่ 2 และ 3 ทำงานแยกกัน ของภาษาไทยก็ต้องทำเหมือนกัน --[[ผู้ใช้:OctraBot|OctraBot]] ([[คุยกับผู้ใช้:OctraBot|คุย]]) 18:53, 13 สิงหาคม 2569 (+07)
::อ๋อครับ ขอบคุณมากครับ--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 20:03, 13 สิงหาคม 2569 (+07)
== [[คุยเรื่องภาคผนวก:รายชื่อคำในภาษาไทยที่มักเขียนผิด]] ==
ผมผ่านมาเห็นอีกทีก็ย้ายมาสองโครงการแล้ว อยากขอความคิดเห็นด้วยครับ เพราะเป็นหน้าที่ใช้ประโยชน์ได้มาก แต่หากอยู่กระจัดกระจายและขาดการเชื่อมโยงก็จะไม่ได้ใช้งานให้คุ้มค่าที่รวบรวมมาครับ --[[ผู้ใช้:Taweetham|taweethaも]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 06:36, 5 กันยายน 2569 (+07)
:: [[:m:Wikimedia_Thailand/Central_Manual_of_Style_for_Thai_Language]] เพื่อพิจารณาครับ --[[ผู้ใช้:Taweetham|Taweethaも]] ([[คุยกับผู้ใช้:Taweetham|คุย]]) 07:36, 28 กันยายน 2569 (+07)
==การขอความช่วย==
คุณพี่ {{ping|Octahedron80}} ครับ ถ้ามีเวลาพอสมควรก็ช่วยตรวจสอบ [[:mnw:IL]] และ [[:mnw:il#အာက်သလာန်]] นี้หน่อยครับ มี Error อยู่ครับ ผมก็พยายามค้นหาแล้วแต่ยังไม่ทราบว่ามันสาเหตุอันใด ขอบคุณครับ ผมก็เกรงใจไม่อยากรบกวนคุณพี่แต่ต้องรบกวนอีกแล้ว--<span style="background-color: magenta; padding: 2px 5px 1px 5px">[[User:咽頭べさ|<span style="color: white">𝓓𝓻.𝓘𝓷𝓽𝓸𝓫𝓮𝓼𝓪</span>]]|[[User talk:咽頭べさ|𝒯𝒶𝓁𝓀]]</span> 01:14, 30 กันยายน 2569 (+07)
niqnmsy5c8ay5u9wbkpjt0ya7h1rhya
มอดูล:inflection utilities
828
287871
5770990
2690493
2026-09-30T06:59:23Z
Octahedron80
267
5770990
Scribunto
text/plain
local export = {}
local m_links = require("Module:links")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local put = require("Module:parse utilities")
local headword_data_module = "Module:headword/data"
local script_utilities_module = "Module:script utilities"
local pages_module = "Module:pages"
local template_parser_module = "Module:template parser"
local is_callable = require("Module:fun").is_callable
local split = m_str_utils.split
local ufind = m_str_utils.find
local usub = m_str_utils.sub
local ucfirst = m_str_utils.ucfirst
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local dump = mw.dumpObject
local new_title = mw.title.new
local insert = table.insert
local concat = table.concat
local insert_if_not = m_table.insertIfNot
local shallow_copy = m_table.shallowCopy
local function track(page)
require("Module:debug/track")("inflection utilities/" .. page)
return true
end
local footnote_abbrevs = {
["a"] = "archaic",
["c"] = "colloquial",
["d"] = "dialectal",
["fp"] = "folk-poetic",
["l"] = "literary",
["lc"] = "low colloquial",
["p"] = "poetic",
["pej"] = "pejorative",
["r"] = "rare",
}
--[==[ intro:
The following code is used in building up the inflection of terms in inflected languages, where a term can potentially
consist of several inflected words, each surrounded by fixed text, and a given slot (e.g. accusative singular) of a
given word can potentially consist of multiple possible inflected forms. In addition, each form may be associated with
a manual transliteration and/or a list of footnotes (or qualifiers, in the case of headword lines). The following
terminology is helpful to understand:
* A '''term''' is a word or multiword expression that can be inflected. A multiword term may in turn consist of several
single-word inflected terms with surrounding fixed text. A term belongs to a particular '''part of speech''' (e.g.
noun, verb, adjective, etc.).
* An '''inflection dimension''' is a particular dimension over which a term may be inflected, such as case, number,
gender, person, tense, mood, voice, aspect, etc.
* The '''lemma''' is the particular form of a term under which the term is entered into a dictionary. For example, for
verbs, it is most commonly the infinitive, but this differs for some languages: e.g. Latin, Greek and Bulgarian use
the first-person singular present indicative (active voice in the case of Latin and Greek); Sanskrit and Macedonian
use the third-person singular present indicative (active voice in the case of Sanskrit); Hebrew and Arabic use the
third-person singular masculine past (aka "perfect"); etc. For nouns, the lemma form is most commonly the nominative
singular, but e.g. for Old French it is the objective singular and for Sanskrit it is the root.
* A '''slot''' is a particular combination of inflection dimensions. An example might be "accusative plural" for a noun,
or "first-person singular present indicative" for a verb. Slots are named in a language-specific fashion. For
example, the slot "accusative plural" might have a name `accpl`, while "first-person singular present indicative"
might be variously named `pres1s`, `pres_ind_1_sg`, etc. Each slot is filled with zero or more '''forms'''.
* A '''form''' is a particular inflection of a slot for a particular term. Note that a given slot may (and often does)
have more than one associated form; these different forms are termed '''variants'''. An example is
{{m+|de|Bug||bow (of a ship)}}, which has two genitive singular forms ''Buges'' and ''Bugs''; two plural forms in all
cases, e.g. nominative plural ''Buge'' and ''Büge''; and two dative singular forms ''Bug'' and rare/archaic ''Buge''.
The form variants for a given slot are ordered, and generally should have the more common and/or preferred variants
first, along with rare, archaic or obsolete variants last (if they are included at all).
* Forms are described using '''form objects''', which are Lua objects taking the form
`{form="``form_value``", translit="``manual_translit``", footnotes={"``footnote``", "``footnote``", ...}}`.
(Additional '''metadata''' may be present in a form object, although the support for preserving such metadata when
transformations are applied to form objects isn't yet complete.) ``form_value`` is a '''form value''' specifying the
value of the form itself in the term's script. ``manual_translit`` specifies optional manual transliteration for the
form, in case (a) the form value is in a different script; and (b) either the form's automatic transliteration is
incorrect and needs to be overridden, or the language of the term has no automatic transliteration (e.g. in the case
of Persian and Hebrew). ``footnote`` is a footnote to be attached to the form in question, and should be e.g.
{"[archaic]"} or {"[only in the meaning 'to succeed (an officeholder)']"}, i.e. the string must be surrounded by
brackets and should begin with a lowercase letter and not end in a period/full stop. When such footnotes are converted
to actual footnotes in a table of inflected forms, the brackets will be removed, the first letter will be capitalized
and a period/full stop will be added to the end. (However, when such footnotes are used as qualifiers in headword
lines, only the brackets will be removed, with no capitalization or final period.) Note that only ``form_value`` is
mandatory.
* A list of zero or more form objects is termed a '''form object list''', or usually just a '''form list'''. Such lists
are ordered and go into form tables (see below).
* A '''form table''' is a Lua table (i.e. a dictionary) describing all the possible inflections of a given term. The
keys in such a table are slots (strings) and the values are form lists. '''NOTE:''' All inflection code assumes and
maintains the invariant that no two slots, and no two forms in a single slot, share the same form object (by
reference, i.e. the Lua object describing a form object should never be shared in two places). This allows for safely
side-effecting form objects in certain sorts of operations. This same invariant necessarily applies to the Lua list
objects containing the form objects, but does '''NOT''' apply to metadata inside of form objects. In particular, a
list of footnotes may well be shared among different form objects. This means it is '''NOT''' safe to side-effect
such lists, and in fact no code in this module that manipulates footnote lists will ever side-effect such lists; they
are treated as immutable.
* Some functions, to save memory, accept and work with abbreviated forms of form objects and/or form lists.
Specifically, an '''abbreviated form object''' is either a form object or a string, the latter corresponding to a form
object whose form value is the string and all other properties are nil. Similarly, an '''abbreviated form list''' is
either a single abbreviated form object or a list of such objects, i.e. any of a string, form object or list of
strings and/or form objects. Functions that do not accept such abbreviated structures may be said to insist on being
passed form objects in '''full form''', or form lists in '''full list form'''.
* Each slot is associated with an '''accelerator tag set''', which is a list of inflection tags that are used when
generating an accelerator entry for the forms in the slot (see [[WT:ACCEL]]). For example, the first singular present
indicative of a verb might have slot name `pres_1sg` and corresponding accelerator tag set `1|s|pres|ind`. As shown,
the accelerator tag set is a string consisting of inflection tags (as used in {{tl|inflection of}}) separated by `|`.
Despite the terminology ''tag set'', the tags in a tag set are ordered, although the same tag should never occur
twice.
* Some inflected terms are '''multiword''', i.e. they consist of multiple '''words''', where each word is generally
separated by spaces or sometimes hyphens. In such a term, some of the words inflect, while others remain fixed. Words
that inflect are termed '''inflecting words''' (or more correctly '''inflecting parts''', since in some circumstances,
parts of a word can inflect). The '''fixed text''' is all the parts of a multiword term that do not inflect.
* The descriptor that describes how a given term inflects is called an '''inflection spec''', and consists of the lemma
form of the term itself, annotated with an '''angle bracket spec''' after each inflecting word. As the name implies,
an angle bracket spec is surrounded by angle brackets (`<...>`). A simple example is {{m+|de|Feder||feather}}, whose
inflection spec looks like `Feder<f>`, where `f` specifies the feminine gender. In this case, although there are
several properties that could be specified between angle brackets, all except the gender are optional and have been
left out, indicating that defaults should be used. Another example is {{m+|de|Baske|Basque person}}, whose inflection
spec looks like `Baske<m.weak>`, where `m` specifies the masculine gender and `weak` specifies the weak inflection.
Note that individual components of an angle bracket spec like `m` and `weak` are termed '''indicators''' and are
separated by periods/full stops. A slightly more complex example is {{m+|de|Zeitgeist||zeitgeist}}, whose inflection
spec looks like `Zeitgeist<m,es:s,er>` and which specifies three things in a single '''compound indicator''': `m` (the
masculine gender); `es:s` (the genitive singular, which can end in either ''-es'' or ''-s''); and `er` (the
nomininative plural, which ends in ''-er'').
* If there are several inflecting words in a term, each one will be followed by its own angle bracket spec. An example
is {{m+|de|schwarzes Loch||black hole}}, whose inflection spec looks like `schwarzes<+> Loch<n,es:s,^er>`. Here,
the adjective ''schwarzes'' (the nominative neuter singular of {{m|de|schwarz||black}}) is followed by the angle
bracket spec `<+>` specifying that it inflects as an adjective, and the noun ''Loch'' has the angle bracket spec
`<n,es:s,^er>`, indicating (similarly to the above example) that it is neuter, has a genitive singular in either
''-es'' or ''-s'', and has a nominative plural in ''-er'' with umlaut, hence ''Löcher'' (the `^` specifies that the
form requires umlaut).
* Sometimes a given term has multiple ways of inflecting that differ in ways that can't be specified using a single
angle bracket spec. This is supported using '''alternants''', which are specified using double parentheses. (This is
so that terms that themselves contain parentheses can be specified without interference.) An example is
{{m+|uk|русин||Rusyn}}, which can be stressed either as ''ру́син'' (stress on the first syllable and following accent
paradigm ''a'', hence genitive singular ''ру́сина'') or ''руси́н'' (stress on the second syllable and following accent
paradigm ''b'', hence genitive singular ''русина́''; note how the stress moves onto the ending, in accordance with the
accent paradigm). This is specified using `((ру́син<pr>,руси́н<b.pr>))`, i.e. each separate the alternants with a comma
and surround them with double parentheses. (Here, `pr` means that the terms belong to the personal animacy class, and
`b` specifies the accent paradigm; paradigm ''a'' is the default and hence is omitted.)
* Note that occasionally, parts of a single space-delimited word can inflect separately. An example is
{{m+|la|rōsmarīnus||rosemary}}, which is a compound of {{m+|la|rōs||dew}} and {{m|la|marīnus||marine, of the sea}}.
In this compound, both parts of the compound can inflect separately; hence genitive singular ''rōrismarīnī'',
accusative singular ''rōremmarīnum'', etc. Alternatively, only the second part inflects; hence genitive singular
''rōsmarīnī'', accusative singular ''rōsmarīnum'', etc. This is specified as
`((rōs/rōr<3.M>marīnus<2>,rōsmarīnus<2>))`. Here, the term {{m|la|rōs}} by itself would have inflection spec
`rōs/rōr<3.M>` (indicating that it is third declension masculine with a non-nominative-singular stem ''rōr-'') and
the term {{m|la|marīnus}} would have inflection spec `<2>` (indicating that it is second declension; the masculine
gender is inferred from the ''-us'' ending). When combined in a single inflection spec, the doubly-inflecting
alternant is written `rōs/rōr<3.M>marīnus<2>`, with each inflecting part followed by its corresponding angle bracket
spec, and the singly-inflecting alternant is written `rōsmarīnus<2>`. As this example shows, the two alternants
need not correspond in how many inflecting parts there are. It should also be noted that fixed text can surround
an alternant and it is even possible to supply multiple alternants in a single inflection spec (e.g. if the term
has two words in it and each word requires an alternant to inflect).
* The result of parsing a single angle bracket spec is stored into a '''word spec'''. The structure of a word spec is
fairly arbitrary and is determined by the user-written `parse_indicator_spec` function, but always contains a form
table under the `forms` key that is populated during inflection (see below). A parameter or local variable that holds
a word spec is conventionally named `base` for historical reasons. Word specs are grouped together into a structure
termed a '''multiword spec''', which describes one or more word specs along with the fixed text in between and around
the inflected words. Multiword specs are in turn grouped into structures termed '''alternant specs''', indicating
the distinct alternants and the words in each alternant. Finally, multiword specs and alternant specs are grouped into
an '''alternant multiword spec''', which is the top-level object describing an inflection spec. Each of these
different specs has a form table in it stored in the `forms` key that is populated during the inflection process and
contains the form objects that specify the inflections of this part of the full multiword term. (It should be noted
that the term '''spec''' is overloaded to mean two different things: the user-specified descriptor that specifies the
lemma form of the term and associated inflection, and the associated internal Lua object that encapsulates all
information derived from the descriptor, along with later-generated information on how to inflect the term(s) being
described.)
* Among these various "spec" structures, the two most important are the top-level alternant multiword spec and the
bottom-level word spec or "base". You will rarely find it necessary to manipulate the intermediate structures or
concern yourself with the details of their formation.
* The term ''form'' is unfortunately overloaded in various modules to mean several things. In particular, for
historical reasons, the form value inside of a form object is stored using the key `form`; the form table inside of an
alternant multiword spec, a word spec (or "base") and the intermediate structures is stored using the key `forms`; and
the accelerator tag set is internally referred to in [[WT:ACCEL]] as a "form". To avoid confusion, the following
conventions are followed in code in this module, and should be followed for code in invoking modules as well:
*# Functions that accept form objects often name the relevant parameter `form` (if a single form object is required) or
`forms` (if a list of form objects, aka form list, is required).
*# Functions that accept abbreviated form objects should (but don't always) indicate this by naming the parameter
`abform` (for a single abbreviated form object) or `abforms` (for an abbreviated form list).
*# Functions that accept a form value (the native-script string portion of a form object, stored for historical reasons
in the `.form` property) should '''not''' call such a parameter `form`, but instead use something that makes clear
that a form value is required, such as `formval` or sometimes just `val`.
*# Similarly, functions that accept a form table should '''not''' call such a parameter `forms` (although for historical
reasons the form table in an alternant multiword spec is stored in the field `forms`). Instead, use `formtable` or
`formtab`, or similar name that makes clear that the value is a form table (i.e. a map from slot to form list).
====Footnote handling====
Each form can have one or more attached footnotes. The form of a footnote as specified by the user and stored in form
values is e.g. {"[archaic]"} or {"[only in the meaning 'to succeed (an officeholder)']"}, i.e. the string must be
surrounded by brackets and should begin with a lowercase letter and not end in a period/full stop. When such footnotes
are converted to actual footnotes in a table of inflected forms, the brackets will be removed, the first letter will be
capitalized and a period/full stop will be added to the end. (However, when such footnotes are used as qualifiers in
headword lines, only the brackets will be removed, with no capitalization or final period.)
When merging two forms into one, such as when concatenating the form objects of two inflected words in a multiword term
or deduplicating form objects sharing the same form value during `show_forms()`, the footnotes are generally combined as
well. This means that if one form object has footnotes and the other doesn't, the resulting form object inherits the
footnotes of the object that has them, and if both form objects have footnotes, the resulting form object gets all
footnotes from both source form objects, with duplicates removed. However, when inserting a form into a form table slot
that already has a form whose form value and translit are identical to the new form, the behavior is different. In
under normal circumstances the footnotes of the new form are ''not'' incorporated into those of the existing form (if
any), but are simply dropped. To understand why this makes sense, consider a term that has two possible forms of its
lemma (e.g. two forms differing in stress or in vowel length), where the second form is archaic, rare, colloquial or the
like, and has an attached footnote indicating this. An example of this is {{m+|ru|кожух||sheepskin coat; bullet shell}},
where the form ''кожу́х'' with accent pattern ''b'' is more common overall but the form ''ко́жух'' with accent pattern
''c(1)'' is more common among professionals. On first glance, this could be indicated using
`((кожу́х<b>,ко́жух<c(1).[professional usage only]>))`. But some forms of these two declensions are the same (in
particular, the genitive, dative, instrumental and prepositional plural). If for these slots, the footnotes of the
duplicate forms were combined (i.e. the footnotes of the second declension pattern were added to the already-existing
form taken from the first declension pattern), these forms would wrongly be labeled as ''professional usage only''.
For this reason, it makes more sense to drop the footnotes of the second form when deduplicating.
The same sort of behavior makes sense when a single lemma can have two different declensions, the second of which
requires a footnote and where some forms in the two declensions are shared. An example of this is
{{m+|uk|окови́та||strong, high-quality liquor}}, which can be inflected adjectivally or (rarely) nominally. This would be
indicated as `((окови́та<sg.+>,окови́та<sg.[rare]>))` where the `+` indicates adjectival declension and the `sg` indicates
that this term only exists in the singular. Here, the two declensions differ in the genitive, dative/locative and
vocative (respectively, adjectival ''окови́тої'', ''окови́тій'', ''окови́та'' vs. nominal ''окови́ти'', ''окови́ті'',
''окови́то'') but are the same in the accusative (''окови́ту'') and instrumental (''окови́тою''). Again, dropping the
footnotes of the second form when deduplicating is correct and including them would be wrong.
This behavior can be changed by attaching a '''footnote modifier''' to the footnote associated the second form. A
footnote modifier is a symbol attached to the beginning of a footnote, directly following the opening bracket. The
following modifiers are currently recognized:
* `!` or `+`: If placed on a footnote of the second form, combine that footnote with those of the first form (if any)
rather than dropping it.
* `*`: If placed on a footnote of the first form, drop that footnote when merging a second form with any footnotes.
An example where the `*` modifier makes sense is a modification of the above example with {{m+|ru|кожух}}. If we
notated it as `((кожу́х<b.[more common among laymen]>,ко́жух<c(1).[more common among professionals]>))`, the shared forms
would wrongly have the footnote ''more common among laymen'' when in fact they are the only possible forms. If instead
we used `((кожу́х<b.[*more common among laymen]>,ко́жух<c(1).[more common among professionals]>))`, the shared forms
would correctly have no footnote.
]==]
local function extract_footnote_modifiers(footnote)
local footnote_mods, footnote_without_mods = footnote:match("^%[([!*+]?)(.*)%]$")
if not footnote_mods then
error("Saw footnote '" .. footnote .. "' not surrounded by brackets")
end
return footnote_mods, footnote_without_mods
end
function export.deduplicate_footnotes(existing, new)
if not new then
return existing
end
-- Check to see if there are existing footnotes with *; if so, remove them.
if existing then
local any_footnotes_with_asterisk = false
for _, footnote in ipairs(existing) do
local footnote_mods, _ = extract_footnote_modifiers(footnote)
if footnote_mods:find("%*") then
any_footnotes_with_asterisk = true
break
end
end
if any_footnotes_with_asterisk then
local filtered_footnotes = {}
for _, footnote in ipairs(existing) do
local footnote_mods, _ = extract_footnote_modifiers(footnote)
if not footnote_mods:find("%*") then
insert(filtered_footnotes, footnote)
end
end
if #filtered_footnotes > 0 then
existing = filtered_footnotes
else
existing = nil
end
end
end
-- The behavior here has changed; track cases where the old behavior might
-- be needed by adding ! to the footnote.
track("combining-footnotes")
local any_footnotes_with_bang = false
for _, footnote in ipairs(new) do
local footnote_mods, _ = extract_footnote_modifiers(footnote)
if footnote_mods:find("[!+]") then
any_footnotes_with_bang = true
break
end
end
if any_footnotes_with_bang then
if not existing then
existing = {}
else
existing = shallow_copy(existing)
end
for _, footnote in ipairs(new) do
local already_seen = false
local footnote_mods, footnote_without_mods = extract_footnote_modifiers(footnote)
if footnote_mods:find("[!+]") then
for _, existing_footnote in ipairs(existing) do
local _, existing_footnote_without_mods = extract_footnote_modifiers(existing_footnote)
if existing_footnote_without_mods == footnote_without_mods then
already_seen = true
break
end
end
if not already_seen then
insert(existing, footnote)
end
end
end
end
return existing
end
--[==[
Combine two sets of footnotes. If either is {nil}, just return the other, and if both are {nil}, return {nil}.
]==]
function export.combine_footnotes(notes1, notes2)
if not notes1 and not notes2 then
return nil
end
if not notes1 then
return notes2
end
if not notes2 then
return notes1
end
local combined = shallow_copy(notes1)
for _, note in ipairs(notes2) do
insert_if_not(combined, note)
end
return combined
end
function export.combine_formobj_lists(list1, list2, metadata)
if not list1 and not list2 then
return nil
end
if not list1 then
return list2
end
if not list2 then
return list1
end
return export.insert_formobjs_into_list {
existing_list = list1,
formobjs = list2,
metadata = metadata,
}
end
function export.looks_like_formobj_list(list)
if list == nil then
return true
end
if type(list) ~= "table" then
return false
end
for k, v in pairs(list) do
if type(k) ~= "number" then
return false
end
if type(v) ~= "table" then
return false
end
if type(v.form) ~= "string" then
return false
end
end
return true
end
function export.looks_like_boolean(object)
return object == nil or type(object) == "boolean"
end
function export.default_fallback_deduplicate_handler(_prop, existing, _new)
return existing, true
end
function export.default_fallback_combine_handler(_prop, existing, new)
if export.looks_like_formobj_list(existing) and export.looks_like_formobj_list(new) then
return export.combine_formobj_lists(existing, new), true
end
if export.looks_like_boolean(existing) and export.looks_like_boolean(new) then
return existing or new, true
end
if existing ~= nil then
return existing, true
end
return new, true
end
--[=[
Default handler functions for working with form object metadata. The user-specific metadata structure has the same
format. The key is a specific metadata field and the value is an object with fields specifying handlers and other
properties of the metadata. The recognized per-metadata fields are:
* `deduplicate`: Handler to deduplicate form objects when inserting a form object into an existing list (e.g. in a
form table) and two form objects have the same form value and translit. It is passed two values, respectively the
metadata property from the existing list object and the new object being inserted into the list. The default and
most common behavior here is to preserve the property from the existing object, even if {nil}, and discard the value
from the new object. This is what is done in footnotes, for example, unless the existing footnote is preceded by a *
(meaning to discard both values) or the new one is preceded by a + (meaning to preserve and combine both values,
which is not currrently used anywhere and may not make sense). This ensures, for example, that if a noun can be
declined according to two paradigms and the second one is rare, the {"rare"} footnote on the second one gets
discarded whenever the two paradigms coincide.
* `combine`: Handler to combine form objects when deriving a new object from an existing one. This is conceptually very
different from deduplication. In this situation, the existing and new objects may or may not match in form value and
translit, and since the new form object is a derivative of the existing one, it should combine the metadata
properties of both, preserving as much information as possible and not discarding anything. Combining footnotes, for
example, means taking the footnotes from either one, and if both exising and new objects have footnotes, merging
the two lists and removing duplicates. (The only exception is if a new footnote is preceded by !, which causes
existing footnotes to be discarded. This is termed an ''override'', and allows e.g. for one form of a paradigm to
override the footnote associated with the paradigm as a whole, as for example if a paradigm is archaic except for
one of the forms.) The default `combine` strategy is as follows:
*# If both the existing and new objects are {nil} or "look like" form object lists (i.e. are tables where all keys are
numeric and all values are tables with a `form` key whose value is a string), combine them using
`insert_formobjs_into_list`.
*# If both the existing and new objects are {nil} or boolean, combine them using `A or B`.
*# Otherwise, take the existing value if it is non-{nil}, and if not, take the new value. Note that this means that the
existing value will be kept even if it is {false} (which would not happen if the new value were {true}); this allows
for metadata where {false} is a special signal and keys are otherwise strings or objects. However, in general if the
metadata objects are not boolean and not form object lists, they will need a custom combine handler.
Some keys in the metadata handler object are special:
* `*`: This provides "fallback" handlers. These handlers are called for all metadata fields without dedicated handlers.
These handlers work similar to normal `deduplicate` and `combine` handlers except (a) they are passed three values,
first the metadata property name and then the existing and new values; (b) they should return two values, first the
appropriate merged value and second a boolean indicating whether the property was handled. (If {false} is returned,
the first value is ignored and should be {nil}.) Dedicated and fallback handlers are called in the following order:
(1) dedicated user-specified handlers; (2) dedicated default handlers; (3) fallback user-specified handlers;
(4) fallback default handlers. This ensures that standard dedicated default handlers (particularly for footnotes)
get run prior to the user-specified fallback handlers; otherwise, practically all such fallback handlers will need
to check for and ignore footnotes.
* `_side_effect_formobjs`: If true, existing form objects can be side-effected during deduplication or combining. This
requires that two logically distinct form objects in a given form table never have the same reference. (Generally
two such objects should be in different slots. If two references to the same object occur in different positions
in the list of form objects under a single slot, it indicates an internal error in the deduplication mechanism.)
This means that user code that generates form objects for insertion into a table must take care never to reuse
existing form objects (e.g. when setting one slot equal to another slot), but must always shallow-copy the form
objects. This is not the default for this reason, and in fact it's not clear that implementing this results in any
efficiency gain (it may actually be the reverse, since form objects have to be copied that could otherwise be
shared).
]=]
local default_metadata_handlers = {
footnotes = {
deduplicate = export.deduplicate_footnotes,
combine = export.combine_footnotes,
},
["*"] = {
deduplicate = export.default_fallback_deduplicate_handler,
combine = export.default_fallback_combine_handler,
}
}
local function is_non_metadata_property(k)
return k == "form" or k == "translit"
end
-- Call the appropriate handler for merging the metadata for property `prop` with values `existing_val` and `new_val`,
-- using method `method` (either "deduplicate" or "combine"). `metadata` is the structure describing all properties of
-- all metadata in a given form object. This looks for, in order:
-- 1. A handler for the specific property in `metadata`.
-- 2. A default handler for the specific property.
-- 3. A fallback handler in `metadata`.
-- 4. A default fallback handler.
-- Return the new value.
local function call_merge_metadata_handler(metadata, prop, method, existing_val, new_val)
local function try_specific(handler_struct, prop)
if handler_struct and handler_struct[prop] and handler_struct[prop][method] then
return (handler_struct[prop][method](existing_val, new_val)), true
end
return nil, false
end
local function try_fallback(handler_struct, prop)
if handler_struct and handler_struct["*"] and handler_struct["*"][method] then
-- Two values are returned from the handler, the new value and whether the property was handled.
return handler_struct["*"][method](prop, existing_val, new_val)
end
return nil, false
end
local retval, matched = try_specific(metadata, prop)
if matched then
return retval
end
retval, matched = try_specific(default_metadata_handlers, prop)
if matched then
return retval
end
retval, matched = try_fallback(metadata, prop)
if matched then
return retval
end
retval, matched = try_fallback(default_metadata_handlers, prop)
return retval
end
-- Merge the metadata of two form objects using `method` (either "deduplicate" or "combine"). `metadata` is the
-- structure describing all properties of all metadata in a given form object. Metadata is merged between
-- `existing_formobj` (on the left) and `new_formobj` (on the right), and is normally stored into `existing_formobj`,
-- but will be stored into `new_formobj` if `merge_into_new` is given. If `metadata` allows for side-effecting, the
-- changes will be made by side-effecting the object to be changed; otherwise, a shallow copy of the object will be
-- made if necessary (only if the new value is not equal to the existing value). Returns two values, the changed form
-- object (which may be the same as one of the passed-in objects) and a flag which is true if a copy was made of a form
-- object.
local function merge_metadata(metadata, method, existing_formobj, new_formobj, merge_into_new)
local props_of_either = nil
for k, _ in pairs(existing_formobj) do
if not is_non_metadata_property(k) then
props_of_either = props_of_either or {}
props_of_either[k] = true
end
end
for k, _ in pairs(new_formobj) do
if not is_non_metadata_property(k) then
props_of_either = props_of_either or {}
props_of_either[k] = true
end
end
local store_object = merge_into_new and new_formobj or existing_formobj
if props_of_either then
if metadata._side_effect_formobjs then
for k, _ in pairs(props_of_either) do
store_object[k] = call_merge_metadata_handler(metadata, k, method, existing_formobj[k], new_formobj[k])
end
else
local need_to_copy = false
local new_values = {}
for k, _ in pairs(props_of_either) do
local newval = call_merge_metadata_handler(metadata, k, method, existing_formobj[k], new_formobj[k])
if newval ~= store_object[k] and not m_table.deepEquals(newval, store_object[k]) then
need_to_copy = true
end
new_values[k] = newval
end
if need_to_copy then
store_object = shallow_copy(store_object)
for k, _ in pairs(props_of_either) do
store_object[k] = new_values[k]
end
end
return store_object, need_to_copy
end
else
return store_object, false
end
end
--[==[
Insert a form object (see above) into a list of such objects. If the form is already present (i.e. both the form
value and translit, if any, match), the footnotes of the existing and new form might be combined (specifically,
footnotes in the new form beginning with `+` will be combined).
]==]
function export.insert_formobj_into_list(data)
local existing_list = data.existing_list
local formobj = data.formobj
-- Don't do anything if the form object is nil.
if not formobj then
return existing_list
end
for i, existing_formobj in ipairs(existing_list) do
if existing_formobj.form == formobj.form and existing_formobj.translit == formobj.translit then
local new_existing, copied = merge_metadata(data.metadata, "deduplicate", existing_formobj, formobj)
if copied then
local list_copy = shallow_copy(existing_list)
list_copy[i] = new_existing
return list_copy
end
return existing_list
end
end
-- Form not found.
insert(existing_list, formobj)
return existing_list
end
--[==[
Insert a list of form objects (see above) into an existing list of such objects. ``forms`` can be {nil},
in which case nothing happens. This is equivalent to calling `insert_form_into_list` for each form object.
]==]
function export.insert_formobjs_into_list(data)
local existing_list = data.existing_list
local formobjs = data.formobjs
if not formobjs then
return existing_list
end
for _, formobj in ipairs(formobjs) do
existing_list = export.insert_formobj_into_list {
existing_list = existing_list,
formobj = formobj,
metadata = data.metadata,
}
end
return existing_list
end
--[==[
Insert a form object (see above) into the given slot in the given form table. On input, `data` is an object with the
following fields:
* `formtable`: A form table (see above).
* `slot`: A slot in the form table, i.e. a key whose value is a form object list.
* `formobj`: A form object to be inserted into the slot. Can be {nil}, in which case nothing happens.
* `metadata`: The metadata structure describing how to combine user-specified metadata. Can be {nil} if there is no
user-specified metadata or the default fallback metadata handlers are sufficient (which is usually the case if the
all user-specified metadata is boolean).
]==]
function export.insert_formobj_into_form_table(data)
local formtable, slot, formobj, metadata = data.formtable, data.slot, data.formobj, data.metadata
-- Don't do anything if the form object is nil.
if not formobj then
return
end
if not formtable[slot] then
formtable[slot] = {}
end
formtable[slot] = export.insert_formobj_into_list {
existing_list = formtable[slot],
formobj = formobj,
metadata = metadata,
}
end
--[==[
Insert a list of form objects (see above) into the given slot in the given form table. On input, `data` is an object
with the following fields:
* `formtable`: A form table (see above).
* `slot`: A slot in the form table, i.e. a key whose value is a form object list.
* `formobjs`: A list of form objects (in "full list" form) to be inserted into the slot. Can be {nil} or an empty list,
in which case nothing happens.
* `metadata`: The metadata structure describing how to combine user-specified metadata. Can be {nil} if there is no
user-specified metadata or the default fallback metadata handlers are sufficient (which is usually the case if the
all user-specified metadata is boolean).
]==]
function export.insert_formobjs_into_form_table(data)
local formtable, slot, formobjs, metadata = data.formtable, data.slot, data.formobjs, data.metadata
if not formobjs or not formobjs[1] then
return
end
if not formtable[slot] then
formtable[slot] = {}
end
formtable[slot] = export.insert_formobjs_into_list {
existing_list = formtable[slot],
formobjs = formobjs,
metadata = metadata,
}
end
--[==[
Flatmap a function over a list of form objects and return the (potentially flattened) results. Flatmapping is like
a normal mapping operation except that the function being called may return a list, and all values returned are
concatenated into a single flattened list. On input, `data` is an object with the following fields:
* `formobjs`: A list of form objects to map over, in "full list form" (see above).
* `fn`: The function to map over each form object. If a form object's value is {"?"}, the form object is preserved on
output and the function is not called. Otherwise, the function is called with one argument, the form object, and
should {nil} (equivalent to returning an empty list) or an abbreviated form list (i.e. anything that is convertible
into a full list form, such as a single form value, a list of form values, a form object or a list of form objects).
For each form object in the return value, the metadata of the object mapped over is combined with the metadata of
the returned object, unless `no_combine_metadata` is given. The resulting form objects from all function calls are
flattened into a list and deduplicated in the same fashion as `insert_formobj_into_list()` (in case two different
form objects map to the same form value).
* `metadata`: The metadata structure describing how to combine user-specified metadata. Can be {nil} if there is no
user-specified metadata or the default fallback metadata handlers are sufficient (which is usually the case if the
all user-specified metadata is boolean).
* `no_combine_metadata`: See `fn` above. If given, metadata from objects mapped over will not be combined into the
returned objects.
NOTE: There is no `map_formobjs` function provided because `flatmap_formobjs` will correctly handle functions that
return single form objects.
]==]
function export.flatmap_formobjs(data)
local formobjs, fn, metadata, no_combine_metadata =
data.formobjs, data.fn, data.metadata, data.no_combine_metadata
if not formobjs then
return nil
end
local retval = {}
for _, formobj in ipairs(formobjs) do
local funret
if formobj.form == "?" then
if metadata and metadata._side_effect_formobjs then
funret = shallow_copy(formobj)
else
funret = formobj
end
else
funret = fn(formobj)
end
if funret then
funret = export.convert_to_full_list_form(funret)
for _, fr in ipairs(funret) do
if not no_combine_metadata then
fr = merge_metadata(metadata, "combine", formobj, fr, "merge_into_new")
end
retval = export.insert_formobj_into_list {
existing_list = retval,
formobj = fr,
metadata = metadata,
}
end
end
end
return retval
end
--[==[
Insert a form object (see above) into a list of such objects. If the form is already present (i.e. both the form
value and translit, if any, match), the footnotes of the existing and new form might be combined (specifically,
footnotes in the new form beginning with `!` will be combined).
]==]
function export.insert_form_into_list(list, form)
-- Don't do anything if the form object or the form inside it is nil. This simplifies
-- form insertion in the presence of inflection generating functions that may return nil,
-- such as generate_noun_vocative() and generate_noun_count_form().
if not form or not form.form then
return
end
for _, listform in ipairs(list) do
if listform.form == form.form and listform.translit == form.translit then
listform.footnotes = export.deduplicate_footnotes(listform.footnotes, form.footnotes)
return
end
end
-- Form not found.
insert(list, form)
end
--[==[
Insert a list of form objects (see above) into an existing list of such objects. ``forms`` can be {nil},
in which case nothing happens. This is equivalent to calling `insert_form_into_list` for each form object.
]==]
function export.insert_forms_into_list(list, forms)
if not forms then
return
end
for _, form in ipairs(forms) do
export.insert_form_into_list(list, form)
end
end
--[==[
Insert a form object (see above) into the given slot in the given form table. ``form`` can be {nil}, in which case
nothing happens.
]==]
function export.insert_form(formtable, slot, form)
-- Don't do anything if the form object or the form inside it is nil. This simplifies
-- form insertion in the presence of inflection generating functions that may return nil,
-- such as generate_noun_vocative() and generate_noun_count_form().
if not form or not form.form then
return
end
if not formtable[slot] then
formtable[slot] = {}
end
export.insert_form_into_list(formtable[slot], form)
end
--[==[
Insert a list of form objects (see above) into the given slot in the given form table. ``forms`` can be {nil},
in which case nothing happens.
]==]
function export.insert_forms(formtable, slot, forms)
if not forms then
return
end
for _, form in ipairs(forms) do
export.insert_form(formtable, slot, form)
end
end
--[==[
Identity mapping function.
]==]
function export.identity(formval, translit)
return formval, translit
end
local function form_value_transliterable(formval)
return formval ~= "?" and formval ~= "—"
end
local function call_map_function_str(str, fun)
if str == "?" then
return "?"
end
local newformval, newtranslit = fun(str)
if newtranslit then
return {form=newformval, translit=newtranslit}
else
return newformval
end
end
-- FIXME: This doesn't correctly handle metadata.
local function call_map_function_obj(form, fun)
if form.form == "?" then
return {form = "?", footnotes = form.footnotes}
end
local newformval, newtranslit = fun(form.form, form.translit)
return {form = newformval, translit = newtranslit, footnotes = form.footnotes}
end
--[==[
Map a function over the form values in ``forms`` (a list of form objects in "full list form"; see above). If an
input form value is {"?"}, it is preserved on output and the function is not called. Otherwise, the function is
called with two arguments, the original form and manual translit; if manual translit isn't relevant, it's fine to
declare the function with only one argument. The return value is either a single value (the new form) or two values
(the new form and new manual translit). The footnotes (if any) from the input form objects are preserved on output. Uses
`insert_form_into_list()` to insert the resulting form objects into the returned list in case two different forms map
to the same thing.
FIXME: Expand this to correctly handle metadata, or create a variant that correctly handles metadata.
]==]
function export.map_forms(forms, fun)
if not forms then
return nil
end
local retval = {}
for _, form in ipairs(forms) do
export.insert_form_into_list(retval, call_map_function_obj(form, fun))
end
return retval
end
--[==[
Map a list-returning function over the form values in ``forms`` (a list of form objects in "full list form"; see
above). If an input form value is {"?"}, it is preserved on output and the function is not called. Otherwise, the
function is called with two arguments, the original form and manual translit; if manual translit isn't relevant, it's
fine to declare the function with only one argument. The return value of the function can be {nil} or an abbreviated
form list (i.e. anything that is convertible into a full list form, such as a single form value, a list of form
values, a form object or a list of form objects). For each form object in the return value, the footnotes of that form
object (if any) are combined with any footnotes from the input form object, and the result inserted into the returned
list using `insert_form_into_list()` in case two different forms map to the same thing.
]==]
function export.flatmap_forms(forms, fun)
if not forms then
return nil
end
local retval = {}
for _, form in ipairs(forms) do
local funret = form.form == "?" and form or fun(form.form, form.translit)
if funret then
funret = export.convert_to_general_list_form(funret)
for _, fr in ipairs(funret) do
local newform = {
form = fr.form,
translit = fr.translit,
footnotes = export.combine_footnotes(form.footnotes, fr.footnotes)
}
export.insert_form_into_list(retval, newform)
end
end
end
return retval
end
--[==[
Map a function over the form values in ``abforms`` (an abbreviated form list). If the input form value is {"?"}, it is
preserved on output and the function is not called. If ``first_only`` is given and ``abforms`` is a list, only map over
the first element. Return value is of the same form as ``abforms``, unless ``abforms`` is a string and the function
returns both form value and manual translit (in which case the return value is a form object). The function is called
with two arguments, the original form value and manual translit; if manual translit isn't relevant, it's fine to declare
the function with only one argument. The return value is either a single value (the new form value) or two values (the
new form value and new manual translit). The footnotes (if any) from the input form objects are preserved on output.
FIXME: This function is used only in [[Module:bg-verb]] and should be moved into that module.
]==]
function export.map_form_or_forms(abforms, fun, first_only)
if not abforms then
return nil
elseif type(abforms) == "string" then
return call_map_function_str(abforms, fun)
elseif abforms.form then
return call_map_function_obj(abforms, fun)
else
local retval = {}
for i, abform in ipairs(abforms) do
if first_only then
return export.map_form_or_forms(abform, fun)
end
insert(retval, export.map_form_or_forms(abform, fun))
end
return retval
end
end
--[==[
Expand a given footnote (as specified by the user, including the surrounding brackets) into the form to be inserted
into the final generated table. If ``no_parse_refs`` is not given and the footnote is a reference (of the form
{"[ref:...]"}), parse and return the specified reference(s). Two values are returned, `footnote_string` (the expanded
footnote, or nil if the second value is present) and `references` (a list of objects of the form
`{text = ``text``, name = ``name``, group = ``group``}` if the footnote is a reference and ``no_parse_refs`` is not
given, otherwise {nil}). Unless ``return_raw`` is given, the returned footnote string is capitalized and has a final
period added.
]==]
function export.expand_footnote_or_references(note, return_raw, no_parse_refs)
local _, notetext = extract_footnote_modifiers(note)
if not no_parse_refs and notetext:find("^ref:") then
-- a reference
notetext = notetext:gsub("^ref:", "")
local parsed_refs = require("Module:references").parse_references(notetext)
for i, ref in ipairs(parsed_refs) do
if type(ref) == "string" then
parsed_refs[i] = {text = ref}
end
end
return nil, parsed_refs
end
if footnote_abbrevs[notetext] then
notetext = footnote_abbrevs[notetext]
track("footnote-whole-abbrev")
else
local split_notes = split(notetext, "<(.-)>")
for i, split_note in ipairs(split_notes) do
if i % 2 == 0 then
split_notes[i] = footnote_abbrevs[split_note]
track("footnote-angle-bracket-abbrev")
if not split_notes[i] then
-- Don't error for now, because HTML might be in the footnote.
-- Instead we should switch the syntax here to e.g. <<a>> to avoid
-- conflicting with HTML.
split_notes[i] = "<" .. split_note .. ">"
track("footnote-unrecognized-angle-bracket-abbrev")
--error("Unrecognized footnote abbrev: <" .. split_note .. ">")
else
track("footnote-recognized-angle-bracket-abbrev")
end
end
end
notetext = concat(split_notes)
end
return return_raw and notetext or ucfirst(notetext) .. "."
end
--[==[
Convert a list of foonotes to qualifiers and references for use in [[Module:headword]] or similar. Returns two values,
a list of qualifiers (possibly {nil}) and a list of reference structures (possibly {nil}), following the structure
defined in [[Module:references]]).
]==]
function export.convert_footnotes_to_qualifiers_and_references(footnotes)
if not footnotes then
return nil
end
local quals, refs
for _, qualifier in ipairs(footnotes) do
local this_footnote, this_refs = export.expand_footnote_or_references(qualifier, "return raw")
if this_refs then
if not refs then
refs = this_refs
else
for _, ref in ipairs(this_refs) do
insert(refs, ref)
end
end
else
if not quals then
quals = {this_footnote}
else
insert(quals, this_footnote)
end
end
end
return quals, refs
end
--[==[
Combine an abbreviated form object (either a string or a table) with additional footnotes, possibly replacing the form
value and/or translit in the process. Normally called in one of two ways:
(1) `combine_form_and_footnotes(``form_obj``, ``addl_footnotes``, ``new_form``, ``new_translit``)` where ``form_obj``
is an existing abbreviated form object; ``addl_footnotes`` is either {nil}, a single string (a footnote) or a list
of footnotes; ``new_formval`` is either {nil} or the new form value to substitute; and ``new_translit`` is either
{nil} or the new translit string to substitute.
(2) `combine_form_and_footnotes(``form_value``, ``footnotes``)`, where ``form_value`` is a form value (a string) and
``footnotes`` is either {nil}, a single string (a footnote) or a list of footnotes.
In either case, a form object is returned, preserving as many properties as possible from any existing form object in
``abform``. Do the minimal amount of work; e.g. if ``abform`` is a form object and ``addl_footnotes``, ``new_formval``
and ``new_translit`` are all {nil}, the same object as passed in is returned. Under no circumstances is the existing
form object side-effected.
'''FIXME:''' This does not correctly preserve metadata.
]==]
function export.combine_form_and_footnotes(abform, addl_footnotes, new_formval, new_translit)
if type(addl_footnotes) == "string" then
addl_footnotes = {addl_footnotes}
end
if not addl_footnotes and not new_formval and not new_translit then
return abform
end
if type(abform) == "string" then
new_formval = new_formval or abform
return {form = new_formval, translit = new_translit, footnotes = addl_footnotes}
end
abform = shallow_copy(abform)
if new_formval then
abform.form = new_formval
end
if new_translit then
abform.translit = new_translit
end
if addl_footnotes then
abform.footnotes = export.combine_footnotes(abform.footnotes, addl_footnotes)
end
return abform
end
--[==[
Convert an abbreviated form list (either a string, form object, or list of either) into full list form.
This function does not side-effect any of the objects passed into ``abforms``, but will return ``abforms``
unchanged if already in full list form.
]==]
function export.convert_to_full_list_form(abforms)
if type(abforms) == "string" then
return {{form = abforms}}
elseif abforms.form then
return {abforms}
else
-- Check if already in full list form and return directly if so.
local must_convert = false
for _, form in ipairs(abforms) do
if type(form) == "string" then
must_convert = true
break
end
end
if not must_convert then
return abforms
end
end
local retval = {}
for _, form in ipairs(abforms) do
if type(form) == "string" then
insert(retval, {form = form})
else
insert(retval, form)
end
end
return retval
end
--[==[
Convert an abbreviated form list (either a string, form object, or list of either) into full list form. If
``footnotes`` is supplied, then for each form in the form list, combine the form's footnotes with ``footnotes``.
This function does not side-effect any of the objects passed into ``abforms``, but will return ``abforms``
unchanged if already in full list form and ``footnotes`` is {nil}.
'''FIXME:''' This does not correctly preserve metadata.
]==]
function export.convert_to_general_list_form(abforms, footnotes)
if type(footnotes) == "string" then
footnotes = {footnotes}
end
if type(abforms) == "string" then
return {{form = abforms, footnotes = footnotes}}
elseif abforms.form then
return {export.combine_form_and_footnotes(abforms, footnotes)}
elseif not footnotes then
-- Check if already in full list form and return directly if so.
local must_convert = false
for _, form in ipairs(abforms) do
if type(form) == "string" then
must_convert = true
break
end
end
if not must_convert then
return abforms
end
end
local retval = {}
for _, form in ipairs(abforms) do
if type(form) == "string" then
insert(retval, {form = form, footnotes = footnotes})
else
insert(retval, export.combine_form_and_footnotes(form, footnotes))
end
end
return retval
end
local function is_table_of_strings(forms)
for k, v in pairs(forms) do
if type(k) ~= "number" or type(v) ~= "string" then
return false
end
end
return true
end
local function lang_or_func_transliterate(func, lang, text)
local retval
if func then
retval = func(text)
else
retval = (lang:transliterate(text))
end
-- FIXME! Hack to work around bug in ...:transliterate(). Remove me as soon as this bug is fixed.
if not retval and (text == " " or text == "-" or text == "-́" or text == "?" or text == "-∅") then
retval = text
end
if not retval then
error(("Unable to transliterate text '%s'"):format(text))
end
return retval
end
--[==[
Combine ``stems`` and ``endings`` and store into slot ``slot`` of form table ``formtable``. Either of ``stems`` and
``endings`` can be {nil} or an abbreviated form list. The combination of a given stem and ending happens using
``combine_stem_ending``, which takes two parameters (stem and ending, each a string) and returns one value (a string).
If manual transliteration is present in either ``stems`` or ``endings``, ``lang`` (a language object or a function of
one argument to transliterate a string) along with ``combine_stem_ending_tr`` (a function for combining manual
transliterations that works much like ``combine_stem_ending``) must be given. ``footnotes``, if specified, is a list of
additional footnotes to attach to the resulting inflections (stem+ending combinations). The resulting inflections are
inserted into the form table using `insert_form()`, in case of duplication.
]==]
function export.add_forms(formtable, slot, stems, endings, combine_stem_ending, lang, combine_stem_ending_tr, footnotes)
if stems == nil or endings == nil then
return
end
local function combine(stem, ending)
if stem == "?" or ending == "?" then
return "?"
end
return combine_stem_ending(stem, ending)
end
local function transliterate(text)
return lang_or_func_transliterate(is_callable(lang) and lang or nil, lang, text)
end
if type(stems) == "string" and type(endings) == "string" then
export.insert_form(formtable, slot, {form = combine(stems, endings), footnotes = footnotes})
elseif type(stems) == "string" and is_table_of_strings(endings) then
for _, ending in ipairs(endings) do
export.insert_form(formtable, slot, {form = combine(stems, ending), footnotes = footnotes})
end
else
stems = export.convert_to_general_list_form(stems)
endings = export.convert_to_general_list_form(endings, footnotes)
for _, stem in ipairs(stems) do
for _, ending in ipairs(endings) do
local new_footnotes = nil
if stem.footnotes and ending.footnotes then
new_footnotes = shallow_copy(stem.footnotes)
for _, footnote in ipairs(ending.footnotes) do
insert_if_not(new_footnotes, footnote)
end
elseif stem.footnotes then
new_footnotes = stem.footnotes
elseif ending.footnotes then
new_footnotes = ending.footnotes
end
local new_form = combine(stem.form, ending.form)
local new_translit
if new_form ~= "?" and (stem.translit or ending.translit) then
if not lang or not combine_stem_ending_tr then
error("Internal error: With manual translit, 'lang' and 'combine_stem_ending_tr' must be passed to 'add_forms'")
end
local stem_tr = stem.translit or transliterate(m_links.remove_links(stem.form))
local ending_tr = ending.translit or transliterate(m_links.remove_links(ending.form))
new_translit = combine_stem_ending_tr(stem_tr, ending_tr)
end
export.insert_form(formtable, slot, {form = new_form, translit = new_translit, footnotes = new_footnotes})
end
end
end
end
--[==[
Combine any number of form components and store into slot ``slot`` of form table ``formtable``. ``components`` is a list of abbreviated form
lists which should be concatenated similarly to how `add_forms()` does it, and stored in ``slot`` along with any footnotes in ``footnotes``.
More specifically:
# If there are no components, nothing happens.
# If there is one component, it is converted to full list form and `insert_forms()` called.
# If there are two components, they are treated as stems and endings respectively and `add_forms()` is called.
# If there are three or more components, they are concatenated left-to-right in the manner of a `reduce()` operation: the first two components
are combined using `add_forms()` and stored into a temporary table, then the next component is combined with the result of the previous
operation, etc. In the last combination, footnotes in `footnotes` are combined in, and the result stored into `formtable`.
This should generally be used when you are likely to have three or more components, as in [[Module:ar-verb]] (prefixes, stems and endings)
and [[Module:de-verb]] (which in some situations has five components combined together). ``combine_stem_ending``, ``lang``,
``combine_stem_ending_tr`` and ``footnotes`` are as in `add_forms()`.
]==]
function export.add_multiple_forms(formtable, slot, components, combine_stem_ending, lang, combine_stem_ending_tr, footnotes)
if #components == 0 then
return
elseif #components == 1 then
local forms = export.convert_to_general_list_form(components[1], footnotes)
export.insert_forms(formtable, slot, forms)
elseif #components == 2 then
local stems = components[1]
local endings = components[2]
export.add_forms(formtable, slot, stems, endings, combine_stem_ending, lang, combine_stem_ending_tr, footnotes)
else
local prev = components[1]
for i=2, #components do
local temptable = {}
export.add_forms(temptable, slot, prev, components[i], combine_stem_ending, lang, combine_stem_ending_tr,
i == #components and footnotes or nil)
prev = temptable[slot]
end
export.insert_forms(formtable, slot, prev)
end
end
local function iterate_slot_list_or_table(props, do_slot)
if props.slot_list then
for _, slot_and_accel_tag_set in ipairs(props.slot_list) do
local slot, accel_tag_set = unpack(slot_and_accel_tag_set)
do_slot(slot, accel_tag_set)
end
else
for slot, accel_tag_set in pairs(props.slot_table) do
do_slot(slot, accel_tag_set)
end
end
end
function export.default_split_bracketed_runs_into_words(bracketed_runs, data)
-- If the text begins with a hyphen, include the hyphen in the set of allowed characters
-- for an inflected segment. This way, e.g. conjugating "-ir" is treated as a regular
-- -ir verb rather than a hyphen + irregular [[ir]].
local is_suffix = (not data or data.text_index == 1) and bracketed_runs[1]:find("^%-")
local split_pattern = is_suffix and " " or "[ %-]"
return put.split_alternating_runs(bracketed_runs, split_pattern, "preserve splitchar")
end
local function props_transliterate(props, text)
return lang_or_func_transliterate(props.transliterate, props.lang, text)
end
local function parse_before_or_post_text(data)
-- NOTE: data.text_index is also used (in `default_split_bracketed_runs_into_words`).
local props, text, segments, lemma_is_last = data.props, data.text, data.segments, data.lemma_is_last
-- Call parse_balanced_segment_run() to keep multiword links together.
local bracketed_runs = put.parse_balanced_segment_run(text, "[", "]")
-- Split normally on space or hyphen (but customizable). Use preserve_splitchar so we know whether the separator was
-- a space or hyphen.
local space_separated_groups
if props.split_bracketed_runs_into_words then
space_separated_groups = props.split_bracketed_runs_into_words(bracketed_runs)
end
if not space_separated_groups then
space_separated_groups = export.default_split_bracketed_runs_into_words(bracketed_runs, data)
end
local parsed_components = {}
local parsed_components_translit = {}
local saw_manual_translit = false
local lemma
for j, space_separated_group in ipairs(space_separated_groups) do
local component = concat(space_separated_group)
if lemma_is_last and j == #space_separated_groups then
lemma = component
if lemma == "" and not props.allow_blank_lemma then
error("Word is blank: '" .. concat(segments) .. "'")
end
elseif component:find("//") then
-- Manual translit or respelling specified.
if not props.lang then
error("Manual translit not allowed for this language; if this is incorrect, 'props.lang' must be set internally")
end
saw_manual_translit = true
local split_components = split(component, "//", "plain")
if #split_components ~= 2 then
error("Term with translit or respelling should have only one // in it: " .. component)
end
local translit
component, translit = unpack(split_components)
if props.transliterate_respelling then
translit = props.transliterate_respelling(translit)
end
insert(parsed_components, component)
insert(parsed_components_translit, translit)
else
insert(parsed_components, component)
insert(parsed_components_translit, false) -- signal that it may need later transliteration
end
end
if saw_manual_translit then
for j, parsed_component in ipairs(parsed_components) do
if not parsed_components_translit[j] then
parsed_components_translit[j] = props_transliterate(props, m_links.remove_links(parsed_component))
end
end
end
text = concat(parsed_components)
local translit
if saw_manual_translit then
translit = concat(parsed_components_translit)
end
return text, translit, lemma
end
--[=[
Parse a segmented multiword spec such as "[[медичний|меди́чна]]<+> [[сестра́]]<*,*#.pr>" (in Ukrainian).
"Segmented" here means it is broken up on <...> segments using parse_balanced_segment_run(text, "<", ">"),
e.g. the above text would be passed in as {"[[медичний|меди́чна]]", "<+>", " [[сестра́]]", "<*,*#.pr>", ""}.
The return value is a table of the form
{
word_specs = {``word_spec``, ``word_spec``, ...},
post_text = "``text-at-end``",
post_text_no_links = "``text-at-end-no-links``",
post_text_translit = "``manual-translit-of-text-at-end``" or nil (if no manual translit or respelling was specified in the post-text)
}
where ``word_spec`` describes an individual inflected word and "``text-at-end``" is any raw text that may occur
after all inflected words. Individual words or linked text (including multiword text) may be given manual
transliteration or respelling in languages that support this using ``text``//``translit`` or ``text``//``respelling``.
Each ``word_spec`` is of the form returned by parse_indicator_spec():
{
lemma = "``lemma``",
before_text = "``text-before-word``",
before_text_no_links = "``text-before-word-no-links``",
before_text_translit = "``manual-translit-of-text-before-word``" or nil (if no manual translit or respelling was specified in the before-text)
-- Fields as described in parse_indicator_spec()
...
}
For example, the return value for "[[медичний|меди́чна]]<+> [[сестра́]]<*,*#.pr>" is
{
word_specs = {
{
lemma = "[[медичний|меди́чна]]",
overrides = {},
adj = true,
before_text = "",
before_text_no_links = "",
forms = {},
},
{
lemma = "[[сестра́]]",
overrides = {},
stresses = {
{
reducible = true,
genpl_reversed = false,
},
{
reducible = true,
genpl_reversed = true,
},
},
animacy = "pr",
before_text = " ",
before_text_no_links = " ",
forms = {},
},
},
post_text = "",
post_text_no_links = "",
}
]=]
local function parse_multiword_spec(segments, props, disable_allow_default_indicator)
local multiword_spec = {
word_specs = {}
}
if not disable_allow_default_indicator then
if #segments == 1 then
if props.allow_default_indicator then
insert(segments, "<>")
insert(segments, "")
elseif props.angle_brackets_omittable then
segments[1] = "<" .. segments[1] .. ">"
insert(segments, 1, "")
insert(segments, "")
end
end
end
-- Loop over every other segment. The even-numbered segments are angle-bracket specs while
-- the odd-numbered segments are the text between them.
for i = 2, #segments - 1, 2 do
local before_text, before_text_translit, lemma =
parse_before_or_post_text {
props = props,
text = segments[i - 1],
text_index = i - 1,
segments = segments,
lemma_is_last = true
}
local base = props.parse_indicator_spec(segments[i], lemma)
base.before_text = before_text
base.before_text_no_links = m_links.remove_links(base.before_text)
base.before_text_translit = before_text_translit
base.lemma = base.lemma or lemma
insert(multiword_spec.word_specs, base)
end
multiword_spec.post_text, multiword_spec.post_text_translit =
parse_before_or_post_text {
props = props,
text = segments[#segments],
text_index = #segments,
segments = segments,
lemma_is_last = false
}
multiword_spec.post_text_no_links = m_links.remove_links(multiword_spec.post_text)
return multiword_spec
end
--[=[
Parse an alternant, e.g. "((родо́вий,родови́й))" or "((ру́син<pr>,руси́н<b.pr>))" (both in Ukrainian).
The return value is a table of the form
{
alternants = {``multiword_spec``, ``multiword_spec``, ...}
}
where ``multiword_spec`` describes a given alternant and is as returned by parse_multiword_spec().
]=]
local function parse_alternant(alternant, props)
local alternant_text = alternant:match("^%(%((.*)%)%)$")
local segments = put.parse_balanced_segment_run(alternant_text, "<", ">")
local comma_separated_groups = put.split_alternating_runs(segments, "%s*,%s*")
local alternant_spec = {alternants = {}}
for _, comma_separated_group in ipairs(comma_separated_groups) do
insert(alternant_spec.alternants, parse_multiword_spec(comma_separated_group, props))
end
return alternant_spec
end
--[==[
Top-level parsing function. Parse text describing one or more inflected words. `text` is the inflected text to parse,
which generally has `<...>` specs following words to be inflected, and may have alternants indicated using double
parens. Examples:
* {"[[медичний|меди́чна]]<+> [[сестра́]]<*,*#.pr>"} (Ukrainian, for {{m|uk|меди́чна сестра́||nurse|lit=medical sister}});
* {"((ру́син<pr>,руси́н<b.pr>))"} (Ukrainian, for {{m|uk|русин||Rusyn}}, with two possible stress patterns);
* {"पंचायती//पंचाय*ती राज<M>"} (Hindi, for {{m|hi|पंचायती राज||village council}}, with phonetic respelling in the
before-text component);
* {"((<M>,<M.plstem:फ़तूह.dirpl:फ़तूह>))"} (Hindi, for {{m|hi|फ़तह||win, victory}} when used on that page, where the lemma
is omitted and taken from the pagename);
* {""} (for any number of Hindi adjectives, where the lemma is omitted and taken from the pagename, and the angle
bracket spec <> is assumed);
* {"काला<+>धन<M>"} (Hindi, for {{m|hi|कालाधन||black money}}, showing that closed compounds where each part is declined
can be correctly handled).
`props` is an object specifying properties used during parsing, as follows:
```{
parse_indicator_spec = __function__(``angle_bracket_spec``, ``lemma``) `''(required)''`,
lang = __lang object__,
transliterate_respelling = __function__(``respelling_or_translit``) `''(optional)''`,
split_bracketed_runs_into_words = __function__(``bracket_split_runs``) `''(optional)''`,
allow_default_indicator = __boolean__,
angle_brackets_omittable = __boolean__,
allow_blank_lemma = __boolean__,
}```
`parse_indicator_spec` is a required function that takes two arguments, a string surrounded by angle brackets and the
lemma, and should return an arbitrary object containing properties describing the indicators inside of the angle
brackets). This object is often called a '''base''' and given the argument name `base` in inflection code.
`lang` is the language object for the language in question; only needed if manual translit or respelling may be present
using `//`.
`transliterate_respelling` is a function that is only needed if respelling is allowed in place of manual translit after
`//`. It takes one argument, the respelling or translit, and should return the transliteration of any respelling but
return any translit unchanged.
`split_bracketed_runs_into_words` is an optional function to split the passed-in text into words. It is used, for
example, to determine what text constitutes a word when followed by an angle-bracket spec, i.e. what the lemma to be
inflected is vs. surrounding fixed text. It takes one argument, the result of splitting the original text on brackets,
and should return alternating runs of words and split characters, or nil to apply the default algorithm. Specifically,
the value passed in is the result of calling `parse_balanced_segment_run(``text``, "[", "]")` from
[[Module:parse utilities]] on the original text, and the default version of this function calls
`split_alternating_runs(``bracketed_runs``, ``pattern``, "preserve splitchar")`, where ``bracketed_runs`` is the value
passed in and ``pattern`` splits on either spaces or hyphens (unless the text begins with a hyphen, in which case
splitting is only on spaces, so that suffixes can be inflected).
`allow_default_indicator` should be {true} if an empty indicator in angle brackets `<>` can be omitted and should be
automatically added at the end of the multiword text (if no alternants) or at the end of each alternant (if alternants
present).
`angle_brackets_omittable` should be {true} if angle brackets can be omitted around a non-empty indicator in the
presence of a blank lemma. In this case, if the combined indicator spec has no angle brackets, they will be added around
the indicator (or around all indicators, if alternants are present). This only makes sense when `allow_blank_lemma` is
specified.
`allow_blank_lemma` should be {true} of if a blank lemma is allowed; in such a case, the calling function should
substitute a default lemma, typically taken from the pagename.
The return value is a table referred to as an '''alternant multiword spec''', and is of the form
```{
alternant_or_word_specs = {``alternant_or_word_spec``, ``alternant_or_word_spec``, ...},
post_text = "``text_at_end``",
post_text_no_links = "``text_at_end_no_links``",
post_text_translit = "``translit_of_text_at_end``" `(or nil)`,
}```
where `alternant_or_word_spec` is either an '''alternant spec''' as returned by `parse_alternant()` or a
'''multiword spec''' as described in the comment above `parse_multiword_spec()`. An alternant spec looks as follows:
```{
alternants = {``multiword_spec``, ``multiword_spec``, ...},
before_text = "``text_before_alternant``",
before_text_no_links = "``text_before_alternant``",
before_text_translit = "``translit_of_text_before_alternant``" `(or nil)`,
}```
i.e. it is like what is returned by `parse_alternant()` but has extra `before_text` and `before_text_no_links` fields.
]==]
function export.parse_inflected_text(text, props)
if props.angle_brackets_omittable and not props.allow_blank_lemma then
error("If 'angle_brackets_omittable' is specified, so should 'allow_blank_lemma'")
end
local alternant_multiword_spec = {alternant_or_word_specs = {}}
local alternant_segments = split(text, "(%(%(.-%)%))")
local last_post_text, last_post_text_no_links, last_post_text_translit
for i = 1, #alternant_segments do
if i % 2 == 1 then
local segments = put.parse_balanced_segment_run(alternant_segments[i], "<", ">")
-- Disable allow_default_indicator if alternants are present and we're processing
-- the non-alternant text. Otherwise we will try to treat the non-alternant text
-- surrounding the alternants as an inflected word rather than as raw text.
local multiword_spec = parse_multiword_spec(segments, props, #alternant_segments ~= 1)
for _, word_spec in ipairs(multiword_spec.word_specs) do
insert(alternant_multiword_spec.alternant_or_word_specs, word_spec)
end
last_post_text = multiword_spec.post_text
last_post_text_no_links = multiword_spec.post_text_no_links
last_post_text_translit = multiword_spec.post_text_translit
else
local alternant_spec = parse_alternant(alternant_segments[i], props)
alternant_spec.before_text = last_post_text
alternant_spec.before_text_no_links = last_post_text_no_links
alternant_spec.before_text_translit = last_post_text_translit
insert(alternant_multiword_spec.alternant_or_word_specs, alternant_spec)
end
end
alternant_multiword_spec.post_text = last_post_text
alternant_multiword_spec.post_text_no_links = last_post_text_no_links
alternant_multiword_spec.post_text_translit = last_post_text_translit
-- Save boolean properties from `props`. We need at least `allow_default_indicator` when implementing
-- `reconstruct_original_spec()`.
alternant_multiword_spec.allow_default_indicator = props.allow_default_indicator
alternant_multiword_spec.angle_brackets_omittable = props.angle_brackets_omittable
alternant_multiword_spec.allow_blank_lemma = props.allow_blank_lemma
return alternant_multiword_spec
end
-- Inflect alternants in ``alternant_spec`` (an object as returned by parse_alternant()).
-- This sets the form values in ```alternant_spec``.forms` for all slots.
-- (If a given slot has no values, it will not be present in ```alternant_spec``.forms`).
local function inflect_alternants(alternant_spec, props)
alternant_spec.forms = {}
for _, multiword_spec in ipairs(alternant_spec.alternants) do
export.inflect_multiword_or_alternant_multiword_spec(multiword_spec, props)
iterate_slot_list_or_table(props, function(slot)
if not props.skip_slot or not props.skip_slot(slot) then
export.insert_forms(alternant_spec.forms, slot, multiword_spec.forms[slot])
end
end)
end
end
--[=[
Subfunction of `inflect_multiword_or_alternant_multiword_spec()`. This is used in building up the inflections of
multiword expressions. The basic purpose of this function is to append a set of forms representing the inflections of
a given inflected term in a given slot onto the existing forms for that slot. Given a multiword expression potentially
consisting of several inflected terms along with fixed text in between, we work iteratively from left to right, adding
the new forms onto the existing ones. Normally, all combinations of new and existing forms are created, meaning if
there are M existing forms and N new ones, we will end up with M*N forms. However, some of these combinations can be
rejected using the variant mechanism (see the description of get_variants below).
Specifically, `formtable` is a table of per-slot forms, where the key is a slot and the value is a list of form objects
(objects of the form {form=``form``, translit=``manual_translit``, footnotes=``footnotes``}). `slot` is the slot in question.
`forms` specifies the forms to be appended onto the existing forms, and is likewise a list of form objects. `props`
is the same as in `inflect_multiword_or_alternant_multiword_spec()`. `before_text` is the fixed text that goes before
the forms to be added. `before_text_no_links` is the same as `before_text` but with any links (i.e. hyperlinks of the
form [[``term``]] or [[``term``|``display``]]) converted into raw terms using remove_links() in [[Module:links]], and
`before_text_translit` is optional manual translit of `before_text_no_links`.
Note that the value "?" in a form is "infectious" in that if either the existing or new form has the value "?", the
resulting combination will also be "?". This allows "?" to be used to mean "unknown".
]=]
local function append_forms(props, formtable, slot, forms, before_text, before_text_no_links, before_text_translit)
if not forms then
return
end
local old_forms = formtable[slot] or {{form = ""}}
local ret_forms = {}
for _, old_form in ipairs(old_forms) do
for _, form in ipairs(forms) do
local old_form_vars = props.get_variants and props.get_variants(old_form.form) or ""
local form_vars = props.get_variants and props.get_variants(form.form) or ""
if old_form_vars ~= "" and form_vars ~= "" and old_form_vars ~= form_vars then
-- Reject combination due to non-matching variant codes.
else
local new_formval
local new_translit
if old_form.form == "?" or form.from == "?" then
new_formval = "?"
else
new_formval = old_form.form .. before_text .. form.form
if old_form.translit or before_text_translit or form.translit then
if not props.lang then
error("Internal error: If manual translit is given, 'props.lang' must be set")
end
if not before_text_translit then
before_text_translit = props_transliterate(props, before_text_no_links) or ""
end
local old_translit =
old_form.translit or props_transliterate(props, m_links.remove_links(old_form.form)) or ""
local translit =
form.translit or props_transliterate(props, m_links.remove_links(form.form)) or ""
new_translit = old_translit .. before_text_translit .. translit
end
end
local new_formobj
local new_footnotes = export.combine_footnotes(old_form.footnotes, form.footnotes)
if new_formval == form.form and new_translit == form.translit then
-- Automatically preserve metadata when possible.
new_formobj = shallow_copy(form)
new_formobj.footnotes = new_footnotes
else
new_formobj = {form=new_formval, translit=new_translit, footnotes=new_footnotes}
if props.combine_metadata then
props.combine_metadata {
slot = slot,
dest_form = new_formobj,
form1 = old_form,
form2 = form,
between_text = before_text,
between_text_no_links = before_text_no_links,
between_text_translit = before_text_translit,
}
end
end
insert(ret_forms, new_formobj)
end
end
end
formtable[slot] = ret_forms
end
--[==[
Top-level inflection function. Create the inflections of a noun, verb, adjective or similar. `alternant_multiword_spec`
is as
returned by `parse_inflected_text` and describes the properties of the term to be inflected, including all the
user-provided inflection specifications (e.g. the number, gender, conjugation/declension/etc. of each word) and the
surrounding text. `props` indicates how to do the actual inflection (see below). The resulting inflected forms are
stored into the `.forms` property of `multiword_spec`. This property holds a table whose keys are slots (i.e. ID's
of individual inflected forms, such as "pres_1sg" for the first-person singular present indicative tense of a verb)
and whose values are lists of the form `{ form = ``form``, translit = ``manual_translit_or_nil``, footnotes = ``footnote_list_or_nil``}`,
where ``form`` is a string specifying the value of the form (e.g. "ouço" for the first-person singular present indicative
of the Portuguese verb [[ouvir]]); ``manual_translit_or_nil`` is the corresponding manual transliteration if needed (i.e.
if the form is in a non-Latin script and the automatic transliteration is incorrect or unavailable), otherwise nil;
and ``footnote_list_or_nil`` is a list of footnotes to be attached to the form, or nil for no footnotes. Note that
currently footnotes must be surrounded by brackets, e.g "[archaic]", and should not begin with a capital letter or end
with a period. (Conversion from "[archaic]" to "Archaic." happens automatically.)
This function has no return value, but modifies `multiword_spec` in-place, adding the `forms` table as described above.
After calling this function, call show_forms() on the `forms` table to convert the forms and footnotes given in this
table to strings suitable for display.
`props` is an object specifying properties used during inflection, as follows:
```{
slot_list = {{"``slot``", "``accel``"}, {"``slot``", "``accel``"}, ...},
slot_table = {``slot`` = "``accel``", ``slot`` = "``accel``", ...},
skip_slot = nil `or` __function__(slot),
lang = nil `or` __lang_object__,
inflect_word_spec = __function__(base),
get_variants = nil 'or` __function__(formval),
combine_metadata = nil `or` __function__(data),
include_user_specified_links = __boolean__,
}```
`slot_list` is a list of two-element lists of slots and associated accelerator tags. ``slot`` is arbitrary but should
correspond with slot names as generated by `inflect_word_spec`. ``accel`` is the corresponding accelerator tags; e.g. if
``slot`` is "pres_1sg", ``accel`` might be "1|s|pres|ind". ``accel`` is actually unused during inflection, but is used
during `show_forms()`, which takes the same `slot_list` as a property upon input.
`slot_table` is a table mapping slots to associated accelerator tags and serves the same function as `slot_list`. Only
one of `slot_list` or `slot_table` must be given. For new code it is preferable to use `slot_list` because this allows
you to control the order of processing slots, which may occasionally be important.
`skip_slot` is a function of one argument, a slot name, and should return a boolean indicating whether to skip the
given slot during inflection. It can be used, for example, to skip singular slots if the overall term being inflected
is plural-only, and vice-versa.
`lang` is a language object. This is only used to generate manual transliteration. If the language is written in the
Latin script or manual transliteration cannot be specified in the input to parse_inflected_text(), this can be omitted.
(Manual transliteration is allowed if the `lang` object is set in the `props` passed to parse_inflected_text().)
`inflect_word_spec` is the function to do the actual inflection. It is passed a single argument, which is a ``word_spec``
object describing the word to be inflected and the user-provided inflection specifications. It is exactly the same as
was returned by the `parse_indicator_spec` function provided in the `props` sent on input to `parse_inflected_text`, but
has additional fields describing the word to be inflected and the surrounding text, as follows:
```{
lemma = "``lemma``",
before_text = "``text-before-word``",
before_text_no_links = "``text-before-word-no-links``",
before_text_translit = "``manual-translit-of-text-before-word``" or nil (if no manual translit or respelling was specified in the before-text)
-- Fields as described in parse_indicator_spec()
...
}```
Here ``lemma`` is the word to be inflected as specified by the user (including any links if so given), and the
`before_text*` fields describe the raw text preceding the word to be inflected. Any other fields in this object are as
set by `parse_inflected_text`, and describe things like the gender, number, conjugation/declension, etc. as specified
by the user in the <...> spec following the word to be inflected.
`inflect_word_spec` should initialize the `.forms` property of the passed-in ``word_spec`` object to the inflected forms of
the word in question. The value of this property is a table of the same format as the `.forms` property that is
ultimately generated by inflect_multiword_or_alternant_multiword_spec() and described above near the top of this
documentation: i.e. a table whose keys are slots and whose values are lists of the form
`{ form = ``form``, translit = ``manual_translit_or_nil``, footnotes = ``footnote_list_or_nil``}`.
`get_variants` is either {nil} or a function of one argument (a string, a form value). The purpose of
this function is to ensure that in a multiword term where a given slot has more than one possible variant, the final
output has only parallel variants in it. For example, feminine nouns and adjectives in Russian have two possible
endings, one typically in -ой (-oj) and the other in -ою (-oju). If we have a feminine adjective-noun combination (or
a hyphenated feminine noun-noun combination, or similar), and we don't specify `get_variants`, we'll end up with four
values for the instrumental singular: one where both adjective and noun end in -ой, one where both end in -ою, and
two where one of the words ends in -ой and the other in -ою. In general if we have N words each with K variants, we'll
end up with an explosion of N^K possibilities. `get_variants` avoids this by returning a variant code (an arbitary
string) for each variant. If two words each have a non-empty variant code, and the variant codes disagree, the
combination will be rejected. If `get_variants` is not provided, or either variant code is an empty string, or the
variant codes agree, the combination is allowed.
The recommended way to use `get_variants` is as follows:
1. During inflection in `inflect_word_spec`, add a special character or string to each of the variants generated for a
given slot when there is more than one. (As an optimization, do this only when there is more than one word being
inflected.) Special Unicode characters can be used for this purpose, e.g. U+FFF0, U+FFF1, ..., U+FFFD, which have
no meaning in Unicode.
2. Specify `get_variants` as a function that pulls out and returns the special character(s) or string included in the
variant forms.
3. When calling show_forms(), specify a `canonicalize` function that removes the variant code character(s) or string
from each form before converting to the display form.
See [[Module:hi-verb]] and [[Module:hi-common]] for an example of doing this in a generalized fashion. (Look for
add_variant_codes(), get_variants() and remove_variant_codes().)
`combine_metadata` is a function that is invoked when combining two form objects along along with in-between text and
storing into a destination form object. When this happens, if the the form value and translit in the first form object
is empty and the in-between text is likewise empty (which regularly happens when appending the form object describing
the first word in a multiword expression to empty base text), the second form object is simply shallow-copied along with
all of its metadata, and any footnotes are combined appropriately (normally the first form object is such a case won't
have footnotes). Otherwise, a new form object is constructed by combining the form values, translit and footnotes from
the two objects and in-between text, and calling `combine_metadata` to combine any other metadata. Leave this
unspecified if there is no additional metadata or if you don't want any metadata carried over. (Examples of metadata
that should generally not be carried over are glosses of individual words, sense ID's and similar word-level properties
that can't easily be combined to generate a multiword equivalent. Examples of metadata that should be carried over and
combined are qualifiers, labels and certain boolean properties such as an uncertainty flag indicating that a given form
is uncertain. For some metadata, it is more complex; for example, if both source words have the same gender or part of
speech, the destination should keep that value, but if they differ, it may be safest to leave the field blank.) This
function, if specified, is called with a single argument as follows:
```{
slot = "__string__",
dest_form = __formobj__,
form1 = __formobj__,
form2 = __formobj__,
between_text = "__string__",
between_text_no_links = "__string__",
between_text_translit = "__string__" `or` nil
}```
Here, `slot` is the slot whose forms are being constructed. `dest_form` is the destination form object into which the
combined metadata should be written, and is pre-populated with appropriate `form`, `translit` and `footnotes` fields.
`form1` and `form2` are the two source forms being combined, and `between_text` is the text to be inserted between the
two source forms. `between_text_no_links` is the same as `between_text` but with double-bracket links removed, and
`between_text_translit` is the manual transliteration of `between_text_no_links`, if specified. The function should
return nothing, but should side-effect `dest_form` as appropriate.
`include_user_specified_links`, if given, ensures that user-specified links in the raw text surrounding a given word
are preserved in the output. If omitted or set to false, such links will be removed and the whole multiword expression
will be linked.
]==]
function export.inflect_multiword_or_alternant_multiword_spec(multiword_spec, props)
multiword_spec.forms = {}
local is_alternant_multiword = not not multiword_spec.alternant_or_word_specs
for _, word_spec in ipairs(is_alternant_multiword and multiword_spec.alternant_or_word_specs or multiword_spec.word_specs) do
if word_spec.alternants then
inflect_alternants(word_spec, props)
else
props.inflect_word_spec(word_spec)
end
iterate_slot_list_or_table(props, function(slot)
if not props.skip_slot or not props.skip_slot(slot) then
append_forms(props, multiword_spec.forms, slot, word_spec.forms[slot],
(slot:find("linked") or props.include_user_specified_links) and
word_spec.before_text or word_spec.before_text_no_links,
word_spec.before_text_no_links, word_spec.before_text_translit
)
end
end)
end
if multiword_spec.post_text ~= "" then
local pseudoform = {{form=""}}
iterate_slot_list_or_table(props, function(slot)
-- If slot is empty or should be skipped, don't try to append post-text.
if (not props.skip_slot or not props.skip_slot(slot)) and multiword_spec.forms[slot] then
append_forms(props, multiword_spec.forms, slot, pseudoform,
(slot:find("linked") or props.include_user_specified_links) and
multiword_spec.post_text or multiword_spec.post_text_no_links,
multiword_spec.post_text_no_links, multiword_spec.post_text_translit
)
end
end)
end
end
function export.map_word_specs(alternant_multiword_spec, fun)
for _, alternant_or_word_spec in ipairs(alternant_multiword_spec.alternant_or_word_specs) do
if alternant_or_word_spec.alternants then
for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do
for _, word_spec in ipairs(multiword_spec.word_specs) do
fun(word_spec)
end
end
else
fun(alternant_or_word_spec)
end
end
end
function export.create_footnote_obj()
return {
notes = {},
seen_notes = {},
noteindex = 1,
seen_refs = {},
}
end
function export.get_footnote_text(footnotes, footnote_obj)
if not footnotes then
return ""
end
local link_indices = {}
local all_refs = {}
for _, footnote in ipairs(footnotes) do
local refs
footnote, refs = export.expand_footnote_or_references(footnote)
if footnote then
local this_noteindex = footnote_obj.seen_notes[footnote]
if not this_noteindex then
-- Generate a footnote index.
this_noteindex = footnote_obj.noteindex
footnote_obj.noteindex = footnote_obj.noteindex + 1
insert(footnote_obj.notes, '<sup style="color: var(--wikt-palette-red, red)">' .. this_noteindex .. '</sup>' .. footnote)
footnote_obj.seen_notes[footnote] = this_noteindex
end
insert_if_not(link_indices, this_noteindex)
end
if refs then
for _, ref in ipairs(refs) do
if not ref.name then
local this_refhash = footnote_obj.seen_refs[ref.text]
if not this_refhash then
-- Different text needs to have different auto-generated names, globally across the entire page,
-- including across different invocations of {{it-verb}} or {{it-conj}}. The easiest way to accomplish
-- this is to use a message-digest hashing function. It does not have to be cryptographically secure
-- (MD5 is insecure); it just needs to have low probability of collisions.
this_refhash = mw.hash.hashValue("md5", ref.text)
footnote_obj.seen_refs[ref.text] = this_refhash
end
ref.autoname = this_refhash
end
-- I considered using "n" as the default group rather than nothing, to more clearly distinguish regular
-- footnotes from references, but this requires referencing group "n" as <references group="n"> below,
-- which is non-obvious.
insert_if_not(all_refs, ref)
end
end
end
table.sort(link_indices)
local function sort_refs(r1, r2)
-- FIXME, we are now sorting on an arbitrary hash. Should we keep track of the order we
-- saw the autonamed references and sort on that?
if r1.autoname and r2.name then
return true
elseif r1.name and r2.autoname then
return false
elseif r1.name and r2.name then
return r1.name < r2.name
else
return r1.autoname < r2.autoname
end
end
table.sort(all_refs, sort_refs)
for i, ref in ipairs(all_refs) do
local refargs = {name = ref.name or ref.autoname, group = ref.group}
all_refs[i] = mw.getCurrentFrame():extensionTag("ref", ref.text, refargs)
end
local link_text
if #link_indices > 0 then
link_text = '<sup style="color: var(--wikt-palette-red, red)">' .. concat(link_indices, ",") .. '</sup>'
else
link_text = ""
end
local ref_text = concat(all_refs)
if link_text ~= "" and ref_text ~= "" then
return link_text .. "<sup>,</sup>" .. ref_text
else
return link_text .. ref_text
end
end
--[==[
Add links around words in a term. If multiword_only, do it only in multiword terms.
]==]
function export.add_links(form, multiword_only)
if form == "" or form == " " then
return form
end
if not form:find("%[%[") then
if ufind(form, "[%s%p]") then --optimization to avoid loading [[Module:headword]] on single-word forms
local m_headword = require("Module:headword")
if m_headword.head_is_multiword(form) then
form = m_headword.add_multiword_links(form)
end
end
if not multiword_only and not form:find("%[%[") then
form = "[[" .. form .. "]]"
end
end
return form
end
--[==[
Remove redundant link surrounding entire term.
]==]
function export.remove_redundant_links(term)
return (term:gsub("^%[%[([^%[%]|]*)%]%]$", "%1"))
end
--[==[
Add links to all before and after text; for use in inflection modules that preserve links in multiword lemmas and
include links in non-lemma forms rather than allowing the entire form to be a link. If `remember_original`, remember
the original user-specified before/after text so we can reconstruct the original spec later. `add_links` is a
function of one argument to add links to a given piece of text; if unspecified, it defaults to `export.add_links`.
]==]
function export.add_links_to_before_and_after_text(alternant_multiword_spec, remember_original, add_links)
add_links = add_links or export.add_links
local function add_links_remember_original(object, field)
if remember_original then
object["user_specified_" .. field] = object[field]
end
object[field] = add_links(object[field])
end
for _, alternant_or_word_spec in ipairs(alternant_multiword_spec.alternant_or_word_specs) do
add_links_remember_original(alternant_or_word_spec, "before_text")
if alternant_or_word_spec.alternants then
for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do
for _, word_spec in ipairs(multiword_spec.word_specs) do
add_links_remember_original(word_spec, "before_text")
end
add_links_remember_original(multiword_spec, "post_text")
end
end
end
add_links_remember_original(alternant_multiword_spec, "post_text")
end
--[==[
Reconstruct the original overall spec from the output of parse_inflected_text(), so we can use it in the
language-specific acceleration module in the implementation of {{tl|pt-verb form of}} and the like. `props` is an
optional table of properties. Currently only `preprocess_angle_bracket_spec` is recognized, and is an optional function
of one argument that is called to process an angle-bracket spec before inserting into the reconstructed spec.
]==]
function export.reconstruct_original_spec(alternant_multiword_spec, props)
local parts = {}
props = props or {}
local function ins(txt)
insert(parts, txt)
end
local function insert_angle_bracket_spec(spec)
if props.preprocess_angle_bracket_spec then
spec = props.preprocess_angle_bracket_spec(spec)
end
ins(spec)
end
for _, alternant_or_word_spec in ipairs(alternant_multiword_spec.alternant_or_word_specs) do
ins(alternant_or_word_spec.user_specified_before_text)
if alternant_or_word_spec.alternants then
ins("((")
for i, multiword_spec in ipairs(alternant_or_word_spec.alternants) do
if i > 1 then
ins(",")
end
for _, word_spec in ipairs(multiword_spec.word_specs) do
ins(word_spec.user_specified_before_text)
ins(word_spec.user_specified_lemma)
insert_angle_bracket_spec(word_spec.angle_bracket_spec)
end
ins(multiword_spec.user_specified_post_text)
end
ins("))")
else
ins(alternant_or_word_spec.user_specified_lemma)
insert_angle_bracket_spec(alternant_or_word_spec.angle_bracket_spec)
end
end
ins(alternant_multiword_spec.user_specified_post_text)
local retval = concat(parts)
if alternant_multiword_spec.allow_default_indicator then
-- As a special case, if we see e.g. "amar<>", remove the <>. Don't do this if there are spaces or alternants.
if not retval:find(" ") and not retval:find("%(%(") then
local retval_no_angle_brackets = retval:match("^(.*)<>$")
if retval_no_angle_brackets then
return retval_no_angle_brackets
end
end
end
return retval
end
--[==[
Convert the forms in ``formtable`` (a form table, whose keys are slots and whose values are lists of form objects, each
of which is a table of the form `form = ``form``, translit = ``manual_translit_or_nil``, footnotes = ``footnote_list_or_nil``, no_accel = ``true_to_suppress_accelerators``, ... `)
into strings. The form table is side-effected. Each form list turns into a string consisting of a comma-separated list
of linked forms, with accelerators (unless `no_accel` is set in a given form object). If `include_translit` is
specified, each string consists of a comma-separated list of form values (each formatted as a link), an HTML
`<br/>`, and a comma-separated list of transliterations. `props` is a table used in generating the strings, as
follows:
```{
lang = __lang_object__,
lemmas = {"``lemma``", "``lemma``", ...},
slot_list = {{"``slot``", "``accel``"}, {"``slot``", "``accel``"}, ...},
slot_table = {``slot`` = "``accel``", ``slot`` = "``accel``", ...},
include_translit = __boolean__,
create_footnote_obj = nil `or` __function__(),
canonicalize = nil or __function__(formval),
preprocess_forms = nil `or` __function__(data),
no_deduplicate_forms = __boolean__,
combine_metadata_during_dedup = nil `or` __function__(data),
transform_accel_obj = nil `or` __function__(slot, form, accel_obj),
format_forms = nil `or` __function__(data),
generate_link = nil `or` __function__(data),
format_tr = nil `or` __function__(data),
join_spans = nil `or` __function__(data),
footnotes = nil or {"``extra_footnote``", "``extra_footnote``", ...},
}```
`lemmas` is the list of lemmas, used in the accelerators.
`slot_list` is a list of two-element lists of slots and associated accelerator tag sets. ``slot`` should correspond
to slots generated during `inflect_multiword_or_alternant_multiword_spec()`. ``accel`` is the corresponding accelerator
tag set; e.g. if ``slot`` is "pres_1sg", ``accel`` might be "1|s|pres|ind". ``accel`` is used in generating entries for
accelerator support (see [[WT:ACCEL]]).
`slot_table` is a table mapping slots to associated accelerator tag sets and serves the same function as `slot_list`.
Only one of `slot_list` or `slot_table` must be given. For new code it is preferable to use `slot_list` because this
allows you to control the order of processing slots, which may occasionally be important.
`include_translit`, if given, causes transliteration to be included in the generated strings.
The function works as follows:
# Create an object to hold footnotes (customizable using `create_footnote_obj`).
# Generate the comma-separated lemma form values and store in `.lemma` in the form table.
# Loop over the slots specified using `slot_list` or `slot_table`. For each slot:
## Canonicalize the form values (customizable using `canonicalize`; by default does nothing).
## Preprocess the forms (customizable using `preprocess_forms`; by default does nothing).
## Unless `no_deduplicate_forms` is set, deduplicate forms in a slot sharing the same form value but possibly different
transliteration. (This happens e.g. in Russian, where it is relatively common for a given form to have two possible
transliterations, one reflecting a more nativized pronunciation where Cyrillic е triggers palatalization of the
preceding consonant, and one reflecting a more "foreign" pronunciation where this palatalization does not happen. In
such a case, the automatic transliteration would normally suffice for the more nativized pronunciation but the more
"foreign" pronunciation will need manual transliteration.) As part of deduplication, footnotes will be combined using
`combine_footnotes`; distinct manual transliterations will be combined into a list (meaning the `translit` field of
form objects in some subsequent `props` functions may hold a list; this will be noted when possible); and any
remaining metadata will be combined using the `combine_metadata_during_dedup` method, if provided.
## Add acceleration to all forms. The acceleration tag set associated with a given form comes from `slot_list` or
`slot_table`, i.e. all forms in a given slot have the same tag set. However, different forms will have different
associated transliterations stored into the accelerator object associated with the form, as well as possibly
different lemmas. In particular, when there are multiple lemma forms, this is often due to alternative ways to
pronounce the lemma (e.g. alternative stress positions or vowel lengths), and there are often associated non-lemma
forms that match each lemma. An example given in the introduction is {{m+|uk|русин||Rusyn}}, stressed in the lemma
as ''ру́син'' or ''руси́н'' with associated genitive singulars ''ру́сина'' and ''русина́''. We would like the
auto-generated accelerator entry for {{m|uk|русина}} to show the variant ''ру́сина'' as having lemma ''ру́син'' and
the variant ''русина́'' as having the lemma ''руси́н'', rather than showing both variants as having both lemmas,
which is less accurate. As a result, the code that generates acceleration objects for forms matches up forms and
lemmas one-to-one if possible. If this is not possible, the matching is usually one lemma to many forms, as in
{{m+|uk|міст||bridge}} with genitive singular ''мо́сту'' or ''моста́'' (in which case all forms get the same lemma), or
many lemmas to one form, as in {{m+|uk|черга||turn, queue}} stressed either ''че́рга'' or ''черга́'' with nominative
singular only ''че́рги'' (in which case the single form gets assicated all lemmas). If there are multiple lemmas and
multiple forms, the algorithm attempts to align them as evenly as possible (e.g. two lemma variants to four forms
means the first two forms get assigned the first lemma variant and the last two forms get assigned the second lemma
variant); this is often going to be incorrect, but (a) there's unlikely to be a single algorithm that works in all
such circumstances, and (b) these cases are very rare. Finally, note the following:
##* No acceleration is assigned to a form if any of the following apply: (a) there are no lemmas given in
`props.lemmas`; (b) the `no_accel` key in the form object has a non-falsy value; (c) the form value of the form is
{"?"} or an em-dash ({"—"}); (d) the accelerator tag set is given as a hyphen {"-"}); or (e) the form value contains
an internal link.
##* The accelerator code sets the `formval_for_link` key in each form object to the version of the form value that
should be passed to `full_link()` in [[Module:links]]. This is usually the same as the passed-in form value, but
differs when the entire form value is surrounded with a redundant internal link (which is removed).
##* The resulting accelerator object can be modified (or replaced entirely) by the `transform_accel_obj` function. This
is used, for example, in [[Module:es-verb]], [[Module:pt-verb]] and other Romance-language verb conjugation modules
(likewise [[Module:ar-verb]]) to replace the tag set with the original verb spec used to generate the verb, so that
the accelerator code can generate the appropriate call to {{tl|es-verb form of}}, {{tl|pt-verb form of}} or the
like, which computes the inflections, instead of directly listing the inflections.
## Format the forms into strings. The entire default process can be replaced using `format_forms`; otherwise the default
algorithm works as follows:
### Generate the '''form value spans''', with one entry (a linked HTML-ized version of the form value) per form. This
can be customized using `generate_link`. (Various modules do this. For example, the Arabic verb module includes
qualifiers, labels, ID's and the like that can be specified by the user; the Portuguese and reintegrated Galician
verb modules italicize certain superseded or otherwise less-desirable forms instead of linking them normally; the
German verb module adds {{m|de|dass}} to subjunctive forms and optional pronouns to imperative forms; and the German
adjective module adds articles to adjective forms normally accompanied by articles and the equivalent of "he/she is"
etc. to predicate forms.) The default uses `full_link()` in [[Module:links]] (with transliteration generation
disabled) concatenated with the appropriate footnote symbol(s) (if any).
### Generate the '''transliteration spans''', with one entry per distinct translit, auto-generated if manual translit
isn't available. Note that, due to the earlier form value deduplication step, there may be multiple translits per
form object. These translits are themselves deduplicated to get the list of spans. (Such duplication can happen, for
example, in Arabic with terms containing a glottal stop in them; there may be multiple ways of spelling the glottal
stop or ''hamza'' in Arabic, but only one way of transliterating it.) Each span consists of an object specifying
the translit and the list of footnotes. These objects are then converted to formatted strings, either using
`format_tr` if supplied or else calling `tag_translit()` in [[Module:script utilities]] and concatenating the
appropriate footnote symbol(s) (if any).
### Combine the form value and transliteration spans. If `join_spans` is supplied, use it; otherwise, concatenate the
form value spans (comma-separated) and (if available) transliteration spans (comma-separated), and (if appropriate)
combine them using {<br />}.
`create_footnote_obj` is an optional function of no arguments to create the footnote object used to track footnotes;
see `create_footnote_obj()`. Customizing it is useful to prepopulate the footnote table using `get_footnote_text()`.
`canonicalize` is an optional function of one argument (a form value) to canonicalize each form before processing; it
can return nil for no change. The most common purpose of this function is to remove variant codes from the form value.
See the documentation for `inflect_multiword_or_alternant_multiword_spec()` for a description of variant codes and their
purpose.
`preprocess_forms` is an optional function of one argument (a table of properties) to preprocess the form objects as
a whole. It runs after `canonicalize` (meaning that the form values passed in are canonicalized) and before
deduplication and the addition of acceleration info. The property table passed in has the following properties:
* `slot`: The slot being processed.
* `forms`: The list of form objects for this slot.
* `accel_tag_set`: The accelerator tag set for this slot, taken from `slot_list` or `slot_table`.
* `footnote_obj`: The footnote object returned by the `create_footnote_obj` property or the default
`create_footnote_obj()` function.
`preprocess_forms` should return a list of preprocessed form objects, or {nil} to use the passed-in `forms`. If this
function does deduplication, you should set `no_deduplicate_forms` to disable the default deduplication process.
`no_deduplicate_forms`, if set, disables the deduplication step (see above).
`combine_metadata_during_dedup` is an optional function of one argument (a table of properties) to combine the metadata
of deduplicated form objects. The property table passed in has the following properties:
* `slot`: The slot being processed.
* `existing_form`: The existing form object into which a duplicated form is being combined.
* `dup_form`: The duplicated form being combined into `existing_form`.
* `existing_form_pos`: The one-based position of the existing form in the deduplicated form list (not necessarily its
original position).
* `dup_form_pos`: The one-based position of the duplicated form in its original list.
The following should be noted about the form objects passed in:
# The form values in `.form` have been canonicalized using `.canonicalize`, if provided.
# The form values in `existing_form` and `dup_form` are always the same.
# The footnotes in `existing_form` have already been combined with those in `dup_form`.
# If there was manual translit either in `existing_form` (prior to deduplication) or in `dup_form`, there will be
manual translit in `existing_form.translit` that is a list and combines any previous accumulated translits in
`existing_form` as well as the translit in `dup_form` (even if one of them was specified as {nil} indicating an
automatic translit). This means that the translit in `existing_form.translit` is always either {nil} or a list of
strings (and the same applies to `dup_form.translit`).
`transform_accel_obj` is an optional function of three arguments (``slot``, ``formobj``, ``accel_obj``) to transform the
default constructed accelerator object in ``accel_obj`` into an object that should be passed to `full_link()` in
[[Module:links]]. It should return the new accelerator object, or {nil} for no acceleration. (If {nil} is returned,
the corresponding form has no acceleration; this is unlike most customization functions, where returning {nil} causes
the default algorithm to be invoked.) The function can destructively modify the accelerator object passed in.
'''NOTE''': This is called even when the passed-in ``accel_obj`` is {nil} (see the (a) through (e) reasons above why no
acceleration may be assigned to a form). Thus, your code needs to do something sensible in this case. The description
above of how `show_forms()` works inclues various examples of modules that supply a `transform_accel_obj` function and
the reasons for doing so.
`format_forms`, if supplied, is a function that entirely replaces the formatting portion of `show_forms()`. An example
of why you might want to do this is to get a different layout than the default, e.g. one where translit is displayed
next to each form value instead of the form values and translits grouped and displayed on separate lines. Under normal
circumstances, you should not do this, but instead customize the functions that replace specific parts of the default
formatting algorithm (see below). This function is passed one argument (a table of properties) and should return a
string (the formatted forms, ready to store into the slot in the form table) or {nil} to proceed with the default
algorithm (see above). The property table passed in has the following properties:
* `slot`: The slot being processed.
* `forms`: The list of form objects, deduplicated and with accelerator info added.
* `footnote_obj`: The footnote object returned by the `create_footnote_obj` property or the default
`create_footnote_obj()` function.
The following should be noted about the form objects in `forms`:
# There are extra fields `formval_for_link` and `accel_obj`. The first one is as described above under the paragraph
beginning "Add acceleration to all forms" under "The function works as follows". The second one is the accelerator
object in the format expected by [[Module:links]].
# The `translit` field, if non-{nil}, is a list of transliterations rather than a single transliteration; this is due to
the form value deduplication step.
`generate_link` is an optional function to generate the link text for a given form value. It is passed a single argument
(a table of properties) and should return a string, the formatted link. If it returns {nil}, the default algorithm (see
above) is invoked. The property table passed in has the following properties:
* `slot`: The slot being processed.
* `form`: The form to be converted to a formatted link. As with the `format_forms` function described above, the form
objects passed in contain extra fields `formval_for_link` and `accel_obj` (both of which will normally be used), and
the `translit` field, if non-{nil}, is a list.
* `pos`: The one-based position of the form being processed, in the list of form value spans. Rarely used.
* `footnote_obj`: The footnote object returned by the `create_footnote_obj` property or the default
`create_footnote_obj()` function. Normally used in order to get the footnote symbol associated with any footnotes in
`footnotes`.
The description above of how `show_forms()` works inclues various examples of modules that supply a `generate_link`
function and the reasons for doing so.
`format_tr` is an optional function to generate the formatted text for a given transliteration. It is passed a single
argument (a table of properties) and should return a string, the formatted transliteration text. If it returns {nil},
the default algorithm (see above) is invoked. The property table passed in has the following properties:
* `slot`: The slot being processed.
* `tr_for_tag`: The transliteration to process.
* `pos`: The one-based position of the transliteration being processed, in the list of transliteration spans. Rarely
used.
* `footnotes`: The list of footnotes associated with all form objects with this transliteration. (If there were multiple
form objects with the same transliteration, the list of footnotes will have been generated using
`combine_footnotes()`.)
* `footnote_obj`: The footnote object returned by the `create_footnote_obj` property or the default
`create_footnote_obj()` function. Normally used in order to get the footnote symbol associated with any footnotes in
`footnotes`.
`join_spans` is an optional function to join the processed form value and transliteration spans into a formatted string.
It is passed a single argument (a table of properties) and should return the final string to store into the form table
slot. If it returns {nil}, the default algorithm (see above) is invoked. The property table passed in has the following
properties:
* `slot`: The slot being processed.
* `formval_spans`: A list of strings, the formatted form value spans.
* `tr_spans`: A list of strings, the formatted transliteration spans. If there is no transliteration, this will be an
empty list.
A custom `join_spans` is provided by [[Module:de-verb]], which concatenates the form value spans vertically (using
{"<br />"}) instead of horizontally using a comma, as is normal; this is because there is no translit and the form
values are often long, containing extra words attached during `generate_link()`. The only exception is the `aux` slot
holding the auxiliaries, which is concatenated horizontally using {" or "}. [[Module:de-adjective]] similarly provides
a custom `join_spans` function that concatenates the form value spans vertically.
]==]
function export.show_forms(formtable, props)
local footnote_obj = props.create_footnote_obj and props.create_footnote_obj() or export.create_footnote_obj()
local function fetch_formval_and_translit(entry, remove_links)
local formval, translit
if type(entry) == "table" then
formval, translit = entry.form, entry.translit
else
formval = entry
end
if remove_links then
formval = m_links.remove_links(formval)
end
return formval, translit
end
local lemma_formvals = {}
for _, lemma in ipairs(props.lemmas) do
local lemma_formval, _ = fetch_formval_and_translit(lemma)
insert_if_not(lemma_formvals, lemma_formval)
end
formtable.lemma = #lemma_formvals > 0 and concat(lemma_formvals, ", ") or
mw.loadData(headword_data_module).pagename
-- For safety, since we in-place modify `lemmas` usually before processing a given slot, make a copy.
local props_lemmas = shallow_copy(props.lemmas)
for i, lemma in ipairs(props_lemmas) do
props_lemmas[i] = shallow_copy(lemma)
end
local function do_slot(slot, accel_tag_set)
local formobjs = formtable[slot]
if formobjs then
if type(formobjs) ~= "table" then
error("Internal error: For slot '" .. slot .. "', expected table but saw " .. dump(formobjs))
end
-- Maybe canonicalize the form values (e.g. remove variant codes and monosyllabic accents).
if props.canonicalize then
for _, form in ipairs(formobjs) do
form.form = props.canonicalize(form.form) or form.form
end
end
-- Preprocess the forms as a whole if called for.
if props.preprocess_forms then
formobjs = props.preprocess_forms {
slot = slot,
forms = formobjs,
accel_tag_set = accel_tag_set,
footnote_obj = footnote_obj,
} or formobjs
end
-- Maybe deduplicate form values (happens e.g. in Russian with two terms with the same Russian form but
-- different translits).
if not props.no_deduplicate_forms then
local deduped_formobjs = {}
for i, form in ipairs(formobjs) do
local function combine_forms(existing_form, dup_form, pos)
assert(existing_form.form == dup_form.form)
-- Combine footnotes.
existing_form.footnotes = export.combine_footnotes(existing_form.footnotes, dup_form.footnotes)
-- If translit is being generated, and there's manual translit associated with either form, we
-- need to generate any missing translits and combine them, taking into account the fact that a
-- translit value may actually be a list of translits (particularly with the existing form if we
-- already combined an item with manual translit into it).
if props.include_translit and form_value_transliterable(existing_form.form) and (
existing_form.translit or dup_form.translit) then
local combined_translit
if not existing_form.translit then
combined_translit = {
props_transliterate(props, m_links.remove_links(existing_form.form))
}
elseif type(existing_form.translit) == "string" then
combined_translit = {existing_form.translit}
else
combined_translit = existing_form.translit
end
local dup_form_translit = dup_form.translit
if not dup_form_translit then
-- dup_form.form is the same as existing_form.form (see assert above), but this is
-- defensive programming in case that changes
dup_form_translit = {props_transliterate(props, m_links.remove_links(dup_form.form))}
elseif type(dup_form_translit) == "string" then
dup_form_translit = {dup_form_translit}
end
for _, translit in ipairs(dup_form_translit) do
insert_if_not(combined_translit, translit)
end
existing_form.translit = combined_translit
end
if props.combine_metadata_during_dedup then
props.combine_metadata_during_dedup {
slot = slot,
existing_form = existing_form,
existing_form_pos = pos,
dup_form = dup_form,
dup_form_pos = i,
}
end
end
insert_if_not(deduped_formobjs, form, {
key = function(formobj) return formobj.form end,
combine = combine_forms,
})
end
formobjs = deduped_formobjs
end
-- Add acceleration info to form objects.
for i, form in ipairs(formobjs) do
local formval = form.form
if not form_value_transliterable(formval) then
form.formval_for_link = formval
else
local formval_for_link
formval_for_link = formval
-- remove redundant link surrounding entire form
formval_for_link = export.remove_redundant_links(formval_for_link)
form.formval_for_link = formval_for_link
-------------------- Compute the accelerator object. -----------------
local accel_obj
-- Check if form still has links; if so, don't add accelerators because the resulting entries will
-- be wrong.
if props_lemmas[1] and not form.no_accel and accel_tag_set ~= "-" and
not formval_for_link:find("%[%[") then
-- If there is more than one form or more than one lemma, things get tricky. Often, there are
-- the same number of forms as lemmas, e.g. for Ukrainian [[зимовий]] "wintry; winter (rel.)",
-- which can be stressed зимо́вий or зимови́й with corresponding masculine/neuter genitive
-- singulars зимо́вого or зимово́го etc. In this case, usually the forms and lemmas match up so
-- we do this. If there are different numbers of forms than lemmas, it's usually one lemma
-- against several forms e.g. Ukrainian [[міст]] "bridge" with genitive singular мо́сту or моста́
-- (accent patterns b or c) or [[ложка|ло́жка]] "spoon" with nominative plural ло́жки or ложки́
-- (accent patterns a or c). Here, we should assign the same lemma to both forms. The opposite
-- can happen, e.g. [[черга]] "turn, queue" stressed че́рга or черга́ with nominative plural only
-- че́рги (accent patterns a or d). Here we should assign both lemmas to the same form. In more
-- complicated cases, with more than one lemma and form and different numbers of each, we try
-- to align them as much as possible, e.g. if there are somehow eight forms and three lemmas,
-- we assign lemma 1 to forms 1-3, lemma 2 to forms 4-6 and lemma 3 to forms 7 and 8, and
-- conversely if there are somehow three forms and eight lemmas. This is likely to be wrong, but
-- (a) there's unlikely to be a single algorithm that works in all such circumstances, and (b)
-- these cases are vanishingly rare or nonexistent. Properly we should try to remember which
-- form was generated by which lemma, but that is significant extra work for little gain.
local first_lemma, last_lemma
if #formobjs >= #props_lemmas then
-- More forms than lemmas. Try to even out the forms assigned per lemma.
local forms_per_lemma = math.ceil(#formobjs / #props_lemmas)
first_lemma = math.floor((i - 1) / forms_per_lemma) + 1
last_lemma = first_lemma
else
-- More lemmas than forms. Try to even out the lemmas assigned per form.
local lemmas_per_form = math.ceil(#props_lemmas / #formobjs)
first_lemma = (i - 1) * lemmas_per_form + 1
last_lemma = math.min(first_lemma + lemmas_per_form - 1, #props_lemmas)
end
local accel_lemma, accel_lemma_translit
if first_lemma == last_lemma then
accel_lemma, accel_lemma_translit =
fetch_formval_and_translit(props_lemmas[first_lemma], "remove links")
else
accel_lemma = {}
accel_lemma_translit = {}
for j=first_lemma, last_lemma do
local this_accel_lemma, this_accel_lemma_translit =
fetch_formval_and_translit(props_lemmas[j], "remove links")
-- Do not use insert() especially for the translit because it may be nil and in
-- that case we want gaps in the array.
accel_lemma[j - first_lemma + 1] = this_accel_lemma
accel_lemma_translit[j - first_lemma + 1] = this_accel_lemma_translit
end
end
local accel_translit
if props.include_translit and form.translit then
if type(form.translit) == "table" then
accel_translit = concat(form.translit, ", ")
elseif type(form.translit) == "string" then
accel_translit = form.translit
else
error(("Internal error: For slot '%s', form translit is not a table or string: %s"):
format(slot, dump(form.translit)))
end
end
accel_obj = {
form = accel_tag_set,
translit = accel_translit,
lemma = accel_lemma,
lemma_translit = props.include_translit and accel_lemma_translit or nil,
}
end
-- Postprocess if requested.
if props.transform_accel_obj then
accel_obj = props.transform_accel_obj(slot, form, accel_obj)
end
form.accel_obj = accel_obj
end
end
-- Format the form objects into a string for insertion into the table.
local formatted_forms
if props.format_forms then
formatted_forms = props.format_forms {
slot = slot,
forms = formobjs,
footnote_obj = footnote_obj,
}
end
if not formatted_forms then
-- Default algorithm: Separate form values and translits and concatenate on separate lines.
-- Form values have already been deduplicated but we may need to deduplicate translits (this happens
-- e.g. in Arabic where there may be multiple ways of spelling a hamza in the Arabic script but only
-- one way in transliteration).
local formval_spans = {}
local tr_spans = {}
for i, form in ipairs(formobjs) do
local link
if props.generate_link then
link = props.generate_link {
slot = slot,
pos = i,
form = form,
footnote_obj = footnote_obj,
}
end
if not link then
link = m_links.full_link {
lang = props.lang, term = form.formval_for_link, tr = "-", accel = form.accel_obj
} .. export.get_footnote_text(form.footnotes, footnote_obj)
end
formval_spans[i] = link
if props.include_translit then
local translits = form.translit or props_transliterate(props, m_links.remove_links(form.form))
if type(translits) == "string" then
translits = {translits}
end
for _, tr in ipairs(translits) do
local tr_for_tag = tr -- formerly may have differed due to old-style footnote symbols
insert_if_not(tr_spans, {
tr_for_tag = tr_for_tag,
footnotes = form.footnotes,
}, {
key = function(trobj) return trobj.tr_for_tag end,
combine = function(trobj, newtrobj)
-- Combine footnotes.
trobj.footnotes = export.combine_footnotes(trobj.footnotes, newtrobj.footnotes)
end,
})
end
end
end
for i, tr_span in ipairs(tr_spans) do
local formatted_tr
if props.format_tr then
formatted_tr = props.format_tr {
slot = slot,
pos = i,
tr_for_tag = tr_span.tr_for_tag,
footnotes = tr_span.footnotes,
footnote_obj = footnote_obj,
}
end
if not formatted_tr then
formatted_tr = require(script_utilities_module).tag_translit(tr_span.tr_for_tag, props.lang,
"default", " style=\"color: var(--wikt-palette-grey-8,#888);\"") ..
export.get_footnote_text(tr_span.footnotes, footnote_obj)
end
tr_spans[i] = formatted_tr
end
if props.join_spans then
formatted_forms = props.join_spans {
slot = slot,
formval_spans = formval_spans,
tr_spans = tr_spans,
}
end
if not formatted_forms then
local formval_span = concat(formval_spans, ", ")
local tr_span
if #tr_spans > 0 then
tr_span = concat(tr_spans, ", ")
end
if tr_span then
formatted_forms = formval_span .. "<br />" .. tr_span
else
formatted_forms = formval_span
end
end
end
formtable[slot] = formatted_forms
else
formtable[slot] = "—"
end
end
iterate_slot_list_or_table(props, do_slot)
formtable.footnote = concat(footnote_obj.notes, "<br />")
end
--[==[
Find the inflection spec for a given lemma by scraping the contents of the section for the lemma's language, looking
for the appropriate inflection template (which may in some cases be a headword template with inflections specified in
the headword, as for {{tl|en-verb}}). An inflection ID can be given; in that case, the value of the appropriate ID param
(usually `id=`) must match the specified ID; otherwise, any inflection template call of the right name will work. If
anything goes wrong in the process, a string is returned describing the error message; otherwise an object is returned,
where `template` is the template found (an object of the form returned by `find_templates` in
[[Module:template parser]]).
There is one param, an object with the following fields:
* `lemma`: The page to scrape for inflection calls.
* `langname`: The name of the language of the lemma (e.g. {"English"} or {"Icelandic"}). Only that section is scraped.
* `infltemp`: A string specifying the name of the template containing the inflections, or a function of one argument,
the template object (an object of the form returned by `find_templates` in [[Module:template parser]]), which should
return true if the given object specifies an appropriate inflection template.
* `idparam`: The name of the parameter holding the inflection ID used to disambiguate lemmas with multiple inflections.
* `inflid`: The inflection ID that must match the value of the `idparam` parameter specified by the inflection template.
If not specified, there must be exactly one matching inflection template present, and it must not have a value given
for the `idparam` parameter. Otherwise, all matching inflection templates must have a value specified for the
`idparam` parameter of the template, and there must be exactly one template whose `idparam` parameter value is the
same as the value of `inflid`.
Find the inflection spec by scraping the contents of the Icelandic section of `lemma`, looking for `infltemp` calls
(where template is e.g. "is-ndecl", "is-adecl" or "is-conj") If `inflid` is given, it must match the value of the
|id= param specified to the inflection template; otherwise, any inflection template call will work. If anything goes
wrong in the process, a string is returned describing the error message; otherwise a table of inflections is
returned, each containing a field `infl` with the inflection spec. The inflection spec comes from the |deriv=,
|deriv2=, etc. params in the inflection template if specified and `is_deriv` is given; otherwise from 1=, 2=, etc.
If `allow_empty_infl` is given, a missing inflection spec in 1= is allowed and converted to an empty string;
otherwise, an error is signaled.
]==]
function export.scrape_inflection(data)
local langname, lemma, infltemp, inflid, idparam =
data.langname, data.lemma, data.infltemp, data.inflid, data.idparam
local lang_lemma = ("%s base lemma '[[%s]]'"):format(langname, lemma)
local title = new_title(lemma)
if title then
local content = title:getContent()
if content then
local langtext = require(pages_module).get_section(content, langname)
if langtext then
local inflobjs_by_id = {}
local inflobjs_without_id = {}
local ordered_seen_ids = {}
for template in require(template_parser_module).find_templates(langtext) do
local matches
if type(infltemp) == "string" then
matches = template:get_name() == infltemp
else
matches = infltemp(template)
end
if matches then
local inflobj = {template = template}
local args = template:get_arguments()
local tid = args[idparam]
if tid then
if inflobjs_by_id[tid] then
return ("For %s base lemma '[[%s]]', saw id='%s' twice"):format(
langname, lemma, tid
)
end
inflobjs_by_id[tid] = inflobj
insert_if_not(ordered_seen_ids, tid)
else
insert(inflobjs_without_id, inflobj)
end
end
end
local function concat_ordered_seen_ids()
local quoted_seen_ids = {}
for _, seen_id in ipairs(ordered_seen_ids) do
insert(quoted_seen_ids, "'" .. seen_id .. "'")
end
return m_table.serialCommaJoin(quoted_seen_ids, {dontTag = true})
end
local formatted_template = type(infltemp) == "string" and ("[[Template:%s]]"):format(infltemp) or
"inflection template"
local formatted_template_sing_article = type(infltemp) == "string" and
("[[Template:%s]]"):format(infltemp) or "an inflection template"
local formatted_template_plural = type(infltemp) == "string" and "'s" or "s"
if ordered_seen_ids[1] and inflobjs_without_id[1] then
return ("For %s, saw %s %s%s with id=%s as well as %s %s%s without ID; this is not allowed; " ..
"with multiple %s calls, all must have id= params"):format(lang_lemma, #ordered_seen_ids,
formatted_template, ordered_seen_ids[2] and formatted_template_plural or "",
concat_ordered_seen_ids(), #inflobjs_without_id, formatted_template,
inflobjs_without_id[2] and formatted_template_plural or "", formatted_template)
elseif not ordered_seen_ids[1] and not inflobjs_without_id[1] then
return ("For %s, found %s section but couldn't find any calls to %s"):format(
lang_lemma, langname, formatted_template_sing_article)
elseif #inflobjs_without_id > 1 then
return ("For %s, found %s %s%s without ID's; this is not allowed; with multiple %s calls, " ..
"all must have id= params"):format(lang_lemma, #inflobjs_without_id, formatted_template,
formatted_template_plural, formatted_template)
elseif inflid then
if inflobjs_by_id[inflid] then
return inflobjs_by_id[inflid]
elseif ordered_seen_ids[1] then
return ("For %s, found %s section but couldn't find any inflections matching ID '%s'; " ..
"instead found ID's %s; you may have misspelled the ID"):format(lang_lemma, langname,
inflid, concat_ordered_seen_ids())
else
return ("For %s, found %s section with a single %s without ID, but ID requirement '%s' " ..
"specified; consider removing the ID requirement"):format(lang_lemma, langname,
formatted_template, inflid)
end
elseif inflobjs_without_id[1] then
-- only one infl template, and it doesn't have an id=; return it
return inflobjs_without_id[1]
elseif ordered_seen_ids[2] then
return ("For %s, saw %s %s%s with id=%s but with a request to return the inflection without " ..
"ID; consider adding an ID restriction to the scrape request, e.g. '@@:%s' for " ..
"self-scraping or '@%s:%s' for scraping from another page"):format(lang_lemma,
#ordered_seen_ids, formatted_template, formatted_template_plural, concat_ordered_seen_ids(),
ordered_seen_ids[1], usub(lemma, 1, 1), ordered_seen_ids[1])
else
return ("For %s, found %s section with a single %s with id=%s, but the scrape request didn't " ..
"specify an ID; consider removing the id= param from the %s call unless you expect to add " ..
"more such calls to the page in the future (in which case add the ID to the scrape request, " ..
"e.g. '@@:%s' for self-scraping or '@%s:%s' for scraping from another page"):format(lang_lemma,
langname, formatted_template, concat_ordered_seen_ids(), formatted_template,
ordered_seen_ids[1], usub(lemma, 1, 1), ordered_seen_ids[1])
end
else
return ("For %s, page exists but has no %s section"):format(lang_lemma, langname)
end
else
return ("For %s, couldn't fetch contents for page; page may not exist"):format(lang_lemma)
end
else
return ("Bad %s; couldn't create title object"):format(lang_lemma)
end
end
return export
nv8di3n6mnnnmvmo7fjstb2viyp4j22
คุยกับผู้ใช้:PhantomFunds
3
2359067
5770973
2026-09-30T00:19:53Z
New user message
2698
เพิ่ม[[Template:Welcome|สารต้อนรับ]]ในหน้าคุยของผู้ใช้ใหม่
5770973
wikitext
text/x-wiki
{{Template:Welcome|name=PhantomFunds}}
-- [[ผู้ใช้:New user message|New user message]] ([[คุยกับผู้ใช้:New user message|คุย]]) 07:19, 30 กันยายน 2569 (+07)
aavq41vd7wjorpb26ttul9lm70pztt9